3 * Copyright (c) 2003 The ffmpeg Project.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 * Assorted DPCM (differential pulse code modulation) audio codecs
23 * by Mike Melanson (melanson@pcisys.net)
24 * Xan DPCM decoder by Mario Brito (mbrito@student.dei.uc.pt)
25 * for more information on the specific data formats, visit:
26 * http://www.pcisys.net/~melanson/codecs/simpleaudio.html
27 * SOL DPCMs implemented by Konstantin Shishkov
29 * Note about using the Xan DPCM decoder: Xan DPCM is used in AVI files
30 * found in the Wing Commander IV computer game. These AVI files contain
31 * WAVEFORMAT headers which report the audio format as 0x01: raw PCM.
32 * Clearly incorrect. To detect Xan DPCM, you will probably have to
33 * special-case your AVI demuxer to use Xan DPCM if the file uses 'Xxan'
34 * (Xan video) for its video codec. Alternately, such AVI files also contain
35 * the fourcc 'Axan' in the 'auds' chunk of the AVI header.
40 typedef struct DPCMContext
{
42 short roq_square_array
[256];
43 long sample
[2];//for SOL_DPCM
44 int *sol_table
;//for SOL_DPCM
47 #define SATURATE_S16(x) if (x < -32768) x = -32768; \
48 else if (x > 32767) x = 32767;
49 #define SE_16BIT(x) if (x & 0x8000) x -= 0x10000;
51 static int interplay_delta_table
[] = {
52 0, 1, 2, 3, 4, 5, 6, 7,
53 8, 9, 10, 11, 12, 13, 14, 15,
54 16, 17, 18, 19, 20, 21, 22, 23,
55 24, 25, 26, 27, 28, 29, 30, 31,
56 32, 33, 34, 35, 36, 37, 38, 39,
57 40, 41, 42, 43, 47, 51, 56, 61,
58 66, 72, 79, 86, 94, 102, 112, 122,
59 133, 145, 158, 173, 189, 206, 225, 245,
60 267, 292, 318, 348, 379, 414, 452, 493,
61 538, 587, 640, 699, 763, 832, 908, 991,
62 1081, 1180, 1288, 1405, 1534, 1673, 1826, 1993,
63 2175, 2373, 2590, 2826, 3084, 3365, 3672, 4008,
64 4373, 4772, 5208, 5683, 6202, 6767, 7385, 8059,
65 8794, 9597, 10472, 11428, 12471, 13609, 14851, 16206,
66 17685, 19298, 21060, 22981, 25078, 27367, 29864, 32589,
67 -29973, -26728, -23186, -19322, -15105, -10503, -5481, -1,
68 1, 1, 5481, 10503, 15105, 19322, 23186, 26728,
69 29973, -32589, -29864, -27367, -25078, -22981, -21060, -19298,
70 -17685, -16206, -14851, -13609, -12471, -11428, -10472, -9597,
71 -8794, -8059, -7385, -6767, -6202, -5683, -5208, -4772,
72 -4373, -4008, -3672, -3365, -3084, -2826, -2590, -2373,
73 -2175, -1993, -1826, -1673, -1534, -1405, -1288, -1180,
74 -1081, -991, -908, -832, -763, -699, -640, -587,
75 -538, -493, -452, -414, -379, -348, -318, -292,
76 -267, -245, -225, -206, -189, -173, -158, -145,
77 -133, -122, -112, -102, -94, -86, -79, -72,
78 -66, -61, -56, -51, -47, -43, -42, -41,
79 -40, -39, -38, -37, -36, -35, -34, -33,
80 -32, -31, -30, -29, -28, -27, -26, -25,
81 -24, -23, -22, -21, -20, -19, -18, -17,
82 -16, -15, -14, -13, -12, -11, -10, -9,
83 -8, -7, -6, -5, -4, -3, -2, -1
87 static int sol_table_old
[16] =
88 { 0x0, 0x1, 0x2 , 0x3, 0x6, 0xA, 0xF, 0x15,
89 -0x15, -0xF, -0xA, -0x6, -0x3, -0x2, -0x1, 0x0};
91 static int sol_table_new
[16] =
92 { 0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
93 0x0, -0x1, -0x2, -0x3, -0x6, -0xA, -0xF, -0x15};
95 static int sol_table_16
[128] = {
96 0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080,
97 0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120,
98 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0,
99 0x1D0, 0x1E0, 0x1F0, 0x200, 0x208, 0x210, 0x218, 0x220, 0x228, 0x230,
100 0x238, 0x240, 0x248, 0x250, 0x258, 0x260, 0x268, 0x270, 0x278, 0x280,
101 0x288, 0x290, 0x298, 0x2A0, 0x2A8, 0x2B0, 0x2B8, 0x2C0, 0x2C8, 0x2D0,
102 0x2D8, 0x2E0, 0x2E8, 0x2F0, 0x2F8, 0x300, 0x308, 0x310, 0x318, 0x320,
103 0x328, 0x330, 0x338, 0x340, 0x348, 0x350, 0x358, 0x360, 0x368, 0x370,
104 0x378, 0x380, 0x388, 0x390, 0x398, 0x3A0, 0x3A8, 0x3B0, 0x3B8, 0x3C0,
105 0x3C8, 0x3D0, 0x3D8, 0x3E0, 0x3E8, 0x3F0, 0x3F8, 0x400, 0x440, 0x480,
106 0x4C0, 0x500, 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700,
107 0x740, 0x780, 0x7C0, 0x800, 0x900, 0xA00, 0xB00, 0xC00, 0xD00, 0xE00,
108 0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000
113 static int dpcm_decode_init(AVCodecContext
*avctx
)
115 DPCMContext
*s
= avctx
->priv_data
;
119 s
->channels
= avctx
->channels
;
120 s
->sample
[0] = s
->sample
[1] = 0;
122 switch(avctx
->codec
->id
) {
124 case CODEC_ID_ROQ_DPCM
:
125 /* initialize square table */
126 for (i
= 0; i
< 128; i
++) {
128 s
->roq_square_array
[i
] = square
;
129 s
->roq_square_array
[i
+ 128] = -square
;
134 case CODEC_ID_SOL_DPCM
:
135 switch(avctx
->codec_tag
){
137 s
->sol_table
=sol_table_old
;
138 s
->sample
[0] = s
->sample
[1] = 0x80;
141 s
->sol_table
=sol_table_new
;
142 s
->sample
[0] = s
->sample
[1] = 0x80;
145 s
->sol_table
=sol_table_16
;
148 av_log(avctx
, AV_LOG_ERROR
, "Unknown SOL subcodec\n");
160 static int dpcm_decode_frame(AVCodecContext
*avctx
,
161 void *data
, int *data_size
,
162 uint8_t *buf
, int buf_size
)
164 DPCMContext
*s
= avctx
->priv_data
;
167 int channel_number
= 0;
168 short *output_samples
= data
;
176 switch(avctx
->codec
->id
) {
178 case CODEC_ID_ROQ_DPCM
:
179 if (s
->channels
== 1)
180 predictor
[0] = LE_16(&buf
[6]);
182 predictor
[0] = buf
[7] << 8;
183 predictor
[1] = buf
[6] << 8;
185 SE_16BIT(predictor
[0]);
186 SE_16BIT(predictor
[1]);
188 /* decode the samples */
189 for (in
= 8, out
= 0; in
< buf_size
; in
++, out
++) {
190 predictor
[channel_number
] += s
->roq_square_array
[buf
[in
]];
191 SATURATE_S16(predictor
[channel_number
]);
192 output_samples
[out
] = predictor
[channel_number
];
195 channel_number
^= s
->channels
- 1;
199 case CODEC_ID_INTERPLAY_DPCM
:
200 in
= 6; /* skip over the stream mask and stream length */
201 predictor
[0] = LE_16(&buf
[in
]);
203 SE_16BIT(predictor
[0])
204 output_samples
[out
++] = predictor
[0];
205 if (s
->channels
== 2) {
206 predictor
[1] = LE_16(&buf
[in
]);
208 SE_16BIT(predictor
[1])
209 output_samples
[out
++] = predictor
[1];
212 while (in
< buf_size
) {
213 predictor
[channel_number
] += interplay_delta_table
[buf
[in
++]];
214 SATURATE_S16(predictor
[channel_number
]);
215 output_samples
[out
++] = predictor
[channel_number
];
218 channel_number
^= s
->channels
- 1;
223 case CODEC_ID_XAN_DPCM
:
225 shift
[0] = shift
[1] = 4;
226 predictor
[0] = LE_16(&buf
[in
]);
228 SE_16BIT(predictor
[0]);
229 if (s
->channels
== 2) {
230 predictor
[1] = LE_16(&buf
[in
]);
232 SE_16BIT(predictor
[1]);
235 while (in
< buf_size
) {
237 diff
= (byte
& 0xFC) << 8;
238 if ((byte
& 0x03) == 3)
239 shift
[channel_number
]++;
241 shift
[channel_number
] -= (2 * (byte
& 3));
242 /* saturate the shifter to a lower limit of 0 */
243 if (shift
[channel_number
] < 0)
244 shift
[channel_number
] = 0;
246 diff
>>= shift
[channel_number
];
247 predictor
[channel_number
] += diff
;
249 SATURATE_S16(predictor
[channel_number
]);
250 output_samples
[out
++] = predictor
[channel_number
];
253 channel_number
^= s
->channels
- 1;
256 case CODEC_ID_SOL_DPCM
:
258 if (avctx
->codec_tag
!= 3) {
259 while (in
< buf_size
) {
261 n1
= (buf
[in
] >> 4) & 0xF;
262 n2
= buf
[in
++] & 0xF;
263 s
->sample
[0] += s
->sol_table
[n1
];
264 if (s
->sample
[0] < 0) s
->sample
[0] = 0;
265 if (s
->sample
[0] > 255) s
->sample
[0] = 255;
266 output_samples
[out
++] = (s
->sample
[0] - 128) << 8;
267 s
->sample
[s
->channels
- 1] += s
->sol_table
[n2
];
268 if (s
->sample
[s
->channels
- 1] < 0) s
->sample
[s
->channels
- 1] = 0;
269 if (s
->sample
[s
->channels
- 1] > 255) s
->sample
[s
->channels
- 1] = 255;
270 output_samples
[out
++] = (s
->sample
[s
->channels
- 1] - 128) << 8;
273 while (in
< buf_size
) {
276 if (n
& 0x80) s
->sample
[channel_number
] -= s
->sol_table
[n
& 0x7F];
277 else s
->sample
[channel_number
] += s
->sol_table
[n
& 0x7F];
278 SATURATE_S16(s
->sample
[channel_number
]);
279 output_samples
[out
++] = s
->sample
[channel_number
];
281 channel_number
^= s
->channels
- 1;
287 *data_size
= out
* sizeof(short);
291 AVCodec roq_dpcm_decoder
= {
302 AVCodec interplay_dpcm_decoder
= {
305 CODEC_ID_INTERPLAY_DPCM
,
313 AVCodec xan_dpcm_decoder
= {
324 AVCodec sol_dpcm_decoder
= {