dpcm: consistently use the variable name 'n' for the next input byte.
[ffmpeg.git] / libavcodec / dpcm.c
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
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
43 typedef struct DPCMContext {
44     int channels;
45     short roq_square_array[256];
46     int sample[2];                  ///< previous sample (for SOL_DPCM)
47     const int *sol_table;//for SOL_DPCM
48 } DPCMContext;
49
50 #define SE_16BIT(x)  if (x & 0x8000) x -= 0x10000;
51
52 static const int 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 int sol_table_old[16] =
89     { 0x0,  0x1,  0x2 , 0x3,  0x6,  0xA,  0xF, 0x15,
90     -0x15, -0xF, -0xA, -0x6, -0x3, -0x2, -0x1, 0x0};
91
92 static const int sol_table_new[16] =
93     { 0x0,  0x1,  0x2,  0x3,  0x6,  0xA,  0xF,  0x15,
94       0x0, -0x1, -0x2, -0x3, -0x6, -0xA, -0xF, -0x15};
95
96 static const int sol_table_16[128] = {
97     0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080,
98     0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120,
99     0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0,
100     0x1D0, 0x1E0, 0x1F0, 0x200, 0x208, 0x210, 0x218, 0x220, 0x228, 0x230,
101     0x238, 0x240, 0x248, 0x250, 0x258, 0x260, 0x268, 0x270, 0x278, 0x280,
102     0x288, 0x290, 0x298, 0x2A0, 0x2A8, 0x2B0, 0x2B8, 0x2C0, 0x2C8, 0x2D0,
103     0x2D8, 0x2E0, 0x2E8, 0x2F0, 0x2F8, 0x300, 0x308, 0x310, 0x318, 0x320,
104     0x328, 0x330, 0x338, 0x340, 0x348, 0x350, 0x358, 0x360, 0x368, 0x370,
105     0x378, 0x380, 0x388, 0x390, 0x398, 0x3A0, 0x3A8, 0x3B0, 0x3B8, 0x3C0,
106     0x3C8, 0x3D0, 0x3D8, 0x3E0, 0x3E8, 0x3F0, 0x3F8, 0x400, 0x440, 0x480,
107     0x4C0, 0x500, 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700,
108     0x740, 0x780, 0x7C0, 0x800, 0x900, 0xA00, 0xB00, 0xC00, 0xD00, 0xE00,
109     0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000
110 };
111
112
113
114 static av_cold int dpcm_decode_init(AVCodecContext *avctx)
115 {
116     DPCMContext *s = avctx->priv_data;
117     int i;
118     short square;
119
120     s->channels = avctx->channels;
121     s->sample[0] = s->sample[1] = 0;
122
123     switch(avctx->codec->id) {
124
125     case CODEC_ID_ROQ_DPCM:
126         /* initialize square table */
127         for (i = 0; i < 128; i++) {
128             square = i * i;
129             s->roq_square_array[i] = square;
130             s->roq_square_array[i + 128] = -square;
131         }
132         break;
133
134
135     case CODEC_ID_SOL_DPCM:
136         switch(avctx->codec_tag){
137         case 1:
138             s->sol_table=sol_table_old;
139             s->sample[0] = s->sample[1] = 0x80;
140             break;
141         case 2:
142             s->sol_table=sol_table_new;
143             s->sample[0] = s->sample[1] = 0x80;
144             break;
145         case 3:
146             s->sol_table=sol_table_16;
147             break;
148         default:
149             av_log(avctx, AV_LOG_ERROR, "Unknown SOL subcodec\n");
150             return -1;
151         }
152         break;
153
154     default:
155         break;
156     }
157
158     if (avctx->codec->id == CODEC_ID_SOL_DPCM && avctx->codec_tag != 3)
159         avctx->sample_fmt = AV_SAMPLE_FMT_U8;
160     else
161         avctx->sample_fmt = AV_SAMPLE_FMT_S16;
162
163     return 0;
164 }
165
166 static int dpcm_decode_frame(AVCodecContext *avctx,
167                              void *data, int *data_size,
168                              AVPacket *avpkt)
169 {
170     const uint8_t *buf = avpkt->data;
171     int buf_size = avpkt->size;
172     DPCMContext *s = avctx->priv_data;
173     int in, out = 0;
174     int predictor[2];
175     int ch = 0;
176     int stereo = s->channels - 1;
177     short *output_samples = data;
178     int shift[2];
179     short diff;
180
181     if (!buf_size)
182         return 0;
183
184     /* calculate output size */
185     switch(avctx->codec->id) {
186     case CODEC_ID_ROQ_DPCM:
187         out = buf_size - 8;
188         break;
189     case CODEC_ID_INTERPLAY_DPCM:
190         out = buf_size - 6 - s->channels;
191         break;
192     case CODEC_ID_XAN_DPCM:
193         out = buf_size - 2 * s->channels;
194         break;
195     case CODEC_ID_SOL_DPCM:
196         if (avctx->codec_tag != 3)
197             out = buf_size * 2;
198         else
199             out = buf_size;
200         break;
201     }
202     out *= av_get_bytes_per_sample(avctx->sample_fmt);
203
204     if (*data_size < out) {
205         av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n");
206         return AVERROR(EINVAL);
207     }
208
209     switch(avctx->codec->id) {
210
211     case CODEC_ID_ROQ_DPCM:
212         if (stereo) {
213             predictor[0] = buf[7] << 8;
214             predictor[1] = buf[6] << 8;
215         } else {
216             predictor[0] = AV_RL16(&buf[6]);
217         }
218         SE_16BIT(predictor[0]);
219         SE_16BIT(predictor[1]);
220
221         /* decode the samples */
222         for (in = 8; in < buf_size; in++) {
223             predictor[ch] += s->roq_square_array[buf[in]];
224             predictor[ch] = av_clip_int16(predictor[ch]);
225             *output_samples++ = predictor[ch];
226
227             /* toggle channel */
228             ch ^= stereo;
229         }
230         break;
231
232     case CODEC_ID_INTERPLAY_DPCM:
233         in = 6;  /* skip over the stream mask and stream length */
234         predictor[0] = AV_RL16(&buf[in]);
235         in += 2;
236         SE_16BIT(predictor[0])
237         *output_samples++ = predictor[0];
238         if (stereo) {
239             predictor[1] = AV_RL16(&buf[in]);
240             in += 2;
241             SE_16BIT(predictor[1])
242             *output_samples++ = predictor[1];
243         }
244
245         while (in < buf_size) {
246             predictor[ch] += interplay_delta_table[buf[in++]];
247             predictor[ch] = av_clip_int16(predictor[ch]);
248             *output_samples++ = predictor[ch];
249
250             /* toggle channel */
251             ch ^= stereo;
252         }
253         break;
254
255     case CODEC_ID_XAN_DPCM:
256         in = 0;
257         shift[0] = shift[1] = 4;
258         predictor[0] = AV_RL16(&buf[in]);
259         in += 2;
260         SE_16BIT(predictor[0]);
261         if (stereo) {
262             predictor[1] = AV_RL16(&buf[in]);
263             in += 2;
264             SE_16BIT(predictor[1]);
265         }
266
267         while (in < buf_size) {
268             uint8_t n = buf[in++];
269             diff = (n & 0xFC) << 8;
270             if ((n & 0x03) == 3)
271                 shift[ch]++;
272             else
273                 shift[ch] -= (2 * (n & 3));
274             /* saturate the shifter to a lower limit of 0 */
275             if (shift[ch] < 0)
276                 shift[ch] = 0;
277
278             diff >>= shift[ch];
279             predictor[ch] += diff;
280
281             predictor[ch] = av_clip_int16(predictor[ch]);
282             *output_samples++ = predictor[ch];
283
284             /* toggle channel */
285             ch ^= stereo;
286         }
287         break;
288     case CODEC_ID_SOL_DPCM:
289         in = 0;
290         if (avctx->codec_tag != 3) {
291             uint8_t *output_samples_u8 = data;
292             while (in < buf_size) {
293                 uint8_t n = buf[in++];
294
295                 s->sample[0] += s->sol_table[n >> 4];
296                 s->sample[0]  = av_clip_uint8(s->sample[0]);
297                 *output_samples_u8++ = s->sample[0];
298
299                 s->sample[stereo] += s->sol_table[n & 0x0F];
300                 s->sample[stereo]  = av_clip_uint8(s->sample[stereo]);
301                 *output_samples_u8++ = s->sample[stereo];
302             }
303         } else {
304             while (in < buf_size) {
305                 uint8_t n = buf[in++];
306                 if (n & 0x80) s->sample[ch] -= s->sol_table[n & 0x7F];
307                 else s->sample[ch] += s->sol_table[n & 0x7F];
308                 s->sample[ch] = av_clip_int16(s->sample[ch]);
309                 *output_samples++ = s->sample[ch];
310                 /* toggle channel */
311                 ch ^= stereo;
312             }
313         }
314         break;
315     }
316
317     *data_size = out;
318     return buf_size;
319 }
320
321 #define DPCM_DECODER(id_, name_, long_name_)                \
322 AVCodec ff_ ## name_ ## _decoder = {                        \
323     .name           = #name_,                               \
324     .type           = AVMEDIA_TYPE_AUDIO,                   \
325     .id             = id_,                                  \
326     .priv_data_size = sizeof(DPCMContext),                  \
327     .init           = dpcm_decode_init,                     \
328     .decode         = dpcm_decode_frame,                    \
329     .long_name      = NULL_IF_CONFIG_SMALL(long_name_),     \
330 }
331
332 DPCM_DECODER(CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay");
333 DPCM_DECODER(CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ");
334 DPCM_DECODER(CODEC_ID_SOL_DPCM, sol_dpcm, "DPCM Sol");
335 DPCM_DECODER(CODEC_ID_XAN_DPCM, xan_dpcm, "DPCM Xan");