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 #include "internal.h"
44 #include "mathops.h"
45 
46 typedef struct DPCMContext {
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->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 
212  /* get output buffer */
213  s->frame.nb_samples = out / avctx->channels;
214  if ((ret = ff_get_buffer(avctx, &s->frame)) < 0) {
215  av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
216  return ret;
217  }
218  output_samples = (int16_t *)s->frame.data[0];
219  samples_end = output_samples + out;
220 
221  switch(avctx->codec->id) {
222 
224  bytestream2_skipu(&gb, 6);
225 
226  if (stereo) {
227  predictor[1] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16);
228  predictor[0] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16);
229  } else {
230  predictor[0] = sign_extend(bytestream2_get_le16u(&gb), 16);
231  }
232 
233  /* decode the samples */
234  while (output_samples < samples_end) {
235  predictor[ch] += s->roq_square_array[bytestream2_get_byteu(&gb)];
236  predictor[ch] = av_clip_int16(predictor[ch]);
237  *output_samples++ = predictor[ch];
238 
239  /* toggle channel */
240  ch ^= stereo;
241  }
242  break;
243 
245  bytestream2_skipu(&gb, 6); /* skip over the stream mask and stream length */
246 
247  for (ch = 0; ch < avctx->channels; ch++) {
248  predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
249  *output_samples++ = predictor[ch];
250  }
251 
252  ch = 0;
253  while (output_samples < samples_end) {
254  predictor[ch] += interplay_delta_table[bytestream2_get_byteu(&gb)];
255  predictor[ch] = av_clip_int16(predictor[ch]);
256  *output_samples++ = predictor[ch];
257 
258  /* toggle channel */
259  ch ^= stereo;
260  }
261  break;
262 
264  {
265  int shift[2] = { 4, 4 };
266 
267  for (ch = 0; ch < avctx->channels; ch++)
268  predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
269 
270  ch = 0;
271  while (output_samples < samples_end) {
272  int diff = bytestream2_get_byteu(&gb);
273  int n = diff & 3;
274 
275  if (n == 3)
276  shift[ch]++;
277  else
278  shift[ch] -= (2 * n);
279  diff = sign_extend((diff &~ 3) << 8, 16);
280 
281  /* saturate the shifter to a lower limit of 0 */
282  if (shift[ch] < 0)
283  shift[ch] = 0;
284 
285  diff >>= shift[ch];
286  predictor[ch] += diff;
287 
288  predictor[ch] = av_clip_int16(predictor[ch]);
289  *output_samples++ = predictor[ch];
290 
291  /* toggle channel */
292  ch ^= stereo;
293  }
294  break;
295  }
297  if (avctx->codec_tag != 3) {
298  uint8_t *output_samples_u8 = s->frame.data[0],
299  *samples_end_u8 = output_samples_u8 + out;
300  while (output_samples_u8 < samples_end_u8) {
301  int n = bytestream2_get_byteu(&gb);
302 
303  s->sample[0] += s->sol_table[n >> 4];
304  s->sample[0] = av_clip_uint8(s->sample[0]);
305  *output_samples_u8++ = s->sample[0];
306 
307  s->sample[stereo] += s->sol_table[n & 0x0F];
308  s->sample[stereo] = av_clip_uint8(s->sample[stereo]);
309  *output_samples_u8++ = s->sample[stereo];
310  }
311  } else {
312  while (output_samples < samples_end) {
313  int n = bytestream2_get_byteu(&gb);
314  if (n & 0x80) s->sample[ch] -= sol_table_16[n & 0x7F];
315  else s->sample[ch] += sol_table_16[n & 0x7F];
316  s->sample[ch] = av_clip_int16(s->sample[ch]);
317  *output_samples++ = s->sample[ch];
318  /* toggle channel */
319  ch ^= stereo;
320  }
321  }
322  break;
323  }
324 
325  *got_frame_ptr = 1;
326  *(AVFrame *)data = s->frame;
327 
328  return avpkt->size;
329 }
330 
331 #define DPCM_DECODER(id_, name_, long_name_) \
332 AVCodec ff_ ## name_ ## _decoder = { \
333  .name = #name_, \
334  .type = AVMEDIA_TYPE_AUDIO, \
335  .id = id_, \
336  .priv_data_size = sizeof(DPCMContext), \
337  .init = dpcm_decode_init, \
338  .decode = dpcm_decode_frame, \
339  .capabilities = CODEC_CAP_DR1, \
340  .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
341 }
342 
343 DPCM_DECODER(AV_CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay");
344 DPCM_DECODER(AV_CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ");
345 DPCM_DECODER(AV_CODEC_ID_SOL_DPCM, sol_dpcm, "DPCM Sol");
346 DPCM_DECODER(AV_CODEC_ID_XAN_DPCM, xan_dpcm, "DPCM Xan");
const struct AVCodec * codec
Definition: avcodec.h:1348
int16_t roq_square_array[256]
Definition: dpcm.c:48
This structure describes decoded (raw) audio or video data.
Definition: avcodec.h:989
static const int8_t sol_table_old[16]
Definition: dpcm.c:89
AVFrame frame
Definition: dpcm.c:47
AVFrame * coded_frame
the picture in the bitstream
Definition: avcodec.h:2725
int size
Definition: avcodec.h:916
const int8_t * sol_table
delta table for SOL_DPCM
Definition: dpcm.c:50
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:130
signed 16 bits
Definition: samplefmt.h:52
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:2112
uint8_t
AV_SAMPLE_FMT_U8
static const int16_t interplay_delta_table[]
Definition: dpcm.c:53
const char data[16]
Definition: mxf.c:66
uint8_t * data
Definition: avcodec.h:915
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
Definition: bytestream.h:165
enum AVCodecID id
Definition: avcodec.h:2974
static const int8_t sol_table_new[16]
Definition: dpcm.c:94
static int dpcm_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
Definition: dpcm.c:173
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:146
static int square(int x)
Definition: roqvideoenc.c:111
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame)
Get a buffer for a frame.
Definition: utils.c:464
external API header
static const int16_t sol_table_16[128]
Definition: dpcm.c:99
main external API structure.
Definition: avcodec.h:1339
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
Definition: avcodec.h:1365
void avcodec_get_frame_defaults(AVFrame *frame)
Set the fields of the given AVFrame to default values.
Definition: utils.c:604
static av_const int sign_extend(int val, unsigned bits)
Definition: mathops.h:123
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: avcodec.h:997
#define DPCM_DECODER(id_, name_, long_name_)
Definition: dpcm.c:331
common internal api header.
static av_cold int dpcm_decode_init(AVCodecContext *avctx)
Definition: dpcm.c:116
void * priv_data
Definition: avcodec.h:1382
struct DPCMContext DPCMContext
int channels
number of audio channels
Definition: avcodec.h:2105
This structure stores compressed data.
Definition: avcodec.h:898
int sample[2]
previous sample (for SOL_DPCM)
Definition: dpcm.c:49
int nb_samples
number of audio samples (per channel) described by this frame
Definition: avcodec.h:1042