dpcm: factor out the stereo flag calculation
[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     long sample[2];//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     avctx->sample_fmt = AV_SAMPLE_FMT_S16;
159     return 0;
160 }
161
162 static int dpcm_decode_frame(AVCodecContext *avctx,
163                              void *data, int *data_size,
164                              AVPacket *avpkt)
165 {
166     const uint8_t *buf = avpkt->data;
167     int buf_size = avpkt->size;
168     DPCMContext *s = avctx->priv_data;
169     int in, out = 0;
170     int predictor[2];
171     int ch = 0;
172     int stereo = s->channels - 1;
173     short *output_samples = data;
174     int shift[2];
175     unsigned char byte;
176     short diff;
177
178     if (!buf_size)
179         return 0;
180
181     // almost every DPCM variant expands one byte of data into two
182     if(*data_size/2 < buf_size)
183         return -1;
184
185     switch(avctx->codec->id) {
186
187     case CODEC_ID_ROQ_DPCM:
188         if (stereo) {
189             predictor[0] = buf[7] << 8;
190             predictor[1] = buf[6] << 8;
191         } else {
192             predictor[0] = AV_RL16(&buf[6]);
193         }
194         SE_16BIT(predictor[0]);
195         SE_16BIT(predictor[1]);
196
197         /* decode the samples */
198         for (in = 8, out = 0; in < buf_size; in++, out++) {
199             predictor[ch] += s->roq_square_array[buf[in]];
200             predictor[ch] = av_clip_int16(predictor[ch]);
201             output_samples[out] = predictor[ch];
202
203             /* toggle channel */
204             ch ^= stereo;
205         }
206         break;
207
208     case CODEC_ID_INTERPLAY_DPCM:
209         in = 6;  /* skip over the stream mask and stream length */
210         predictor[0] = AV_RL16(&buf[in]);
211         in += 2;
212         SE_16BIT(predictor[0])
213         output_samples[out++] = predictor[0];
214         if (stereo) {
215             predictor[1] = AV_RL16(&buf[in]);
216             in += 2;
217             SE_16BIT(predictor[1])
218             output_samples[out++] = predictor[1];
219         }
220
221         while (in < buf_size) {
222             predictor[ch] += interplay_delta_table[buf[in++]];
223             predictor[ch] = av_clip_int16(predictor[ch]);
224             output_samples[out++] = predictor[ch];
225
226             /* toggle channel */
227             ch ^= stereo;
228         }
229
230         break;
231
232     case CODEC_ID_XAN_DPCM:
233         in = 0;
234         shift[0] = shift[1] = 4;
235         predictor[0] = AV_RL16(&buf[in]);
236         in += 2;
237         SE_16BIT(predictor[0]);
238         if (stereo) {
239             predictor[1] = AV_RL16(&buf[in]);
240             in += 2;
241             SE_16BIT(predictor[1]);
242         }
243
244         while (in < buf_size) {
245             byte = buf[in++];
246             diff = (byte & 0xFC) << 8;
247             if ((byte & 0x03) == 3)
248                 shift[ch]++;
249             else
250                 shift[ch] -= (2 * (byte & 3));
251             /* saturate the shifter to a lower limit of 0 */
252             if (shift[ch] < 0)
253                 shift[ch] = 0;
254
255             diff >>= shift[ch];
256             predictor[ch] += diff;
257
258             predictor[ch] = av_clip_int16(predictor[ch]);
259             output_samples[out++] = predictor[ch];
260
261             /* toggle channel */
262             ch ^= stereo;
263         }
264         break;
265     case CODEC_ID_SOL_DPCM:
266         in = 0;
267         if (avctx->codec_tag != 3) {
268             if(*data_size/4 < buf_size)
269                 return -1;
270             while (in < buf_size) {
271                 int n1, n2;
272                 n1 = (buf[in] >> 4) & 0xF;
273                 n2 = buf[in++] & 0xF;
274                 s->sample[0] += s->sol_table[n1];
275                 if (s->sample[0] < 0)   s->sample[0] = 0;
276                 if (s->sample[0] > 255) s->sample[0] = 255;
277                 output_samples[out++] = (s->sample[0] - 128) << 8;
278                 s->sample[stereo] += s->sol_table[n2];
279                 if (s->sample[stereo] < 0)   s->sample[stereo] = 0;
280                 if (s->sample[stereo] > 255) s->sample[stereo] = 255;
281                 output_samples[out++] = (s->sample[stereo] - 128) << 8;
282             }
283         } else {
284             while (in < buf_size) {
285                 int n;
286                 n = buf[in++];
287                 if (n & 0x80) s->sample[ch] -= s->sol_table[n & 0x7F];
288                 else s->sample[ch] += s->sol_table[n & 0x7F];
289                 s->sample[ch] = av_clip_int16(s->sample[ch]);
290                 output_samples[out++] = s->sample[ch];
291                 /* toggle channel */
292                 ch ^= stereo;
293             }
294         }
295         break;
296     }
297
298     *data_size = out * sizeof(short);
299     return buf_size;
300 }
301
302 #define DPCM_DECODER(id_, name_, long_name_)                \
303 AVCodec ff_ ## name_ ## _decoder = {                        \
304     .name           = #name_,                               \
305     .type           = AVMEDIA_TYPE_AUDIO,                   \
306     .id             = id_,                                  \
307     .priv_data_size = sizeof(DPCMContext),                  \
308     .init           = dpcm_decode_init,                     \
309     .decode         = dpcm_decode_frame,                    \
310     .long_name      = NULL_IF_CONFIG_SMALL(long_name_),     \
311 }
312
313 DPCM_DECODER(CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay");
314 DPCM_DECODER(CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ");
315 DPCM_DECODER(CODEC_ID_SOL_DPCM, sol_dpcm, "DPCM Sol");
316 DPCM_DECODER(CODEC_ID_XAN_DPCM, xan_dpcm, "DPCM Xan");