FFmpeg
Loading...
Searching...
No Matches
dpcm.c
Go to the documentation of this file.
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
40#include "avcodec.h"
41#include "bytestream.h"
42#include "codec_internal.h"
43#include "decode.h"
44#include "mathops.h"
45
47
48typedef struct DPCMContext {
49 int16_t array[256];
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
55static const int32_t derf_steps[96] = {
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
70static const int16_t interplay_delta_table[] = {
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
106static const int8_t sol_table_old[16] = {
107 0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
108 -0x15, -0xF, -0xA, -0x6, -0x3, -0x2, -0x1, 0x0
109};
110
111static const int8_t sol_table_new[16] = {
112 0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
113 0x0, -0x1, -0x2, -0x3, -0x6, -0xA, -0xF, -0x15
114};
115
116static const int16_t sol_table_16[128] = {
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
132static const int16_t wady_table[128] = {
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{
153 DPCMContext *s = avctx->priv_data;
154 int i;
155
156 if (avctx->ch_layout.nb_channels < 1 || avctx->ch_layout.nb_channels > 2) {
157 av_log(avctx, AV_LOG_ERROR, "invalid number of channels\n");
158 return AVERROR(EINVAL);
159 }
160
161 s->sample[0] = s->sample[1] = 0;
162
163 switch (avctx->codec->id) {
164
166 /* initialize square table */
167 for (i = 0; i < 128; i++) {
168 int16_t square = i * i;
169 s->array[i ] = square;
170 s->array[i + 128] = -square;
171 }
172 break;
173
175 switch(avctx->codec_tag){
176 case 1:
177 s->sol_table = sol_table_old;
178 s->sample[0] = s->sample[1] = 0x80;
179 break;
180 case 2:
181 s->sol_table = sol_table_new;
182 s->sample[0] = s->sample[1] = 0x80;
183 break;
184 case 3:
185 break;
186 default:
187 av_log(avctx, AV_LOG_ERROR, "Unknown SOL subcodec\n");
188 return -1;
189 }
190 break;
191
193 for (i = -128; i < 128; i++) {
194 int16_t square = i * i * 2;
195 s->array[i+128] = i < 0 ? -square: square;
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
207 int delta = 0;
208 int code = 64;
209 int step = 45;
210
211 s->array[0] = 0;
212 for (i = 0; i < 127; i++) {
213 delta += (code >> 5);
214 code += step;
215 step += 2;
216
217 s->array[i*2 + 1] = delta;
218 s->array[i*2 + 2] = -delta;
219 }
220 s->array[255] = delta + (code >> 5);
221 }
222 break;
223
225 s->scale = (avctx->extradata && avctx->extradata_size > 0) ? avctx->extradata[0] : 1;
226 break;
227
228 default:
229 break;
230 }
231
232 if (avctx->codec->id == AV_CODEC_ID_SOL_DPCM && avctx->codec_tag != 3)
234 else
236
237 return 0;
238}
239
240
242 int *got_frame_ptr, AVPacket *avpkt)
243{
244 int buf_size = avpkt->size;
245 DPCMContext *s = avctx->priv_data;
246 int out = 0, ret;
247 int predictor[2];
248 int ch = 0;
249 int stereo = avctx->ch_layout.nb_channels - 1;
250 int16_t *output_samples, *samples_end;
252
253 if (stereo && (buf_size & 1))
254 buf_size--;
255 bytestream2_init(&gb, avpkt->data, buf_size);
256
257 /* calculate output size */
258 switch(avctx->codec->id) {
260 out = buf_size - 8;
261 break;
263 out = buf_size - 6 - avctx->ch_layout.nb_channels;
264 break;
266 out = buf_size - 2 * avctx->ch_layout.nb_channels;
267 break;
269 if (avctx->codec_tag != 3)
270 out = buf_size * 2;
271 else
272 out = buf_size;
273 break;
279 out = buf_size;
280 break;
281 }
282 if (out <= 0) {
283 av_log(avctx, AV_LOG_ERROR, "packet is too small\n");
284 return AVERROR(EINVAL);
285 }
286 if (out % avctx->ch_layout.nb_channels) {
287 av_log(avctx, AV_LOG_WARNING, "channels have differing number of samples\n");
288 }
289
290 /* get output buffer */
291 frame->nb_samples = (out + avctx->ch_layout.nb_channels - 1) / avctx->ch_layout.nb_channels;
292 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
293 return ret;
294 output_samples = (int16_t *)frame->data[0];
295 samples_end = output_samples + out;
296
297 switch(avctx->codec->id) {
298
300 bytestream2_skipu(&gb, 6);
301
302 if (stereo) {
303 predictor[1] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16);
304 predictor[0] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16);
305 } else {
306 predictor[0] = sign_extend(bytestream2_get_le16u(&gb), 16);
307 }
308
309 /* decode the samples */
310 while (output_samples < samples_end) {
311 predictor[ch] += s->array[bytestream2_get_byteu(&gb)];
313 *output_samples++ = predictor[ch];
314
315 /* toggle channel */
316 ch ^= stereo;
317 }
318 break;
319
321 bytestream2_skipu(&gb, 6); /* skip over the stream mask and stream length */
322
323 for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) {
324 predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
325 *output_samples++ = predictor[ch];
326 }
327
328 ch = 0;
329 while (output_samples < samples_end) {
330 predictor[ch] += interplay_delta_table[bytestream2_get_byteu(&gb)];
332 *output_samples++ = predictor[ch];
333
334 /* toggle channel */
335 ch ^= stereo;
336 }
337 break;
338
340 {
341 int shift[2] = { 4, 4 };
342
343 for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++)
344 predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
345
346 ch = 0;
347 while (output_samples < samples_end) {
348 int diff = bytestream2_get_byteu(&gb);
349 int n = diff & 3;
350
351 if (n == 3)
352 shift[ch]++;
353 else
354 shift[ch] -= (2 * n);
355 diff = sign_extend((diff &~ 3) << 8, 16);
356
357 /* saturate the shifter to 0..31 */
358 shift[ch] = av_clip_uintp2(shift[ch], 5);
359
360 diff >>= shift[ch];
361 predictor[ch] += diff;
362
364 *output_samples++ = predictor[ch];
365
366 /* toggle channel */
367 ch ^= stereo;
368 }
369 break;
370 }
372 if (avctx->codec_tag != 3) {
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];
379 s->sample[0] = av_clip_uint8(s->sample[0]);
380 *output_samples_u8++ = s->sample[0];
381
382 s->sample[stereo] += s->sol_table[n & 0x0F];
383 s->sample[stereo] = av_clip_uint8(s->sample[stereo]);
384 *output_samples_u8++ = s->sample[stereo];
385 }
386 } else {
387 while (output_samples < samples_end) {
388 int n = bytestream2_get_byteu(&gb);
389 if (n & 0x80) s->sample[ch] -= sol_table_16[n & 0x7F];
390 else s->sample[ch] += sol_table_16[n & 0x7F];
391 s->sample[ch] = av_clip_int16(s->sample[ch]);
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))
405 s->sample[ch] = 0;
406 s->sample[ch] += s->array[n + 128];
407 s->sample[ch] = av_clip_int16(s->sample[ch]);
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);
430 int index = FFMIN(n & 0x7f, 95);
431
432 s->sample[idx] += (n & 0x80 ? -1: 1) * derf_steps[index];
433 s->sample[idx] = av_clip_int16(s->sample[idx]);
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)
447 s->sample[idx] = sign_extend((n & 0x7f) << 9, 16);
448 else
449 s->sample[idx] += s->scale * (unsigned)wady_table[n & 0x7f];
450 *output_samples++ = av_clip_int16(s->sample[idx]);
451 idx ^= stereo;
452 }
453 }
454 break;
455 }
456
457 *got_frame_ptr = 1;
458
459 return avpkt->size;
460}
461
463{
464 DPCMContext *s = avctx->priv_data;
465
466 s->sample[0] = s->sample[1] = 0;
467}
468
469#define DPCM_DECODER(ID, NAME, FLUSH, LONG_NAME) \
470const 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 = FLUSH, \
479 FF_CODEC_DECODE_CB(dpcm_decode_frame), \
480}
481
482DPCM_DECODER(AV_CODEC_ID_CBD2_DPCM, cbd2_dpcm, dpcm_flush, "DPCM Cuberoot-Delta-Exact");
483DPCM_DECODER(AV_CODEC_ID_DERF_DPCM, derf_dpcm, dpcm_flush, "DPCM Xilam DERF");
484DPCM_DECODER(AV_CODEC_ID_GREMLIN_DPCM, gremlin_dpcm, dpcm_flush, "DPCM Gremlin");
485DPCM_DECODER(AV_CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, NULL, "DPCM Interplay");
486DPCM_DECODER(AV_CODEC_ID_ROQ_DPCM, roq_dpcm, NULL, "DPCM id RoQ");
487DPCM_DECODER(AV_CODEC_ID_SDX2_DPCM, sdx2_dpcm, dpcm_flush, "DPCM Squareroot-Delta-Exact");
489DPCM_DECODER(AV_CODEC_ID_XAN_DPCM, xan_dpcm, NULL, "DPCM Xan");
490DPCM_DECODER(AV_CODEC_ID_WADY_DPCM, wady_dpcm, dpcm_flush, "DPCM Marble WADY");
static FILE * out
int32_t
Libavcodec external API header.
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
Definition bytestream.h:174
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition bytestream.h:137
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define av_clip_int16
Definition common.h:115
#define av_clip_uint8
Definition common.h:106
#define av_clip_uintp2
Definition common.h:124
#define NULL
Definition coverity.c:32
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition decode.c:1777
static AVFrame * frame
static int dpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
Definition dpcm.c:241
#define DPCM_DECODER(ID, NAME, FLUSH, LONG_NAME)
Definition dpcm.c:469
static const int8_t sol_table_new[16]
Definition dpcm.c:111
static av_cold void dpcm_flush(AVCodecContext *avctx)
Definition dpcm.c:462
static const int16_t interplay_delta_table[]
Definition dpcm.c:70
static const int8_t sol_table_old[16]
Definition dpcm.c:106
static const int32_t derf_steps[96]
Definition dpcm.c:55
static const int16_t sol_table_16[128]
Definition dpcm.c:116
static av_cold int dpcm_decode_init(AVCodecContext *avctx)
Definition dpcm.c:151
static const int16_t wady_table[128]
Definition dpcm.c:132
static void predictor(uint8_t *src, ptrdiff_t size)
Definition exrenc.c:170
@ AV_CODEC_ID_INTERPLAY_DPCM
Definition codec_id.h:443
@ AV_CODEC_ID_SDX2_DPCM
Definition codec_id.h:446
@ AV_CODEC_ID_DERF_DPCM
Definition codec_id.h:448
@ AV_CODEC_ID_SOL_DPCM
Definition codec_id.h:445
@ AV_CODEC_ID_WADY_DPCM
Definition codec_id.h:449
@ AV_CODEC_ID_ROQ_DPCM
Definition codec_id.h:442
@ AV_CODEC_ID_XAN_DPCM
Definition codec_id.h:444
@ AV_CODEC_ID_GREMLIN_DPCM
Definition codec_id.h:447
@ AV_CODEC_ID_CBD2_DPCM
Definition codec_id.h:450
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
@ AV_SAMPLE_FMT_U8
unsigned 8 bits
Definition samplefmt.h:57
@ AV_SAMPLE_FMT_S16
signed 16 bits
Definition samplefmt.h:58
int index
Definition gxfenc.c:90
static int shift(int a, int b)
Definition bonk.c:261
Macro definitions for various function/variable attributes.
#define av_cold
Definition attributes.h:117
#define FFMIN(a, b)
Definition macros.h:49
static av_const int sign_extend(int val, unsigned bits)
Definition mathops.h:135
static int square(int x)
const uint8_t * code
Definition spdifenc.c:433
int nb_channels
Number of channels in this layout.
main external API structure.
Definition avcodec.h:443
AVChannelLayout ch_layout
Audio channel layout.
Definition avcodec.h:1055
enum AVSampleFormat sample_fmt
audio sample format
Definition avcodec.h:1047
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
Definition avcodec.h:468
const struct AVCodec * codec
Definition avcodec.h:452
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition avcodec.h:526
int extradata_size
Definition avcodec.h:527
void * priv_data
Definition avcodec.h:470
enum AVCodecID id
Definition codec.h:189
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
This structure stores compressed data.
Definition packet.h:580
int size
Definition packet.h:604
uint8_t * data
Definition packet.h:603
int sample[2]
previous sample (for SOL_DPCM and WADY_DPCM)
Definition dpcm.c:50
const int8_t * sol_table
delta table for SOL_DPCM
Definition dpcm.c:52
int scale
scale for WADY_DPCM
Definition dpcm.c:51
int16_t array[256]
Definition dpcm.c:49
#define av_log(a,...)
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
float delta