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