annotate dtsdec.c @ 2497:69adfbbdcdeb libavcodec

- samples from mplayer ftp in the "adv" profile seem to have profile=2, which isn't the advanced one; and indeed, using adv. profile parser fails. Using normal parser works, and that's what is done - attempt at taking care of stride for NORM2 bitplane decoding - duplication of much code from msmpeg4.c; this code isn't yet used, but goes down as far as the block layer (mainly Transform Type stuff, the remains are wild editing without checking). Unusable yet, and lacks the AC decoding (but a step further in bitstream parsing) patch by anonymous
author michael
date Fri, 04 Feb 2005 02:20:38 +0000
parents ef568cc0972c
children ef2149182f1c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2123
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
1 /*
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
2 * dtsdec.c : free DTS Coherent Acoustics stream decoder.
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
3 * Copyright (C) 2004 Benjamin Zores <ben@geexbox.org>
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
4 *
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
5 * This file is part of libavcodec.
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
6 *
2126
181cb6785f6b remove dts_internal.h
michael
parents: 2123
diff changeset
7 * This library is free software; you can redistribute it and/or modify
181cb6785f6b remove dts_internal.h
michael
parents: 2123
diff changeset
8 * it under the terms of the GNU General Public License as published by
181cb6785f6b remove dts_internal.h
michael
parents: 2123
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or
181cb6785f6b remove dts_internal.h
michael
parents: 2123
diff changeset
10 * (at your option) any later version.
181cb6785f6b remove dts_internal.h
michael
parents: 2123
diff changeset
11 *
2123
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
12 * This library is distributed in the hope that it will be useful,
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2126
181cb6785f6b remove dts_internal.h
michael
parents: 2123
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
181cb6785f6b remove dts_internal.h
michael
parents: 2123
diff changeset
15 * GNU General Public License for more details.
181cb6785f6b remove dts_internal.h
michael
parents: 2123
diff changeset
16 *
181cb6785f6b remove dts_internal.h
michael
parents: 2123
diff changeset
17 * You should have received a copy of the GNU General Public License
181cb6785f6b remove dts_internal.h
michael
parents: 2123
diff changeset
18 * along with this program; if not, write to the Free Software
181cb6785f6b remove dts_internal.h
michael
parents: 2123
diff changeset
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
2123
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
20 */
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
21
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
22 #ifdef HAVE_AV_CONFIG_H
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
23 #undef HAVE_AV_CONFIG_H
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
24 #endif
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
25
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
26 #include "avcodec.h"
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
27 #include <dts.h>
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
28
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
29 #include <stdlib.h>
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
30 #include <string.h>
2186
be0ad4f3e8ea bsd patch by (Bohdan Horst <nexus at irc dot pl>)
michael
parents: 2141
diff changeset
31
be0ad4f3e8ea bsd patch by (Bohdan Horst <nexus at irc dot pl>)
michael
parents: 2141
diff changeset
32 #ifdef HAVE_MALLOC_H
2123
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
33 #include <malloc.h>
2186
be0ad4f3e8ea bsd patch by (Bohdan Horst <nexus at irc dot pl>)
michael
parents: 2141
diff changeset
34 #endif
2123
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
35
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
36 #define INBUF_SIZE 4096
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
37 #define BUFFER_SIZE 4096
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
38 #define HEADER_SIZE 14
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
39
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
40 #ifdef LIBDTS_FIXED
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
41 #define CONVERT_LEVEL (1 << 26)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
42 #define CONVERT_BIAS 0
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
43 #else
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
44 #define CONVERT_LEVEL 1
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
45 #define CONVERT_BIAS 384
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
46 #endif
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
47
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
48 static inline
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
49 int16_t convert (int32_t i)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
50 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
51 #ifdef LIBDTS_FIXED
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
52 i >>= 15;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
53 #else
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
54 i -= 0x43c00000;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
55 #endif
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
56 return (i > 32767) ? 32767 : ((i < -32768) ? -32768 : i);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
57 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
58
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
59 void
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
60 convert2s16_2 (sample_t * _f, int16_t * s16)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
61 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
62 int i;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
63 int32_t * f = (int32_t *) _f;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
64
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
65 for (i = 0; i < 256; i++)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
66 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
67 s16[2*i] = convert (f[i]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
68 s16[2*i+1] = convert (f[i+256]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
69 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
70 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
71
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
72 void
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
73 convert2s16_4 (sample_t * _f, int16_t * s16)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
74 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
75 int i;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
76 int32_t * f = (int32_t *) _f;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
77
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
78 for (i = 0; i < 256; i++)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
79 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
80 s16[4*i] = convert (f[i]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
81 s16[4*i+1] = convert (f[i+256]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
82 s16[4*i+2] = convert (f[i+512]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
83 s16[4*i+3] = convert (f[i+768]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
84 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
85 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
86
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
87 void
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
88 convert2s16_5 (sample_t * _f, int16_t * s16)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
89 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
90 int i;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
91 int32_t * f = (int32_t *) _f;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
92
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
93 for (i = 0; i < 256; i++)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
94 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
95 s16[5*i] = convert (f[i]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
96 s16[5*i+1] = convert (f[i+256]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
97 s16[5*i+2] = convert (f[i+512]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
98 s16[5*i+3] = convert (f[i+768]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
99 s16[5*i+4] = convert (f[i+1024]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
100 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
101 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
102
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
103 static void
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
104 convert2s16_multi (sample_t * _f, int16_t * s16, int flags)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
105 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
106 int i;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
107 int32_t * f = (int32_t *) _f;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
108
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
109 switch (flags)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
110 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
111 case DTS_MONO:
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
112 for (i = 0; i < 256; i++)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
113 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
114 s16[5*i] = s16[5*i+1] = s16[5*i+2] = s16[5*i+3] = 0;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
115 s16[5*i+4] = convert (f[i]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
116 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
117 break;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
118 case DTS_CHANNEL:
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
119 case DTS_STEREO:
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
120 case DTS_DOLBY:
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
121 convert2s16_2 (_f, s16);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
122 break;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
123 case DTS_3F:
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
124 for (i = 0; i < 256; i++)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
125 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
126 s16[5*i] = convert (f[i]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
127 s16[5*i+1] = convert (f[i+512]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
128 s16[5*i+2] = s16[5*i+3] = 0;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
129 s16[5*i+4] = convert (f[i+256]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
130 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
131 break;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
132 case DTS_2F2R:
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
133 convert2s16_4 (_f, s16);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
134 break;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
135 case DTS_3F2R:
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
136 convert2s16_5 (_f, s16);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
137 break;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
138 case DTS_MONO | DTS_LFE:
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
139 for (i = 0; i < 256; i++)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
140 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
141 s16[6*i] = s16[6*i+1] = s16[6*i+2] = s16[6*i+3] = 0;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
142 s16[6*i+4] = convert (f[i+256]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
143 s16[6*i+5] = convert (f[i]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
144 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
145 break;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
146 case DTS_CHANNEL | DTS_LFE:
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
147 case DTS_STEREO | DTS_LFE:
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
148 case DTS_DOLBY | DTS_LFE:
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
149 for (i = 0; i < 256; i++)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
150 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
151 s16[6*i] = convert (f[i+256]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
152 s16[6*i+1] = convert (f[i+512]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
153 s16[6*i+2] = s16[6*i+3] = s16[6*i+4] = 0;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
154 s16[6*i+5] = convert (f[i]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
155 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
156 break;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
157 case DTS_3F | DTS_LFE:
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
158 for (i = 0; i < 256; i++)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
159 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
160 s16[6*i] = convert (f[i+256]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
161 s16[6*i+1] = convert (f[i+768]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
162 s16[6*i+2] = s16[6*i+3] = 0;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
163 s16[6*i+4] = convert (f[i+512]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
164 s16[6*i+5] = convert (f[i]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
165 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
166 break;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
167 case DTS_2F2R | DTS_LFE:
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
168 for (i = 0; i < 256; i++)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
169 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
170 s16[6*i] = convert (f[i+256]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
171 s16[6*i+1] = convert (f[i+512]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
172 s16[6*i+2] = convert (f[i+768]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
173 s16[6*i+3] = convert (f[i+1024]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
174 s16[6*i+4] = 0;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
175 s16[6*i+5] = convert (f[i]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
176 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
177 break;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
178 case DTS_3F2R | DTS_LFE:
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
179 for (i = 0; i < 256; i++)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
180 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
181 s16[6*i] = convert (f[i+256]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
182 s16[6*i+1] = convert (f[i+768]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
183 s16[6*i+2] = convert (f[i+1024]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
184 s16[6*i+3] = convert (f[i+1280]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
185 s16[6*i+4] = convert (f[i+512]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
186 s16[6*i+5] = convert (f[i]);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
187 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
188 break;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
189 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
190 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
191
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
192 static int
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
193 channels_multi (int flags)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
194 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
195 if (flags & DTS_LFE)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
196 return 6;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
197 else if (flags & 1) /* center channel */
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
198 return 5;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
199 else if ((flags & DTS_CHANNEL_MASK) == DTS_2F2R)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
200 return 4;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
201 else
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
202 return 2;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
203 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
204
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
205 static int
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
206 dts_decode_frame (AVCodecContext *avctx, void *data, int *data_size,
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
207 uint8_t *buff, int buff_size)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
208 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
209 uint8_t * start = buff;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
210 uint8_t * end = buff + buff_size;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
211 static uint8_t buf[BUFFER_SIZE];
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
212 static uint8_t * bufptr = buf;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
213 static uint8_t * bufpos = buf + HEADER_SIZE;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
214
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
215 static int sample_rate;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
216 static int frame_length;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
217 static int flags;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
218 int bit_rate;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
219 int len;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
220 dts_state_t *state = avctx->priv_data;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
221
2222
ef568cc0972c 10l (gcc 2.95 compilation)
michael
parents: 2186
diff changeset
222 *data_size = 0;
ef568cc0972c 10l (gcc 2.95 compilation)
michael
parents: 2186
diff changeset
223
2123
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
224 while (1)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
225 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
226 len = end - start;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
227 if (!len)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
228 break;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
229 if (len > bufpos - bufptr)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
230 len = bufpos - bufptr;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
231 memcpy (bufptr, start, len);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
232 bufptr += len;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
233 start += len;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
234 if (bufptr == bufpos)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
235 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
236 if (bufpos == buf + HEADER_SIZE)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
237 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
238 int length;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
239
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
240 length = dts_syncinfo (state, buf, &flags, &sample_rate,
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
241 &bit_rate, &frame_length);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
242 if (!length)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
243 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
244 av_log (NULL, AV_LOG_INFO, "skip\n");
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
245 for (bufptr = buf; bufptr < buf + HEADER_SIZE-1; bufptr++)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
246 bufptr[0] = bufptr[1];
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
247 continue;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
248 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
249 bufpos = buf + length;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
250 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
251 else
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
252 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
253 level_t level;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
254 sample_t bias;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
255 int i;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
256
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
257 flags = 2; /* ???????????? */
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
258 level = CONVERT_LEVEL;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
259 bias = CONVERT_BIAS;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
260
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
261 flags |= DTS_ADJUST_LEVEL;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
262 if (dts_frame (state, buf, &flags, &level, bias))
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
263 goto error;
2141
a0f5f4731ccd libdts support improvements by (Aurelien Jacobs)
michael
parents: 2126
diff changeset
264 avctx->sample_rate = sample_rate;
a0f5f4731ccd libdts support improvements by (Aurelien Jacobs)
michael
parents: 2126
diff changeset
265 avctx->channels = channels_multi (flags);
a0f5f4731ccd libdts support improvements by (Aurelien Jacobs)
michael
parents: 2126
diff changeset
266 avctx->bit_rate = bit_rate;
2123
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
267 for (i = 0; i < dts_blocks_num (state); i++)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
268 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
269 if (dts_block (state))
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
270 goto error;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
271 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
272 int chans;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
273 chans = channels_multi (flags);
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
274 convert2s16_multi (dts_samples (state), data,
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
275 flags & (DTS_CHANNEL_MASK | DTS_LFE));
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
276
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
277 data += 256 * sizeof (int16_t) * chans;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
278 *data_size += 256 * sizeof (int16_t) * chans;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
279 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
280 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
281 bufptr = buf;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
282 bufpos = buf + HEADER_SIZE;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
283 continue;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
284 error:
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
285 av_log (NULL, AV_LOG_ERROR, "error\n");
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
286 bufptr = buf;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
287 bufpos = buf + HEADER_SIZE;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
288 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
289 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
290 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
291
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
292 return buff_size;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
293 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
294
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
295 static int
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
296 dts_decode_init (AVCodecContext *avctx)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
297 {
2126
181cb6785f6b remove dts_internal.h
michael
parents: 2123
diff changeset
298 avctx->priv_data = dts_init (0);
181cb6785f6b remove dts_internal.h
michael
parents: 2123
diff changeset
299 if (avctx->priv_data == NULL)
2123
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
300 return 1;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
301
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
302 return 0;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
303 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
304
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
305 static int
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
306 dts_decode_end (AVCodecContext *s)
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
307 {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
308 return 0;
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
309 }
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
310
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
311 AVCodec dts_decoder = {
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
312 "dts",
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
313 CODEC_TYPE_AUDIO,
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
314 CODEC_ID_DTS,
2126
181cb6785f6b remove dts_internal.h
michael
parents: 2123
diff changeset
315 sizeof (dts_state_t *),
2123
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
316 dts_decode_init,
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
317 NULL,
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
318 dts_decode_end,
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
319 dts_decode_frame,
ef54decf5624 libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
diff changeset
320 };