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