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 "internal.h"
43 #include "bytestream.h"
44 
45 typedef struct DPCMContext {
47  int channels;
48  int16_t roq_square_array[256];
49  int sample[2];
50  const int8_t *sol_table;
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_INFO, "invalid number of channels\n");
123  return AVERROR(EINVAL);
124  }
125 
126  s->channels = avctx->channels;
127  s->sample[0] = s->sample[1] = 0;
128 
129  switch(avctx->codec->id) {
130 
131  case CODEC_ID_ROQ_DPCM:
132  /* initialize square table */
133  for (i = 0; i < 128; i++) {
134  int16_t square = i * i;
135  s->roq_square_array[i ] = square;
136  s->roq_square_array[i + 128] = -square;
137  }
138  break;
139 
140  case CODEC_ID_SOL_DPCM:
141  switch(avctx->codec_tag){
142  case 1:
144  s->sample[0] = s->sample[1] = 0x80;
145  break;
146  case 2:
148  s->sample[0] = s->sample[1] = 0x80;
149  break;
150  case 3:
151  break;
152  default:
153  av_log(avctx, AV_LOG_ERROR, "Unknown SOL subcodec\n");
154  return -1;
155  }
156  break;
157 
158  default:
159  break;
160  }
161 
162  if (avctx->codec->id == CODEC_ID_SOL_DPCM && avctx->codec_tag != 3)
163  avctx->sample_fmt = AV_SAMPLE_FMT_U8;
164  else
165  avctx->sample_fmt = AV_SAMPLE_FMT_S16;
166 
168  avctx->coded_frame = &s->frame;
169 
170  return 0;
171 }
172 
173 
174 static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
175  int *got_frame_ptr, AVPacket *avpkt)
176 {
177  const uint8_t *buf = avpkt->data;
178  int buf_size = avpkt->size;
179  const uint8_t *buf_end = buf + buf_size;
180  DPCMContext *s = avctx->priv_data;
181  int out = 0, ret;
182  int predictor[2];
183  int ch = 0;
184  int stereo = s->channels - 1;
185  int16_t *output_samples;
186 
187  if (stereo && (buf_size & 1)) {
188  buf_size--;
189  buf_end--;
190  }
191 
192  /* calculate output size */
193  switch(avctx->codec->id) {
194  case CODEC_ID_ROQ_DPCM:
195  out = buf_size - 8;
196  break;
198  out = buf_size - 6 - s->channels;
199  break;
200  case CODEC_ID_XAN_DPCM:
201  out = buf_size - 2 * s->channels;
202  break;
203  case CODEC_ID_SOL_DPCM:
204  if (avctx->codec_tag != 3)
205  out = buf_size * 2;
206  else
207  out = buf_size;
208  break;
209  }
210  if (out <= 0) {
211  av_log(avctx, AV_LOG_ERROR, "packet is too small\n");
212  return AVERROR(EINVAL);
213  }
214 
215  /* get output buffer */
216  s->frame.nb_samples = out / s->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 
223  switch(avctx->codec->id) {
224 
225  case CODEC_ID_ROQ_DPCM:
226  buf += 6;
227 
228  if (stereo) {
229  predictor[1] = (int16_t)(bytestream_get_byte(&buf) << 8);
230  predictor[0] = (int16_t)(bytestream_get_byte(&buf) << 8);
231  } else {
232  predictor[0] = (int16_t)bytestream_get_le16(&buf);
233  }
234 
235  /* decode the samples */
236  while (buf < buf_end) {
237  predictor[ch] += s->roq_square_array[*buf++];
238  predictor[ch] = av_clip_int16(predictor[ch]);
239  *output_samples++ = predictor[ch];
240 
241  /* toggle channel */
242  ch ^= stereo;
243  }
244  break;
245 
247  buf += 6; /* skip over the stream mask and stream length */
248 
249  for (ch = 0; ch < s->channels; ch++) {
250  predictor[ch] = (int16_t)bytestream_get_le16(&buf);
251  *output_samples++ = predictor[ch];
252  }
253 
254  ch = 0;
255  while (buf < buf_end) {
256  predictor[ch] += interplay_delta_table[*buf++];
257  predictor[ch] = av_clip_int16(predictor[ch]);
258  *output_samples++ = predictor[ch];
259 
260  /* toggle channel */
261  ch ^= stereo;
262  }
263  break;
264 
265  case CODEC_ID_XAN_DPCM:
266  {
267  int shift[2] = { 4, 4 };
268 
269  for (ch = 0; ch < s->channels; ch++)
270  predictor[ch] = (int16_t)bytestream_get_le16(&buf);
271 
272  ch = 0;
273  while (buf < buf_end) {
274  uint8_t n = *buf++;
275  int16_t diff = (n & 0xFC) << 8;
276  if ((n & 0x03) == 3)
277  shift[ch]++;
278  else
279  shift[ch] -= (2 * (n & 3));
280  /* saturate the shifter to a lower limit of 0 */
281  if (shift[ch] < 0)
282  shift[ch] = 0;
283 
284  diff >>= shift[ch];
285  predictor[ch] += diff;
286 
287  predictor[ch] = av_clip_int16(predictor[ch]);
288  *output_samples++ = predictor[ch];
289 
290  /* toggle channel */
291  ch ^= stereo;
292  }
293  break;
294  }
295  case CODEC_ID_SOL_DPCM:
296  if (avctx->codec_tag != 3) {
297  uint8_t *output_samples_u8 = s->frame.data[0];
298  while (buf < buf_end) {
299  uint8_t n = *buf++;
300 
301  s->sample[0] += s->sol_table[n >> 4];
302  s->sample[0] = av_clip_uint8(s->sample[0]);
303  *output_samples_u8++ = s->sample[0];
304 
305  s->sample[stereo] += s->sol_table[n & 0x0F];
306  s->sample[stereo] = av_clip_uint8(s->sample[stereo]);
307  *output_samples_u8++ = s->sample[stereo];
308  }
309  } else {
310  while (buf < buf_end) {
311  uint8_t n = *buf++;
312  if (n & 0x80) s->sample[ch] -= sol_table_16[n & 0x7F];
313  else s->sample[ch] += sol_table_16[n & 0x7F];
314  s->sample[ch] = av_clip_int16(s->sample[ch]);
315  *output_samples++ = s->sample[ch];
316  /* toggle channel */
317  ch ^= stereo;
318  }
319  }
320  break;
321  }
322 
323  *got_frame_ptr = 1;
324  *(AVFrame *)data = s->frame;
325 
326  return avpkt->size;
327 }
328 
329 #define DPCM_DECODER(id_, name_, long_name_) \
330 AVCodec ff_ ## name_ ## _decoder = { \
331  .name = #name_, \
332  .type = AVMEDIA_TYPE_AUDIO, \
333  .id = id_, \
334  .priv_data_size = sizeof(DPCMContext), \
335  .init = dpcm_decode_init, \
336  .decode = dpcm_decode_frame, \
337  .capabilities = CODEC_CAP_DR1, \
338  .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
339 }
340 
341 DPCM_DECODER(CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay");
342 DPCM_DECODER(CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ");
343 DPCM_DECODER(CODEC_ID_SOL_DPCM, sol_dpcm, "DPCM Sol");
344 DPCM_DECODER(CODEC_ID_XAN_DPCM, xan_dpcm, "DPCM Xan");