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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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
const 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 const 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 const 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 const 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 = {