Coverage Report

Created: 2026-09-14 08:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/dpcm.c
Line
Count
Source
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
46
#include "libavutil/attributes.h"
47
48
typedef 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
53
} DPCMContext;
54
55
static 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
70
static 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
106
static 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
111
static 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
116
static 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
132
static 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
151
static av_cold int dpcm_decode_init(AVCodecContext *avctx)
152
4.49k
{
153
4.49k
    DPCMContext *s = avctx->priv_data;
154
4.49k
    int i;
155
156
4.49k
    if (avctx->ch_layout.nb_channels < 1 || avctx->ch_layout.nb_channels > 2) {
157
370
        av_log(avctx, AV_LOG_ERROR, "invalid number of channels\n");
158
370
        return AVERROR(EINVAL);
159
370
    }
160
161
4.12k
    s->sample[0] = s->sample[1] = 0;
162
163
4.12k
    switch (avctx->codec->id) {
164
165
466
    case AV_CODEC_ID_ROQ_DPCM:
166
        /* initialize square table */
167
60.1k
        for (i = 0; i < 128; i++) {
168
59.6k
            int16_t square = i * i;
169
59.6k
            s->array[i      ] =  square;
170
59.6k
            s->array[i + 128] = -square;
171
59.6k
        }
172
466
        break;
173
174
423
    case AV_CODEC_ID_SOL_DPCM:
175
423
        switch(avctx->codec_tag){
176
145
        case 1:
177
145
            s->sol_table = sol_table_old;
178
145
            s->sample[0] = s->sample[1] = 0x80;
179
145
            break;
180
81
        case 2:
181
81
            s->sol_table = sol_table_new;
182
81
            s->sample[0] = s->sample[1] = 0x80;
183
81
            break;
184
195
        case 3:
185
195
            break;
186
2
        default:
187
2
            av_log(avctx, AV_LOG_ERROR, "Unknown SOL subcodec\n");
188
2
            return -1;
189
423
        }
190
421
        break;
191
192
467
    case AV_CODEC_ID_SDX2_DPCM:
193
120k
        for (i = -128; i < 128; i++) {
194
119k
            int16_t square = i * i * 2;
195
119k
            s->array[i+128] = i < 0 ? -square: square;
196
119k
        }
197
467
        break;
198
199
447
    case AV_CODEC_ID_CBD2_DPCM:
200
114k
        for (i = -128; i < 128; i++) {
201
114k
            int16_t cube = (i * i * i) / 64;
202
114k
            s->array[i+128] = cube;
203
114k
        }
204
447
        break;
205
206
445
    case AV_CODEC_ID_GREMLIN_DPCM: {
207
445
        int delta = 0;
208
445
        int code = 64;
209
445
        int step = 45;
210
211
445
        s->array[0] = 0;
212
56.9k
        for (i = 0; i < 127; i++) {
213
56.5k
            delta += (code >> 5);
214
56.5k
            code  += step;
215
56.5k
            step  += 2;
216
217
56.5k
            s->array[i*2 + 1] =  delta;
218
56.5k
            s->array[i*2 + 2] = -delta;
219
56.5k
        }
220
445
        s->array[255] = delta + (code >> 5);
221
445
        }
222
445
        break;
223
224
472
    case AV_CODEC_ID_WADY_DPCM:
225
472
        s->scale = (avctx->extradata && avctx->extradata_size > 0) ? avctx->extradata[0] : 1;
226
472
        break;
227
228
1.40k
    default:
229
1.40k
        break;
230
4.12k
    }
231
232
4.12k
    if (avctx->codec->id == AV_CODEC_ID_SOL_DPCM && avctx->codec_tag != 3)
233
226
        avctx->sample_fmt = AV_SAMPLE_FMT_U8;
234
3.90k
    else
235
3.90k
        avctx->sample_fmt = AV_SAMPLE_FMT_S16;
236
237
4.12k
    return 0;
238
4.12k
}
239
240
241
static int dpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
242
                             int *got_frame_ptr, AVPacket *avpkt)
243
2.27M
{
244
2.27M
    int buf_size = avpkt->size;
245
2.27M
    DPCMContext *s = avctx->priv_data;
246
2.27M
    int out = 0, ret;
247
2.27M
    int predictor[2];
248
2.27M
    int ch = 0;
249
2.27M
    int stereo = avctx->ch_layout.nb_channels - 1;
250
2.27M
    int16_t *output_samples, *samples_end;
251
2.27M
    GetByteContext gb;
252
253
2.27M
    if (stereo && (buf_size & 1))
254
777k
        buf_size--;
255
2.27M
    bytestream2_init(&gb, avpkt->data, buf_size);
256
257
    /* calculate output size */
258
2.27M
    switch(avctx->codec->id) {
259
246k
    case AV_CODEC_ID_ROQ_DPCM:
260
246k
        out = buf_size - 8;
261
246k
        break;
262
266k
    case AV_CODEC_ID_INTERPLAY_DPCM:
263
266k
        out = buf_size - 6 - avctx->ch_layout.nb_channels;
264
266k
        break;
265
251k
    case AV_CODEC_ID_XAN_DPCM:
266
251k
        out = buf_size - 2 * avctx->ch_layout.nb_channels;
267
251k
        break;
268
218k
    case AV_CODEC_ID_SOL_DPCM:
269
218k
        if (avctx->codec_tag != 3)
270
74.2k
            out = buf_size * 2;
271
144k
        else
272
144k
            out = buf_size;
273
218k
        break;
274
248k
    case AV_CODEC_ID_WADY_DPCM:
275
503k
    case AV_CODEC_ID_DERF_DPCM:
276
764k
    case AV_CODEC_ID_GREMLIN_DPCM:
277
1.00M
    case AV_CODEC_ID_CBD2_DPCM:
278
1.29M
    case AV_CODEC_ID_SDX2_DPCM:
279
1.29M
        out = buf_size;
280
1.29M
        break;
281
2.27M
    }
282
2.27M
    if (out <= 0) {
283
971k
        av_log(avctx, AV_LOG_ERROR, "packet is too small\n");
284
971k
        return AVERROR(EINVAL);
285
971k
    }
286
1.30M
    if (out % avctx->ch_layout.nb_channels) {
287
0
        av_log(avctx, AV_LOG_WARNING, "channels have differing number of samples\n");
288
0
    }
289
290
    /* get output buffer */
291
1.30M
    frame->nb_samples = (out + avctx->ch_layout.nb_channels - 1) / avctx->ch_layout.nb_channels;
292
1.30M
    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
293
0
        return ret;
294
1.30M
    output_samples = (int16_t *)frame->data[0];
295
1.30M
    samples_end = output_samples + out;
296
297
1.30M
    switch(avctx->codec->id) {
298
299
121k
    case AV_CODEC_ID_ROQ_DPCM:
300
121k
        bytestream2_skipu(&gb, 6);
301
302
121k
        if (stereo) {
303
2.41k
            predictor[1] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16);
304
2.41k
            predictor[0] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16);
305
118k
        } else {
306
118k
            predictor[0] = sign_extend(bytestream2_get_le16u(&gb), 16);
307
118k
        }
308
309
        /* decode the samples */
310
17.1M
        while (output_samples < samples_end) {
311
17.0M
            predictor[ch] += s->array[bytestream2_get_byteu(&gb)];
312
17.0M
            predictor[ch]  = av_clip_int16(predictor[ch]);
313
17.0M
            *output_samples++ = predictor[ch];
314
315
            /* toggle channel */
316
17.0M
            ch ^= stereo;
317
17.0M
        }
318
121k
        break;
319
320
145k
    case AV_CODEC_ID_INTERPLAY_DPCM:
321
145k
        bytestream2_skipu(&gb, 6);  /* skip over the stream mask and stream length */
322
323
293k
        for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) {
324
147k
            predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
325
147k
            *output_samples++ = predictor[ch];
326
147k
        }
327
328
145k
        ch = 0;
329
14.4M
        while (output_samples < samples_end) {
330
14.3M
            predictor[ch] += interplay_delta_table[bytestream2_get_byteu(&gb)];
331
14.3M
            predictor[ch]  = av_clip_int16(predictor[ch]);
332
14.3M
            *output_samples++ = predictor[ch];
333
334
            /* toggle channel */
335
14.3M
            ch ^= stereo;
336
14.3M
        }
337
145k
        break;
338
339
130k
    case AV_CODEC_ID_XAN_DPCM:
340
130k
    {
341
130k
        int shift[2] = { 4, 4 };
342
343
263k
        for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++)
344
133k
            predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
345
346
130k
        ch = 0;
347
15.8M
        while (output_samples < samples_end) {
348
15.7M
            int diff = bytestream2_get_byteu(&gb);
349
15.7M
            int n    = diff & 3;
350
351
15.7M
            if (n == 3)
352
6.19M
                shift[ch]++;
353
9.52M
            else
354
9.52M
                shift[ch] -= (2 * n);
355
15.7M
            diff = sign_extend((diff &~ 3) << 8, 16);
356
357
            /* saturate the shifter to 0..31 */
358
15.7M
            shift[ch] = av_clip_uintp2(shift[ch], 5);
359
360
15.7M
            diff >>= shift[ch];
361
15.7M
            predictor[ch] += diff;
362
363
15.7M
            predictor[ch] = av_clip_int16(predictor[ch]);
364
15.7M
            *output_samples++ = predictor[ch];
365
366
            /* toggle channel */
367
15.7M
            ch ^= stereo;
368
15.7M
        }
369
130k
        break;
370
0
    }
371
139k
    case AV_CODEC_ID_SOL_DPCM:
372
139k
        if (avctx->codec_tag != 3) {
373
10.0k
            uint8_t *output_samples_u8 = frame->data[0],
374
10.0k
                    *samples_end_u8 = output_samples_u8 + out;
375
10.6M
            while (output_samples_u8 < samples_end_u8) {
376
10.6M
                int n = bytestream2_get_byteu(&gb);
377
378
10.6M
                s->sample[0] += s->sol_table[n >> 4];
379
10.6M
                s->sample[0]  = av_clip_uint8(s->sample[0]);
380
10.6M
                *output_samples_u8++ = s->sample[0];
381
382
10.6M
                s->sample[stereo] += s->sol_table[n & 0x0F];
383
10.6M
                s->sample[stereo]  = av_clip_uint8(s->sample[stereo]);
384
10.6M
                *output_samples_u8++ = s->sample[stereo];
385
10.6M
            }
386
129k
        } else {
387
2.15M
            while (output_samples < samples_end) {
388
2.02M
                int n = bytestream2_get_byteu(&gb);
389
2.02M
                if (n & 0x80) s->sample[ch] -= sol_table_16[n & 0x7F];
390
1.63M
                else          s->sample[ch] += sol_table_16[n & 0x7F];
391
2.02M
                s->sample[ch] = av_clip_int16(s->sample[ch]);
392
2.02M
                *output_samples++ = s->sample[ch];
393
                /* toggle channel */
394
2.02M
                ch ^= stereo;
395
2.02M
            }
396
129k
        }
397
139k
        break;
398
399
138k
    case AV_CODEC_ID_CBD2_DPCM:
400
299k
    case AV_CODEC_ID_SDX2_DPCM:
401
30.2M
        while (output_samples < samples_end) {
402
29.9M
            int8_t n = bytestream2_get_byteu(&gb);
403
404
29.9M
            if (!(n & 1))
405
15.3M
                s->sample[ch] = 0;
406
29.9M
            s->sample[ch] += s->array[n + 128];
407
29.9M
            s->sample[ch]  = av_clip_int16(s->sample[ch]);
408
29.9M
            *output_samples++ = s->sample[ch];
409
29.9M
            ch ^= stereo;
410
29.9M
        }
411
299k
        break;
412
413
166k
    case AV_CODEC_ID_GREMLIN_DPCM: {
414
166k
        int idx = 0;
415
416
15.7M
        while (output_samples < samples_end) {
417
15.5M
            uint8_t n = bytestream2_get_byteu(&gb);
418
419
15.5M
            *output_samples++ = s->sample[idx] += (unsigned)s->array[n];
420
15.5M
            idx ^= 1;
421
15.5M
        }
422
166k
        }
423
166k
        break;
424
425
150k
    case AV_CODEC_ID_DERF_DPCM: {
426
150k
        int idx = 0;
427
428
14.6M
        while (output_samples < samples_end) {
429
14.4M
            uint8_t n = bytestream2_get_byteu(&gb);
430
14.4M
            int index = FFMIN(n & 0x7f, 95);
431
432
14.4M
            s->sample[idx] += (n & 0x80 ? -1: 1) * derf_steps[index];
433
14.4M
            s->sample[idx]  = av_clip_int16(s->sample[idx]);
434
14.4M
            *output_samples++ = s->sample[idx];
435
14.4M
            idx ^= stereo;
436
14.4M
        }
437
150k
        }
438
150k
        break;
439
440
147k
    case AV_CODEC_ID_WADY_DPCM: {
441
147k
        int idx = 0;
442
443
15.0M
        while (output_samples < samples_end) {
444
14.9M
            const uint8_t n = bytestream2_get_byteu(&gb);
445
446
14.9M
            if (n & 0x80)
447
2.28M
                s->sample[idx] = sign_extend((n & 0x7f) << 9, 16);
448
12.6M
            else
449
12.6M
                s->sample[idx] += s->scale * (unsigned)wady_table[n & 0x7f];
450
14.9M
            *output_samples++ = av_clip_int16(s->sample[idx]);
451
14.9M
            idx ^= stereo;
452
14.9M
        }
453
147k
        }
454
147k
        break;
455
1.30M
    }
456
457
1.30M
    *got_frame_ptr = 1;
458
459
1.30M
    return avpkt->size;
460
1.30M
}
461
462
static av_cold void dpcm_flush(AVCodecContext *avctx)
463
365k
{
464
365k
    DPCMContext *s = avctx->priv_data;
465
466
365k
    s->sample[0] = s->sample[1] = 0;
467
365k
}
468
469
#define DPCM_DECODER(ID, NAME, FLUSH, 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          = FLUSH,                                \
479
    FF_CODEC_DECODE_CB(dpcm_decode_frame),                  \
480
}
481
482
DPCM_DECODER(AV_CODEC_ID_CBD2_DPCM,      cbd2_dpcm,      dpcm_flush, "DPCM Cuberoot-Delta-Exact");
483
DPCM_DECODER(AV_CODEC_ID_DERF_DPCM,      derf_dpcm,      dpcm_flush, "DPCM Xilam DERF");
484
DPCM_DECODER(AV_CODEC_ID_GREMLIN_DPCM,   gremlin_dpcm,   dpcm_flush, "DPCM Gremlin");
485
DPCM_DECODER(AV_CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, NULL,       "DPCM Interplay");
486
DPCM_DECODER(AV_CODEC_ID_ROQ_DPCM,       roq_dpcm,       NULL,       "DPCM id RoQ");
487
DPCM_DECODER(AV_CODEC_ID_SDX2_DPCM,      sdx2_dpcm,      dpcm_flush, "DPCM Squareroot-Delta-Exact");
488
DPCM_DECODER(AV_CODEC_ID_SOL_DPCM,       sol_dpcm,       dpcm_flush, "DPCM Sol");
489
DPCM_DECODER(AV_CODEC_ID_XAN_DPCM,       xan_dpcm,       NULL,       "DPCM Xan");
490
DPCM_DECODER(AV_CODEC_ID_WADY_DPCM,      wady_dpcm,      dpcm_flush, "DPCM Marble WADY");