Statistics
| Branch: | Revision:

ffmpeg / libavcodec / mpc.c @ 9636c4de

History | View | Annotate | Download (11.5 KB)

1 185c7b6b Kostya Shishkov
/*
2
 * Musepack decoder
3
 * Copyright (c) 2006 Konstantin Shishkov
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
/**
24
 * @file mpc.c Musepack decoder
25
 * MPEG Audio Layer 1/2 -like codec with frames of 1152 samples
26
 * divided into 32 subbands.
27
 */
28
29
#include "avcodec.h"
30
#include "bitstream.h"
31
#include "dsputil.h"
32 e4cc4362 Kostya Shishkov
#include "random.h"
33 185c7b6b Kostya Shishkov
34
#ifdef CONFIG_MPEGAUDIO_HP
35
#define USE_HIGHPRECISION
36
#endif
37
#include "mpegaudio.h"
38
39
#include "mpcdata.h"
40
41
#define BANDS            32
42
#define SAMPLES_PER_BAND 36
43
#define MPC_FRAME_SIZE   (BANDS * SAMPLES_PER_BAND)
44
45
static VLC scfi_vlc, dscf_vlc, hdr_vlc, quant_vlc[MPC7_QUANT_VLC_TABLES][2];
46
47
static DECLARE_ALIGNED_16(MPA_INT, mpa_window[512]);
48
49
typedef struct {
50
    DSPContext dsp;
51
    int IS, MSS, gapless;
52
    int lastframelen, bands;
53
    int oldDSCF[2][BANDS];
54 e4cc4362 Kostya Shishkov
    AVRandomState rnd;
55 aac88b53 Kostya Shishkov
    int frames_to_skip;
56 185c7b6b Kostya Shishkov
    /* for synthesis */
57
    DECLARE_ALIGNED_16(MPA_INT, synth_buf[MPA_MAX_CHANNELS][512*2]);
58
    int synth_buf_offset[MPA_MAX_CHANNELS];
59
    DECLARE_ALIGNED_16(int32_t, sb_samples[MPA_MAX_CHANNELS][36][SBLIMIT]);
60
} MPCContext;
61
62
/** Subband structure - hold all variables for each subband */
63
typedef struct {
64
    int msf; ///< mid-stereo flag
65
    int res[2];
66
    int scfi[2];
67
    int scf_idx[2][3];
68
    int Q[2];
69
}Band;
70
71
static int mpc7_decode_init(AVCodecContext * avctx)
72
{
73
    int i, j;
74
    MPCContext *c = avctx->priv_data;
75
    GetBitContext gb;
76
    uint8_t buf[16];
77
    static int vlc_inited = 0;
78
79
    if(avctx->extradata_size < 16){
80
        av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size);
81
        return -1;
82
    }
83
    memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
84 e4cc4362 Kostya Shishkov
    av_init_random(0xDEADBEEF, &c->rnd);
85 185c7b6b Kostya Shishkov
    dsputil_init(&c->dsp, avctx);
86
    c->dsp.bswap_buf(buf, avctx->extradata, 4);
87
    ff_mpa_synth_init(mpa_window);
88
    init_get_bits(&gb, buf, 128);
89
90
    c->IS = get_bits1(&gb);
91
    c->MSS = get_bits1(&gb);
92
    c->bands = get_bits(&gb, 6);
93
    if(c->bands >= BANDS){
94
        av_log(avctx, AV_LOG_ERROR, "Too many bands: %i\n", c->bands);
95
        return -1;
96
    }
97
    skip_bits(&gb, 88);
98
    c->gapless = get_bits1(&gb);
99
    c->lastframelen = get_bits(&gb, 11);
100
    av_log(avctx, AV_LOG_DEBUG, "IS: %d, MSS: %d, TG: %d, LFL: %d, bands: %d\n",
101
            c->IS, c->MSS, c->gapless, c->lastframelen, c->bands);
102 aac88b53 Kostya Shishkov
    c->frames_to_skip = 0;
103 185c7b6b Kostya Shishkov
104
    if(vlc_inited) return 0;
105
    av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n");
106
    if(init_vlc(&scfi_vlc, MPC7_SCFI_BITS, MPC7_SCFI_SIZE,
107
                &mpc7_scfi[1], 2, 1,
108
                &mpc7_scfi[0], 2, 1, INIT_VLC_USE_STATIC)){
109
        av_log(avctx, AV_LOG_ERROR, "Cannot init SCFI VLC\n");
110
        return -1;
111
    }
112
    if(init_vlc(&dscf_vlc, MPC7_DSCF_BITS, MPC7_DSCF_SIZE,
113
                &mpc7_dscf[1], 2, 1,
114
                &mpc7_dscf[0], 2, 1, INIT_VLC_USE_STATIC)){
115
        av_log(avctx, AV_LOG_ERROR, "Cannot init DSCF VLC\n");
116
        return -1;
117
    }
118
    if(init_vlc(&hdr_vlc, MPC7_HDR_BITS, MPC7_HDR_SIZE,
119
                &mpc7_hdr[1], 2, 1,
120
                &mpc7_hdr[0], 2, 1, INIT_VLC_USE_STATIC)){
121
        av_log(avctx, AV_LOG_ERROR, "Cannot init HDR VLC\n");
122
        return -1;
123
    }
124
    for(i = 0; i < MPC7_QUANT_VLC_TABLES; i++){
125
        for(j = 0; j < 2; j++){
126
            if(init_vlc(&quant_vlc[i][j], 9, mpc7_quant_vlc_sizes[i],
127
                        &mpc7_quant_vlc[i][j][1], 4, 2,
128
                        &mpc7_quant_vlc[i][j][0], 4, 2, INIT_VLC_USE_STATIC)){
129
                av_log(avctx, AV_LOG_ERROR, "Cannot init QUANT VLC %i,%i\n",i,j);
130
                return -1;
131
            }
132
        }
133
    }
134
    vlc_inited = 1;
135
    return 0;
136
}
137
138
/**
139
 * Process decoded Musepack data and produce PCM
140
 * @todo make it available for MPC8 and MPC6
141
 */
142
static void mpc_synth(MPCContext *c, int16_t *out)
143
{
144
    int dither_state = 0;
145
    int i, ch;
146
    OUT_INT samples[MPA_MAX_CHANNELS * MPA_FRAME_SIZE], *samples_ptr;
147
148
    for(ch = 0;  ch < 2; ch++){
149
        samples_ptr = samples + ch;
150
        for(i = 0; i < SAMPLES_PER_BAND; i++) {
151
            ff_mpa_synth_filter(c->synth_buf[ch], &(c->synth_buf_offset[ch]),
152
                                mpa_window, &dither_state,
153
                                samples_ptr, 2,
154
                                c->sb_samples[ch][i]);
155
            samples_ptr += 64;
156
        }
157
    }
158
    for(i = 0; i < MPC_FRAME_SIZE*2; i++)
159
        *out++=samples[i];
160
}
161
162
/**
163
 * Fill samples for given subband
164
 */
165 5a6a6cc7 Diego Biurrun
static inline void idx_to_quant(MPCContext *c, GetBitContext *gb, int idx, int *dst)
166 185c7b6b Kostya Shishkov
{
167
    int i, i1, t;
168
    switch(idx){
169
    case -1:
170
        for(i = 0; i < SAMPLES_PER_BAND; i++){
171 e4cc4362 Kostya Shishkov
            *dst++ = (av_random(&c->rnd) & 0x3FC) - 510;
172 185c7b6b Kostya Shishkov
        }
173 eeb40eb3 Kostya Shishkov
        break;
174 185c7b6b Kostya Shishkov
    case 1:
175
        i1 = get_bits1(gb);
176
        for(i = 0; i < SAMPLES_PER_BAND/3; i++){
177
            t = get_vlc2(gb, quant_vlc[0][i1].table, 9, 2);
178
            *dst++ = mpc_idx30[t];
179
            *dst++ = mpc_idx31[t];
180
            *dst++ = mpc_idx32[t];
181
        }
182
        break;
183
    case 2:
184
        i1 = get_bits1(gb);
185
        for(i = 0; i < SAMPLES_PER_BAND/2; i++){
186
            t = get_vlc2(gb, quant_vlc[1][i1].table, 9, 2);
187
            *dst++ = mpc_idx50[t];
188
            *dst++ = mpc_idx51[t];
189
        }
190
        break;
191
    case  3: case  4: case  5: case  6: case  7:
192
        i1 = get_bits1(gb);
193
        for(i = 0; i < SAMPLES_PER_BAND; i++)
194
            *dst++ = get_vlc2(gb, quant_vlc[idx-1][i1].table, 9, 2) - mpc7_quant_vlc_off[idx-1];
195
        break;
196
    case  8: case  9: case 10: case 11: case 12:
197
    case 13: case 14: case 15: case 16: case 17:
198
        t = (1 << (idx - 2)) - 1;
199
        for(i = 0; i < SAMPLES_PER_BAND; i++)
200
            *dst++ = get_bits(gb, idx - 1) - t;
201
        break;
202
    default: // case 0 and -2..-17
203
        return;
204
    }
205
}
206
207
static int mpc7_decode_frame(AVCodecContext * avctx,
208
                            void *data, int *data_size,
209
                            uint8_t * buf, int buf_size)
210
{
211
    MPCContext *c = avctx->priv_data;
212
    GetBitContext gb;
213
    uint8_t *bits;
214
    int i, j, ch, t;
215
    int mb = -1;
216
    Band bands[BANDS];
217
    int Q[2][MPC_FRAME_SIZE];
218
    int off;
219
    float mul;
220
    int bits_used, bits_avail;
221
222
    memset(bands, 0, sizeof(bands));
223
    if(buf_size <= 4){
224
        av_log(avctx, AV_LOG_ERROR, "Too small buffer passed (%i bytes)\n", buf_size);
225
    }
226
227 a5ee04c3 Reimar Döffinger
    bits = av_malloc(((buf_size - 1) & ~3) + FF_INPUT_BUFFER_PADDING_SIZE);
228 185c7b6b Kostya Shishkov
    c->dsp.bswap_buf(bits, buf + 4, (buf_size - 4) >> 2);
229
    init_get_bits(&gb, bits, (buf_size - 4)* 8);
230
    skip_bits(&gb, buf[0]);
231
232
    /* read subband indexes */
233
    for(i = 0; i <= c->bands; i++){
234
        for(ch = 0; ch < 2; ch++){
235
            if(i) t = get_vlc2(&gb, hdr_vlc.table, MPC7_HDR_BITS, 1) - 5;
236
            if(!i || (t == 4)) bands[i].res[ch] = get_bits(&gb, 4);
237
            else bands[i].res[ch] = bands[i-1].res[ch] + t;
238
        }
239
240
        if(bands[i].res[0] || bands[i].res[1]){
241
            mb = i;
242
            if(c->MSS) bands[i].msf = get_bits1(&gb);
243
        }
244
    }
245
    /* get scale indexes coding method */
246
    for(i = 0; i <= mb; i++)
247
        for(ch = 0; ch < 2; ch++)
248
            if(bands[i].res[ch]) bands[i].scfi[ch] = get_vlc2(&gb, scfi_vlc.table, MPC7_SCFI_BITS, 1);
249
    /* get scale indexes */
250
    for(i = 0; i <= mb; i++){
251
        for(ch = 0; ch < 2; ch++){
252
            if(bands[i].res[ch]){
253
                bands[i].scf_idx[ch][2] = c->oldDSCF[ch][i];
254
                t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7;
255
                bands[i].scf_idx[ch][0] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][2] + t);
256
                switch(bands[i].scfi[ch]){
257
                case 0:
258
                    t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7;
259
                    bands[i].scf_idx[ch][1] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][0] + t);
260
                    t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7;
261
                    bands[i].scf_idx[ch][2] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][1] + t);
262
                    break;
263
                case 1:
264
                    t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7;
265
                    bands[i].scf_idx[ch][1] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][0] + t);
266
                    bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1];
267
                    break;
268
                case 2:
269
                    bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0];
270
                    t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7;
271
                    bands[i].scf_idx[ch][2] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][1] + t);
272
                    break;
273
                case 3:
274
                    bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0];
275
                    break;
276
                }
277
                c->oldDSCF[ch][i] = bands[i].scf_idx[ch][2];
278
            }
279
        }
280
    }
281
    /* get quantizers */
282
    memset(Q, 0, sizeof(Q));
283
    off = 0;
284
    for(i = 0; i < BANDS; i++, off += SAMPLES_PER_BAND)
285
        for(ch = 0; ch < 2; ch++)
286
            idx_to_quant(c, &gb, bands[i].res[ch], Q[ch] + off);
287
    /* dequantize */
288
    memset(c->sb_samples, 0, sizeof(c->sb_samples));
289
    off = 0;
290
    for(i = 0; i <= mb; i++, off += SAMPLES_PER_BAND){
291
        for(ch = 0; ch < 2; ch++){
292
            if(bands[i].res[ch]){
293
                j = 0;
294
                mul = mpc_CC[bands[i].res[ch]] * mpc7_SCF[bands[i].scf_idx[ch][0]];
295
                for(; j < 12; j++)
296
                    c->sb_samples[ch][j][i] = mul * Q[ch][j + off];
297
                mul = mpc_CC[bands[i].res[ch]] * mpc7_SCF[bands[i].scf_idx[ch][1]];
298
                for(; j < 24; j++)
299
                    c->sb_samples[ch][j][i] = mul * Q[ch][j + off];
300
                mul = mpc_CC[bands[i].res[ch]] * mpc7_SCF[bands[i].scf_idx[ch][2]];
301
                for(; j < 36; j++)
302
                    c->sb_samples[ch][j][i] = mul * Q[ch][j + off];
303
            }
304
        }
305
        if(bands[i].msf){
306
            int t1, t2;
307
            for(j = 0; j < SAMPLES_PER_BAND; j++){
308
                t1 = c->sb_samples[0][j][i];
309
                t2 = c->sb_samples[1][j][i];
310
                c->sb_samples[0][j][i] = t1 + t2;
311
                c->sb_samples[1][j][i] = t1 - t2;
312
            }
313
        }
314
    }
315
316
    mpc_synth(c, data);
317
318
    av_free(bits);
319
320
    bits_used = get_bits_count(&gb);
321
    bits_avail = (buf_size - 4) * 8;
322
    if(!buf[1] && ((bits_avail < bits_used) || (bits_used + 32 <= bits_avail))){
323
        av_log(NULL,0, "Error decoding frame: used %i of %i bits\n", bits_used, bits_avail);
324
        return -1;
325
    }
326 aac88b53 Kostya Shishkov
    if(c->frames_to_skip){
327
        c->frames_to_skip--;
328
        *data_size = 0;
329
        return buf_size;
330
    }
331 185c7b6b Kostya Shishkov
    *data_size = (buf[1] ? c->lastframelen : MPC_FRAME_SIZE) * 4;
332
333
    return buf_size;
334
}
335
336 aac88b53 Kostya Shishkov
static void mpc7_decode_flush(AVCodecContext *avctx)
337
{
338
    MPCContext *c = avctx->priv_data;
339
340
    memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
341
    c->frames_to_skip = 32;
342
}
343 185c7b6b Kostya Shishkov
344
AVCodec mpc7_decoder = {
345
    "mpc sv7",
346
    CODEC_TYPE_AUDIO,
347
    CODEC_ID_MUSEPACK7,
348
    sizeof(MPCContext),
349
    mpc7_decode_init,
350
    NULL,
351
    NULL,
352
    mpc7_decode_frame,
353 aac88b53 Kostya Shishkov
    .flush = mpc7_decode_flush,
354 185c7b6b Kostya Shishkov
};