FFmpeg
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
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 "libavutil/intreadwrite.h"
41 #include "avcodec.h"
42 #include "bytestream.h"
43 #include "internal.h"
44 #include "mathops.h"
45 
46 typedef struct DPCMContext {
48  int16_t roq_square_array[256];
49  int sample[2]; ///< previous sample (for SOL_DPCM)
50  const int8_t *sol_table; ///< delta table for SOL_DPCM
51 } DPCMContext;
52 
53 static const int16_t interplay_delta_table[] = {
54  0, 1, 2, 3, 4, 5, 6, 7,
55  8, 9, 10, 11, 12, 13, 14, 15,
56  16, 17, 18, 19, 20, 21, 22, 23,
57  24, 25, 26, 27, 28, 29, 30, 31,
58  32, 33, 34, 35, 36, 37, 38, 39,
59  40, 41, 42, 43, 47, 51, 56, 61,
60  66, 72, 79, 86, 94, 102, 112, 122,
61  133, 145, 158, 173, 189, 206, 225, 245,
62  267, 292, 318, 348, 379, 414, 452, 493,
63  538, 587, 640, 699, 763, 832, 908, 991,
64  1081, 1180, 1288, 1405, 1534, 1673, 1826, 1993,
65  2175, 2373, 2590, 2826, 3084, 3365, 3672, 4008,
66  4373, 4772, 5208, 5683, 6202, 6767, 7385, 8059,
67  8794, 9597, 10472, 11428, 12471, 13609, 14851, 16206,
68  17685, 19298, 21060, 22981, 25078, 27367, 29864, 32589,
69  -29973, -26728, -23186, -19322, -15105, -10503, -5481, -1,
70  1, 1, 5481, 10503, 15105, 19322, 23186, 26728,
71  29973, -32589, -29864, -27367, -25078, -22981, -21060, -19298,
72  -17685, -16206, -14851, -13609, -12471, -11428, -10472, -9597,
73  -8794, -8059, -7385, -6767, -6202, -5683, -5208, -4772,
74  -4373, -4008, -3672, -3365, -3084, -2826, -2590, -2373,
75  -2175, -1993, -1826, -1673, -1534, -1405, -1288, -1180,
76  -1081, -991, -908, -832, -763, -699, -640, -587,
77  -538, -493, -452, -414, -379, -348, -318, -292,
78  -267, -245, -225, -206, -189, -173, -158, -145,
79  -133, -122, -112, -102, -94, -86, -79, -72,
80  -66, -61, -56, -51, -47, -43, -42, -41,
81  -40, -39, -38, -37, -36, -35, -34, -33,
82  -32, -31, -30, -29, -28, -27, -26, -25,
83  -24, -23, -22, -21, -20, -19, -18, -17,
84  -16, -15, -14, -13, -12, -11, -10, -9,
85  -8, -7, -6, -5, -4, -3, -2, -1
86 
87 };
88 
89 static const int8_t sol_table_old[16] = {
90  0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
91  -0x15, -0xF, -0xA, -0x6, -0x3, -0x2, -0x1, 0x0
92 };
93 
94 static const int8_t sol_table_new[16] = {
95  0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
96  0x0, -0x1, -0x2, -0x3, -0x6, -0xA, -0xF, -0x15
97 };
98 
99 static const int16_t sol_table_16[128] = {
100  0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080,
101  0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120,
102  0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0,
103  0x1D0, 0x1E0, 0x1F0, 0x200, 0x208, 0x210, 0x218, 0x220, 0x228, 0x230,
104  0x238, 0x240, 0x248, 0x250, 0x258, 0x260, 0x268, 0x270, 0x278, 0x280,
105  0x288, 0x290, 0x298, 0x2A0, 0x2A8, 0x2B0, 0x2B8, 0x2C0, 0x2C8, 0x2D0,
106  0x2D8, 0x2E0, 0x2E8, 0x2F0, 0x2F8, 0x300, 0x308, 0x310, 0x318, 0x320,
107  0x328, 0x330, 0x338, 0x340, 0x348, 0x350, 0x358, 0x360, 0x368, 0x370,
108  0x378, 0x380, 0x388, 0x390, 0x398, 0x3A0, 0x3A8, 0x3B0, 0x3B8, 0x3C0,
109  0x3C8, 0x3D0, 0x3D8, 0x3E0, 0x3E8, 0x3F0, 0x3F8, 0x400, 0x440, 0x480,
110  0x4C0, 0x500, 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700,
111  0x740, 0x780, 0x7C0, 0x800, 0x900, 0xA00, 0xB00, 0xC00, 0xD00, 0xE00,
112  0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000
113 };
114 
115 
117 {
118  DPCMContext *s = avctx->priv_data;
119  int i;
120 
121  if (avctx->channels < 1 || avctx->channels > 2) {
122  av_log(avctx, AV_LOG_ERROR, "invalid number of channels\n");
123  return AVERROR(EINVAL);
124  }
125 
126  s->sample[0] = s->sample[1] = 0;
127 
128  switch(avctx->codec->id) {
129 
131  /* initialize square table */
132  for (i = 0; i < 128; i++) {
133  int16_t square = i * i;
134  s->roq_square_array[i ] = square;
135  s->roq_square_array[i + 128] = -square;
136  }
137  break;
138 
140  switch(avctx->codec_tag){
141  case 1:
143  s->sample[0] = s->sample[1] = 0x80;
144  break;
145  case 2:
147  s->sample[0] = s->sample[1] = 0x80;
148  break;
149  case 3:
150  break;
151  default:
152  av_log(avctx, AV_LOG_ERROR, "Unknown SOL subcodec\n");
153  return -1;
154  }
155  break;
156 
157  default:
158  break;
159  }
160 
161  if (avctx->codec->id == AV_CODEC_ID_SOL_DPCM && avctx->codec_tag != 3)
162  avctx->sample_fmt = AV_SAMPLE_FMT_U8;
163  else
164  avctx->sample_fmt = AV_SAMPLE_FMT_S16;
165 
167  avctx->coded_frame = &s->frame;
168 
169  return 0;
170 }
171 
172 
173 static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
174  int *got_frame_ptr, AVPacket *avpkt)
175 {
176  int buf_size = avpkt->size;
177  DPCMContext *s = avctx->priv_data;
178  int out = 0, ret;
179  int predictor[2];
180  int ch = 0;
181  int stereo = avctx->channels - 1;
182  int16_t *output_samples, *samples_end;
183  GetByteContext gb;
184 
185  if (stereo && (buf_size & 1))
186  buf_size--;
187  bytestream2_init(&gb, avpkt->data, buf_size);
188 
189  /* calculate output size */
190  switch(avctx->codec->id) {
192  out = buf_size - 8;
193  break;
195  out = buf_size - 6 - avctx->channels;
196  break;
198  out = buf_size - 2 * avctx->channels;
199  break;
201  if (avctx->codec_tag != 3)
202  out = buf_size * 2;
203  else
204  out = buf_size;
205  break;
206  }
207  if (out <= 0) {
208  av_log(avctx, AV_LOG_ERROR, "packet is too small\n");
209  return AVERROR(EINVAL);
210  }
211  if (out % avctx->channels) {
212  av_log(avctx, AV_LOG_WARNING, "channels have differing number of samples\n");
213  }
214 
215  /* get output buffer */
216  s->frame.nb_samples = (out + avctx->channels - 1) / avctx->channels;
217  if ((ret = ff_get_buffer(avctx, &s->frame)) < 0) {
218  av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
219  return ret;
220  }
221  output_samples = (int16_t *)s->frame.data[0];
222  samples_end = output_samples + out;
223 
224  switch(avctx->codec->id) {
225 
227  bytestream2_skipu(&gb, 6);
228 
229  if (stereo) {
230  predictor[1] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16);
231  predictor[0] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16);
232  } else {
233  predictor[0] = sign_extend(bytestream2_get_le16u(&gb), 16);
234  }
235 
236  /* decode the samples */
237  while (output_samples < samples_end) {
238  predictor[ch] += s->roq_square_array[bytestream2_get_byteu(&gb)];
239  predictor[ch] = av_clip_int16(predictor[ch]);
240  *output_samples++ = predictor[ch];
241 
242  /* toggle channel */
243  ch ^= stereo;
244  }
245  break;
246 
248  bytestream2_skipu(&gb, 6); /* skip over the stream mask and stream length */
249 
250  for (ch = 0; ch < avctx->channels; ch++) {
251  predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
252  *output_samples++ = predictor[ch];
253  }
254 
255  ch = 0;
256  while (output_samples < samples_end) {
257  predictor[ch] += interplay_delta_table[bytestream2_get_byteu(&gb)];
258  predictor[ch] = av_clip_int16(predictor[ch]);
259  *output_samples++ = predictor[ch];
260 
261  /* toggle channel */
262  ch ^= stereo;
263  }
264  break;
265 
267  {
268  int shift[2] = { 4, 4 };
269 
270  for (ch = 0; ch < avctx->channels; ch++)
271  predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
272 
273  ch = 0;
274  while (output_samples < samples_end) {
275  int diff = bytestream2_get_byteu(&gb);
276  int n = diff & 3;
277 
278  if (n == 3)
279  shift[ch]++;
280  else
281  shift[ch] -= (2 * n);
282  diff = sign_extend((diff &~ 3) << 8, 16);
283 
284  /* saturate the shifter to a lower limit of 0 */
285  if (shift[ch] < 0)
286  shift[ch] = 0;
287 
288  diff >>= shift[ch];
289  predictor[ch] += diff;
290 
291  predictor[ch] = av_clip_int16(predictor[ch]);
292  *output_samples++ = predictor[ch];
293 
294  /* toggle channel */
295  ch ^= stereo;
296  }
297  break;
298  }
300  if (avctx->codec_tag != 3) {
301  uint8_t *output_samples_u8 = s->frame.data[0],
302  *samples_end_u8 = output_samples_u8 + out;
303  while (output_samples_u8 < samples_end_u8) {
304  int n = bytestream2_get_byteu(&gb);
305 
306  s->sample[0] += s->sol_table[n >> 4];
307  s->sample[0] = av_clip_uint8(s->sample[0]);
308  *output_samples_u8++ = s->sample[0];
309 
310  s->sample[stereo] += s->sol_table[n & 0x0F];
311  s->sample[stereo] = av_clip_uint8(s->sample[stereo]);
312  *output_samples_u8++ = s->sample[stereo];
313  }
314  } else {
315  while (output_samples < samples_end) {
316  int n = bytestream2_get_byteu(&gb);
317  if (n & 0x80) s->sample[ch] -= sol_table_16[n & 0x7F];
318  else s->sample[ch] += sol_table_16[n & 0x7F];
319  s->sample[ch] = av_clip_int16(s->sample[ch]);
320  *output_samples++ = s->sample[ch];
321  /* toggle channel */
322  ch ^= stereo;
323  }
324  }
325  break;
326  }
327 
328  *got_frame_ptr = 1;
329  *(AVFrame *)data = s->frame;
330 
331  return avpkt->size;
332 }
333 
334 #define DPCM_DECODER(id_, name_, long_name_) \
335 AVCodec ff_ ## name_ ## _decoder = { \
336  .name = #name_, \
337  .type = AVMEDIA_TYPE_AUDIO, \
338  .id = id_, \
339  .priv_data_size = sizeof(DPCMContext), \
340  .init = dpcm_decode_init, \
341  .decode = dpcm_decode_frame, \
342  .capabilities = CODEC_CAP_DR1, \
343  .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
344 }
345 
346 DPCM_DECODER(AV_CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay");
347 DPCM_DECODER(AV_CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ");
348 DPCM_DECODER(AV_CODEC_ID_SOL_DPCM, sol_dpcm, "DPCM Sol");
349 DPCM_DECODER(AV_CODEC_ID_XAN_DPCM, xan_dpcm, "DPCM Xan");