FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/dpcm.c
Date: 2026-09-25 11:37:27
Exec Total Coverage
Lines: 104 205 50.7%
Functions: 2 3 66.7%
Branches: 43 96 44.8%

Line Branch Exec 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 14 static av_cold int dpcm_decode_init(AVCodecContext *avctx)
152 {
153 14 DPCMContext *s = avctx->priv_data;
154 int i;
155
156
2/4
✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
14 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 14 s->sample[0] = s->sample[1] = 0;
162
163
3/7
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 7 times.
14 switch (avctx->codec->id) {
164
165 5 case AV_CODEC_ID_ROQ_DPCM:
166 /* initialize square table */
167
2/2
✓ Branch 0 taken 640 times.
✓ Branch 1 taken 5 times.
645 for (i = 0; i < 128; i++) {
168 640 int16_t square = i * i;
169 640 s->array[i ] = square;
170 640 s->array[i + 128] = -square;
171 }
172 5 break;
173
174 2 case AV_CODEC_ID_SOL_DPCM:
175
1/4
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 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 2 case 3:
185 2 break;
186 ✗ default:
187 ✗ av_log(avctx, AV_LOG_ERROR, "Unknown SOL subcodec\n");
188 ✗ return -1;
189 }
190 2 break;
191
192 ✗ case AV_CODEC_ID_SDX2_DPCM:
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
199 ✗ case AV_CODEC_ID_CBD2_DPCM:
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
206 ✗ case AV_CODEC_ID_GREMLIN_DPCM: {
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
224 ✗ case AV_CODEC_ID_WADY_DPCM:
225 ✗ s->scale = (avctx->extradata && avctx->extradata_size > 0) ? avctx->extradata[0] : 1;
226 ✗ break;
227
228 7 default:
229 7 break;
230 }
231
232
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
14 if (avctx->codec->id == AV_CODEC_ID_SOL_DPCM && avctx->codec_tag != 3)
233 ✗ avctx->sample_fmt = AV_SAMPLE_FMT_U8;
234 else
235 14 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
236
237 14 return 0;
238 }
239
240
241 649 static int dpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
242 int *got_frame_ptr, AVPacket *avpkt)
243 {
244 649 int buf_size = avpkt->size;
245 649 DPCMContext *s = avctx->priv_data;
246 649 int out = 0, ret;
247 int predictor[2];
248 649 int ch = 0;
249 649 int stereo = avctx->ch_layout.nb_channels - 1;
250 int16_t *output_samples, *samples_end;
251 GetByteContext gb;
252
253
2/4
✓ Branch 0 taken 649 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 649 times.
649 if (stereo && (buf_size & 1))
254 ✗ buf_size--;
255 649 bytestream2_init(&gb, avpkt->data, buf_size);
256
257 /* calculate output size */
258
4/6
✓ Branch 0 taken 340 times.
✓ Branch 1 taken 124 times.
✓ Branch 2 taken 111 times.
✓ Branch 3 taken 74 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
649 switch(avctx->codec->id) {
259 340 case AV_CODEC_ID_ROQ_DPCM:
260 340 out = buf_size - 8;
261 340 break;
262 124 case AV_CODEC_ID_INTERPLAY_DPCM:
263 124 out = buf_size - 6 - avctx->ch_layout.nb_channels;
264 124 break;
265 111 case AV_CODEC_ID_XAN_DPCM:
266 111 out = buf_size - 2 * avctx->ch_layout.nb_channels;
267 111 break;
268 74 case AV_CODEC_ID_SOL_DPCM:
269
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 74 times.
74 if (avctx->codec_tag != 3)
270 ✗ out = buf_size * 2;
271 else
272 74 out = buf_size;
273 74 break;
274 ✗ case AV_CODEC_ID_WADY_DPCM:
275 case AV_CODEC_ID_DERF_DPCM:
276 case AV_CODEC_ID_GREMLIN_DPCM:
277 case AV_CODEC_ID_CBD2_DPCM:
278 case AV_CODEC_ID_SDX2_DPCM:
279 ✗ out = buf_size;
280 ✗ break;
281 }
282
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 649 times.
649 if (out <= 0) {
283 ✗ av_log(avctx, AV_LOG_ERROR, "packet is too small\n");
284 ✗ return AVERROR(EINVAL);
285 }
286
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 649 times.
649 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 649 frame->nb_samples = (out + avctx->ch_layout.nb_channels - 1) / avctx->ch_layout.nb_channels;
292
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 649 times.
649 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
293 ✗ return ret;
294 649 output_samples = (int16_t *)frame->data[0];
295 649 samples_end = output_samples + out;
296
297
4/9
✓ Branch 0 taken 340 times.
✓ Branch 1 taken 124 times.
✓ Branch 2 taken 111 times.
✓ Branch 3 taken 74 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
649 switch(avctx->codec->id) {
298
299 340 case AV_CODEC_ID_ROQ_DPCM:
300 340 bytestream2_skipu(&gb, 6);
301
302
1/2
✓ Branch 0 taken 340 times.
✗ Branch 1 not taken.
340 if (stereo) {
303 340 predictor[1] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16);
304 340 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
2/2
✓ Branch 0 taken 522900 times.
✓ Branch 1 taken 340 times.
523240 while (output_samples < samples_end) {
311 522900 predictor[ch] += s->array[bytestream2_get_byteu(&gb)];
312 522900 predictor[ch] = av_clip_int16(predictor[ch]);
313 522900 *output_samples++ = predictor[ch];
314
315 /* toggle channel */
316 522900 ch ^= stereo;
317 }
318 340 break;
319
320 124 case AV_CODEC_ID_INTERPLAY_DPCM:
321 124 bytestream2_skipu(&gb, 6); /* skip over the stream mask and stream length */
322
323
2/2
✓ Branch 0 taken 248 times.
✓ Branch 1 taken 124 times.
372 for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) {
324 248 predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
325 248 *output_samples++ = predictor[ch];
326 }
327
328 124 ch = 0;
329
2/2
✓ Branch 0 taken 364628 times.
✓ Branch 1 taken 124 times.
364752 while (output_samples < samples_end) {
330 364628 predictor[ch] += interplay_delta_table[bytestream2_get_byteu(&gb)];
331 364628 predictor[ch] = av_clip_int16(predictor[ch]);
332 364628 *output_samples++ = predictor[ch];
333
334 /* toggle channel */
335 364628 ch ^= stereo;
336 }
337 124 break;
338
339 111 case AV_CODEC_ID_XAN_DPCM:
340 {
341 111 int shift[2] = { 4, 4 };
342
343
2/2
✓ Branch 0 taken 222 times.
✓ Branch 1 taken 111 times.
333 for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++)
344 222 predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
345
346 111 ch = 0;
347
2/2
✓ Branch 0 taken 326118 times.
✓ Branch 1 taken 111 times.
326229 while (output_samples < samples_end) {
348 326118 int diff = bytestream2_get_byteu(&gb);
349 326118 int n = diff & 3;
350
351
2/2
✓ Branch 0 taken 134940 times.
✓ Branch 1 taken 191178 times.
326118 if (n == 3)
352 134940 shift[ch]++;
353 else
354 191178 shift[ch] -= (2 * n);
355 326118 diff = sign_extend((diff &~ 3) << 8, 16);
356
357 /* saturate the shifter to 0..31 */
358 326118 shift[ch] = av_clip_uintp2(shift[ch], 5);
359
360 326118 diff >>= shift[ch];
361 326118 predictor[ch] += diff;
362
363 326118 predictor[ch] = av_clip_int16(predictor[ch]);
364 326118 *output_samples++ = predictor[ch];
365
366 /* toggle channel */
367 326118 ch ^= stereo;
368 }
369 111 break;
370 }
371 74 case AV_CODEC_ID_SOL_DPCM:
372
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 74 times.
74 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
2/2
✓ Branch 0 taken 299438 times.
✓ Branch 1 taken 74 times.
299512 while (output_samples < samples_end) {
388 299438 int n = bytestream2_get_byteu(&gb);
389
2/2
✓ Branch 0 taken 148874 times.
✓ Branch 1 taken 150564 times.
299438 if (n & 0x80) s->sample[ch] -= sol_table_16[n & 0x7F];
390 150564 else s->sample[ch] += sol_table_16[n & 0x7F];
391 299438 s->sample[ch] = av_clip_int16(s->sample[ch]);
392 299438 *output_samples++ = s->sample[ch];
393 /* toggle channel */
394 299438 ch ^= stereo;
395 }
396 }
397 74 break;
398
399 ✗ case AV_CODEC_ID_CBD2_DPCM:
400 case AV_CODEC_ID_SDX2_DPCM:
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
413 ✗ case AV_CODEC_ID_GREMLIN_DPCM: {
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
425 ✗ case AV_CODEC_ID_DERF_DPCM: {
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
440 ✗ case AV_CODEC_ID_WADY_DPCM: {
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 649 *got_frame_ptr = 1;
458
459 649 return avpkt->size;
460 }
461
462 ✗ static av_cold void dpcm_flush(AVCodecContext *avctx)
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) \
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");
491