Statistics
| Branch: | Revision:

ffmpeg / libavcodec / dpcm.c @ 44adbebe

History | View | Annotate | Download (11.7 KB)

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
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 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 ff_ ## name ## _decoder = {             \
303
    #name,                                      \
304
    AVMEDIA_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");