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