1 /*
2 * Assorted DPCM codecs
3 * Copyright (c) 2003 The FFmpeg project
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg 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 GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * Assorted DPCM (differential pulse code modulation) audio codecs
25 * by Mike Melanson (melanson@pcisys.net)
26 * Xan DPCM decoder by Mario Brito (mbrito@student.dei.uc.pt)
27 * for more information on the specific data formats, visit:
28 * http://www.pcisys.net/~melanson/codecs/simpleaudio.html
29 * SOL DPCMs implemented by Konstantin Shishkov
30 *
31 * Note about using the Xan DPCM decoder: Xan DPCM is used in AVI files
32 * found in the Wing Commander IV computer game. These AVI files contain
33 * WAVEFORMAT headers which report the audio format as 0x01: raw PCM.
34 * Clearly incorrect. To detect Xan DPCM, you will probably have to
35 * special-case your AVI demuxer to use Xan DPCM if the file uses 'Xxan'
36 * (Xan video) for its video codec. Alternately, such AVI files also contain
37 * the fourcc 'Axan' in the 'auds' chunk of the AVI header.
38 */
39
45
47
50 int sample[2];
///< previous sample (for SOL_DPCM and WADY_DPCM)
51 int scale;
///< scale for WADY_DPCM
52 const int8_t *
sol_table;
///< delta table for SOL_DPCM
54
56 0, 1, 2, 3, 4, 5, 6, 7,
57 8, 9, 10, 11, 12, 13, 14, 16,
58 17, 19, 21, 23, 25, 28, 31, 34,
59 37, 41, 45, 50, 55, 60, 66, 73,
60 80, 88, 97, 107, 118, 130, 143, 157,
61 173, 190, 209, 230, 253, 279, 307, 337,
62 371, 408, 449, 494, 544, 598, 658, 724,
63 796, 876, 963, 1060, 1166, 1282, 1411, 1552,
64 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327,
65 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132,
66 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289,
67 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767,
68 };
69
71 0, 1, 2, 3, 4, 5, 6, 7,
72 8, 9, 10, 11, 12, 13, 14, 15,
73 16, 17, 18, 19, 20, 21, 22, 23,
74 24, 25, 26, 27, 28, 29, 30, 31,
75 32, 33, 34, 35, 36, 37, 38, 39,
76 40, 41, 42, 43, 47, 51, 56, 61,
77 66, 72, 79, 86, 94, 102, 112, 122,
78 133, 145, 158, 173, 189, 206, 225, 245,
79 267, 292, 318, 348, 379, 414, 452, 493,
80 538, 587, 640, 699, 763, 832, 908, 991,
81 1081, 1180, 1288, 1405, 1534, 1673, 1826, 1993,
82 2175, 2373, 2590, 2826, 3084, 3365, 3672, 4008,
83 4373, 4772, 5208, 5683, 6202, 6767, 7385, 8059,
84 8794, 9597, 10472, 11428, 12471, 13609, 14851, 16206,
85 17685, 19298, 21060, 22981, 25078, 27367, 29864, 32589,
86 -29973, -26728, -23186, -19322, -15105, -10503, -5481, -1,
87 1, 1, 5481, 10503, 15105, 19322, 23186, 26728,
88 29973, -32589, -29864, -27367, -25078, -22981, -21060, -19298,
89 -17685, -16206, -14851, -13609, -12471, -11428, -10472, -9597,
90 -8794, -8059, -7385, -6767, -6202, -5683, -5208, -4772,
91 -4373, -4008, -3672, -3365, -3084, -2826, -2590, -2373,
92 -2175, -1993, -1826, -1673, -1534, -1405, -1288, -1180,
93 -1081, -991, -908, -832, -763, -699, -640, -587,
94 -538, -493, -452, -414, -379, -348, -318, -292,
95 -267, -245, -225, -206, -189, -173, -158, -145,
96 -133, -122, -112, -102, -94, -86, -79, -72,
97 -66, -61, -56, -51, -47, -43, -42, -41,
98 -40, -39, -38, -37, -36, -35, -34, -33,
99 -32, -31, -30, -29, -28, -27, -26, -25,
100 -24, -23, -22, -21, -20, -19, -18, -17,
101 -16, -15, -14, -13, -12, -11, -10, -9,
102 -8, -7, -6, -5, -4, -3, -2, -1
103
104 };
105
107 0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
108 -0x15, -0xF, -0xA, -0x6, -0x3, -0x2, -0x1, 0x0
109 };
110
112 0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
113 0x0, -0x1, -0x2, -0x3, -0x6, -0xA, -0xF, -0x15
114 };
115
117 0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080,
118 0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120,
119 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0,
120 0x1D0, 0x1E0, 0x1F0, 0x200, 0x208, 0x210, 0x218, 0x220, 0x228, 0x230,
121 0x238, 0x240, 0x248, 0x250, 0x258, 0x260, 0x268, 0x270, 0x278, 0x280,
122 0x288, 0x290, 0x298, 0x2A0, 0x2A8, 0x2B0, 0x2B8, 0x2C0, 0x2C8, 0x2D0,
123 0x2D8, 0x2E0, 0x2E8, 0x2F0, 0x2F8, 0x300, 0x308, 0x310, 0x318, 0x320,
124 0x328, 0x330, 0x338, 0x340, 0x348, 0x350, 0x358, 0x360, 0x368, 0x370,
125 0x378, 0x380, 0x388, 0x390, 0x398, 0x3A0, 0x3A8, 0x3B0, 0x3B8, 0x3C0,
126 0x3C8, 0x3D0, 0x3D8, 0x3E0, 0x3E8, 0x3F0, 0x3F8, 0x400, 0x440, 0x480,
127 0x4C0, 0x500, 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700,
128 0x740, 0x780, 0x7C0, 0x800, 0x900, 0xA00, 0xB00, 0xC00, 0xD00, 0xE00,
129 0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000
130 };
131
133 0, 2, 4, 6, 8, 10, 12, 15,
134 18, 21, 24, 28, 32, 36, 40, 44,
135 49, 54, 59, 64, 70, 76, 82, 88,
136 95, 102, 109, 116, 124, 132, 140, 148,
137 160, 170, 180, 190, 200, 210, 220, 230,
138 240, 255, 270, 285, 300, 320, 340, 360,
139 380, 400, 425, 450, 475, 500, 525, 550,
140 580, 610, 650, 700, 750, 800, 900, 1000,
141 -0, -2, -4, -6, -8, -10, -12, -15,
142 -18, -21, -24, -28, -32, -36, -40, -44,
143 -49, -54, -59, -64, -70, -76, -82, -88,
144 -95, -102,-109,-116,-124,-132,-140,-148,
145 -160,-170,-180,-190,-200,-210,-220,-230,
146 -240,-255,-270,-285,-300,-320,-340,-360,
147 -380,-400,-425,-450,-475,-500,-525,-550,
148 -580,-610,-650,-700,-750,-800,-900,-1000,
149 };
150
152 {
155
159 }
160
161 s->sample[0] =
s->sample[1] = 0;
162
164
166 /* initialize square table */
167 for (
i = 0;
i < 128;
i++) {
171 }
172 break;
173
176 case 1:
178 s->sample[0] =
s->sample[1] = 0x80;
179 break;
180 case 2:
182 s->sample[0] =
s->sample[1] = 0x80;
183 break;
184 case 3:
185 break;
186 default:
188 return -1;
189 }
190 break;
191
193 for (
i = -128;
i < 128;
i++) {
196 }
197 break;
198
200 for (
i = -128;
i < 128;
i++) {
201 int16_t cube = (
i *
i *
i) / 64;
202 s->array[
i+128] = cube;
203 }
204 break;
205
210
212 for (
i = 0;
i < 127;
i++) {
216
219 }
221 }
222 break;
223
226 break;
227
228 default:
229 break;
230 }
231
234 else
236
237 return 0;
238 }
239
240
242 int *got_frame_ptr,
AVPacket *avpkt)
243 {
244 int buf_size = avpkt->
size;
248 int ch = 0;
250 int16_t *output_samples, *samples_end;
252
253 if (stereo && (buf_size & 1))
254 buf_size--;
256
257 /* calculate output size */
261 break;
264 break;
267 break;
271 else
273 break;
280 break;
281 }
285 }
288 }
289
290 /* get output buffer */
294 output_samples = (int16_t *)
frame->data[0];
295 samples_end = output_samples +
out;
296
298
301
302 if (stereo) {
305 } else {
307 }
308
309 /* decode the samples */
310 while (output_samples < samples_end) {
311 predictor[ch] +=
s->array[bytestream2_get_byteu(&gb)];
314
315 /* toggle channel */
316 ch ^= stereo;
317 }
318 break;
319
322
326 }
327
328 ch = 0;
329 while (output_samples < samples_end) {
333
334 /* toggle channel */
335 ch ^= stereo;
336 }
337 break;
338
340 {
341 int shift[2] = { 4, 4 };
342
345
346 ch = 0;
347 while (output_samples < samples_end) {
348 int diff = bytestream2_get_byteu(&gb);
350
351 if (n == 3)
353 else
354 shift[ch] -= (2 * n);
356
357 /* saturate the shifter to 0..31 */
359
362
365
366 /* toggle channel */
367 ch ^= stereo;
368 }
369 break;
370 }
373 uint8_t *output_samples_u8 =
frame->data[0],
374 *samples_end_u8 = output_samples_u8 +
out;
375 while (output_samples_u8 < samples_end_u8) {
376 int n = bytestream2_get_byteu(&gb);
377
378 s->sample[0] +=
s->sol_table[n >> 4];
380 *output_samples_u8++ =
s->sample[0];
381
382 s->sample[stereo] +=
s->sol_table[n & 0x0F];
384 *output_samples_u8++ =
s->sample[stereo];
385 }
386 } else {
387 while (output_samples < samples_end) {
388 int n = bytestream2_get_byteu(&gb);
392 *output_samples++ =
s->sample[ch];
393 /* toggle channel */
394 ch ^= stereo;
395 }
396 }
397 break;
398
401 while (output_samples < samples_end) {
402 int8_t n = bytestream2_get_byteu(&gb);
403
404 if (!(n & 1))
406 s->sample[ch] +=
s->array[n + 128];
408 *output_samples++ =
s->sample[ch];
409 ch ^= stereo;
410 }
411 break;
412
414 int idx = 0;
415
416 while (output_samples < samples_end) {
417 uint8_t n = bytestream2_get_byteu(&gb);
418
419 *output_samples++ =
s->sample[idx] += (unsigned)
s->array[n];
420 idx ^= 1;
421 }
422 }
423 break;
424
426 int idx = 0;
427
428 while (output_samples < samples_end) {
429 uint8_t n = bytestream2_get_byteu(&gb);
431
434 *output_samples++ =
s->sample[idx];
435 idx ^= stereo;
436 }
437 }
438 break;
439
441 int idx = 0;
442
443 while (output_samples < samples_end) {
444 const uint8_t n = bytestream2_get_byteu(&gb);
445
446 if (n & 0x80)
448 else
449 s->sample[idx] +=
s->scale * (unsigned)
wady_table[n & 0x7f];
451 idx ^= stereo;
452 }
453 }
454 break;
455 }
456
457 *got_frame_ptr = 1;
458
460 }
461
463 {
465
466 s->sample[0] =
s->sample[1] = 0;
467 }
468
469 #define DPCM_DECODER(id_, name_, long_name_) \
470 const FFCodec ff_ ## name_ ## _decoder = { \
471 .p.name = #name_, \
472 CODEC_LONG_NAME(long_name_), \
473 .p.type = AVMEDIA_TYPE_AUDIO, \
474 .p.id = id_, \
475 .p.capabilities = AV_CODEC_CAP_DR1, \
476 .priv_data_size = sizeof(DPCMContext), \
477 .init = dpcm_decode_init, \
478 .flush = dpcm_flush, \
479 FF_CODEC_DECODE_CB(dpcm_decode_frame), \
480 }
481