mpc7.c 11.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
 * Musepack SV7 decoder
 * Copyright (c) 2006 Konstantin Shishkov
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
23
 * @file
24 25 26 27
 * MPEG Audio Layer 1/2 -like codec with frames of 1152 samples
 * divided into 32 subbands.
 */

28
#include "libavutil/channel_layout.h"
29
#include "libavutil/lfg.h"
30
#include "avcodec.h"
31
#include "get_bits.h"
32
#include "dsputil.h"
33
#include "internal.h"
34
#include "mpegaudiodsp.h"
35 36 37 38 39 40

#include "mpc.h"
#include "mpc7data.h"

static VLC scfi_vlc, dscf_vlc, hdr_vlc, quant_vlc[MPC7_QUANT_VLC_TABLES][2];

41
static const uint16_t quant_offsets[MPC7_QUANT_VLC_TABLES*2 + 1] =
42 43 44 45 46 47
{
       0, 512, 1024, 1536, 2052, 2564, 3076, 3588, 4100, 4612, 5124,
       5636, 6164, 6676, 7224
};


48
static av_cold int mpc7_decode_init(AVCodecContext * avctx)
49 50 51 52
{
    int i, j;
    MPCContext *c = avctx->priv_data;
    GetBitContext gb;
53
    LOCAL_ALIGNED_16(uint8_t, buf, [16]);
54
    static int vlc_initialized = 0;
55

56 57 58 59 60
    static VLC_TYPE scfi_table[1 << MPC7_SCFI_BITS][2];
    static VLC_TYPE dscf_table[1 << MPC7_DSCF_BITS][2];
    static VLC_TYPE hdr_table[1 << MPC7_HDR_BITS][2];
    static VLC_TYPE quant_tables[7224][2];

61 62 63 64 65 66 67
    /* Musepack SV7 is always stereo */
    if (avctx->channels != 2) {
        av_log_ask_for_sample(avctx, "Unsupported number of channels: %d\n",
                              avctx->channels);
        return AVERROR_PATCHWELCOME;
    }

68 69 70 71 72
    if(avctx->extradata_size < 16){
        av_log(avctx, AV_LOG_ERROR, "Too small extradata size (%i)!\n", avctx->extradata_size);
        return -1;
    }
    memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
73
    av_lfg_init(&c->rnd, 0xDEADBEEF);
74
    ff_dsputil_init(&c->dsp, avctx);
75
    ff_mpadsp_init(&c->mpadsp);
76
    c->dsp.bswap_buf((uint32_t*)buf, (const uint32_t*)avctx->extradata, 4);
77 78 79 80 81 82 83 84 85 86
    ff_mpc_init();
    init_get_bits(&gb, buf, 128);

    c->IS = get_bits1(&gb);
    c->MSS = get_bits1(&gb);
    c->maxbands = get_bits(&gb, 6);
    if(c->maxbands >= BANDS){
        av_log(avctx, AV_LOG_ERROR, "Too many bands: %i\n", c->maxbands);
        return -1;
    }
87
    skip_bits_long(&gb, 88);
88 89 90 91 92 93
    c->gapless = get_bits1(&gb);
    c->lastframelen = get_bits(&gb, 11);
    av_log(avctx, AV_LOG_DEBUG, "IS: %d, MSS: %d, TG: %d, LFL: %d, bands: %d\n",
            c->IS, c->MSS, c->gapless, c->lastframelen, c->maxbands);
    c->frames_to_skip = 0;

94
    avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
95
    avctx->channel_layout = AV_CH_LAYOUT_STEREO;
96

97 98 99
    avcodec_get_frame_defaults(&c->frame);
    avctx->coded_frame = &c->frame;

100
    if(vlc_initialized) return 0;
101
    av_log(avctx, AV_LOG_DEBUG, "Initing VLC\n");
102 103
    scfi_vlc.table = scfi_table;
    scfi_vlc.table_allocated = 1 << MPC7_SCFI_BITS;
104 105
    if(init_vlc(&scfi_vlc, MPC7_SCFI_BITS, MPC7_SCFI_SIZE,
                &mpc7_scfi[1], 2, 1,
106
                &mpc7_scfi[0], 2, 1, INIT_VLC_USE_NEW_STATIC)){
107 108 109
        av_log(avctx, AV_LOG_ERROR, "Cannot init SCFI VLC\n");
        return -1;
    }
110 111
    dscf_vlc.table = dscf_table;
    dscf_vlc.table_allocated = 1 << MPC7_DSCF_BITS;
112 113
    if(init_vlc(&dscf_vlc, MPC7_DSCF_BITS, MPC7_DSCF_SIZE,
                &mpc7_dscf[1], 2, 1,
114
                &mpc7_dscf[0], 2, 1, INIT_VLC_USE_NEW_STATIC)){
115 116 117
        av_log(avctx, AV_LOG_ERROR, "Cannot init DSCF VLC\n");
        return -1;
    }
118 119
    hdr_vlc.table = hdr_table;
    hdr_vlc.table_allocated = 1 << MPC7_HDR_BITS;
120 121
    if(init_vlc(&hdr_vlc, MPC7_HDR_BITS, MPC7_HDR_SIZE,
                &mpc7_hdr[1], 2, 1,
122
                &mpc7_hdr[0], 2, 1, INIT_VLC_USE_NEW_STATIC)){
123 124 125 126 127
        av_log(avctx, AV_LOG_ERROR, "Cannot init HDR VLC\n");
        return -1;
    }
    for(i = 0; i < MPC7_QUANT_VLC_TABLES; i++){
        for(j = 0; j < 2; j++){
128 129
            quant_vlc[i][j].table = &quant_tables[quant_offsets[i*2 + j]];
            quant_vlc[i][j].table_allocated = quant_offsets[i*2 + j + 1] - quant_offsets[i*2 + j];
130 131
            if(init_vlc(&quant_vlc[i][j], 9, mpc7_quant_vlc_sizes[i],
                        &mpc7_quant_vlc[i][j][1], 4, 2,
132
                        &mpc7_quant_vlc[i][j][0], 4, 2, INIT_VLC_USE_NEW_STATIC)){
133 134 135 136 137
                av_log(avctx, AV_LOG_ERROR, "Cannot init QUANT VLC %i,%i\n",i,j);
                return -1;
            }
        }
    }
138
    vlc_initialized = 1;
139

140 141 142 143 144 145 146 147 148 149 150 151
    return 0;
}

/**
 * Fill samples for given subband
 */
static inline void idx_to_quant(MPCContext *c, GetBitContext *gb, int idx, int *dst)
{
    int i, i1, t;
    switch(idx){
    case -1:
        for(i = 0; i < SAMPLES_PER_BAND; i++){
152
            *dst++ = (av_lfg_get(&c->rnd) & 0x3FC) - 510;
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
        }
        break;
    case 1:
        i1 = get_bits1(gb);
        for(i = 0; i < SAMPLES_PER_BAND/3; i++){
            t = get_vlc2(gb, quant_vlc[0][i1].table, 9, 2);
            *dst++ = mpc7_idx30[t];
            *dst++ = mpc7_idx31[t];
            *dst++ = mpc7_idx32[t];
        }
        break;
    case 2:
        i1 = get_bits1(gb);
        for(i = 0; i < SAMPLES_PER_BAND/2; i++){
            t = get_vlc2(gb, quant_vlc[1][i1].table, 9, 2);
            *dst++ = mpc7_idx50[t];
            *dst++ = mpc7_idx51[t];
        }
        break;
    case  3: case  4: case  5: case  6: case  7:
        i1 = get_bits1(gb);
        for(i = 0; i < SAMPLES_PER_BAND; i++)
            *dst++ = get_vlc2(gb, quant_vlc[idx-1][i1].table, 9, 2) - mpc7_quant_vlc_off[idx-1];
        break;
    case  8: case  9: case 10: case 11: case 12:
    case 13: case 14: case 15: case 16: case 17:
        t = (1 << (idx - 2)) - 1;
        for(i = 0; i < SAMPLES_PER_BAND; i++)
            *dst++ = get_bits(gb, idx - 1) - t;
        break;
    default: // case 0 and -2..-17
        return;
    }
}

188 189 190 191 192 193 194 195
static int get_scale_idx(GetBitContext *gb, int ref)
{
    int t = get_vlc2(gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7;
    if (t == 8)
        return get_bits(gb, 6);
    return ref + t;
}

196 197
static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
                             int *got_frame_ptr, AVPacket *avpkt)
198
{
199
    const uint8_t *buf = avpkt->data;
200
    int buf_size;
201 202
    MPCContext *c = avctx->priv_data;
    GetBitContext gb;
203
    int i, ch;
204 205
    int mb = -1;
    Band *bands = c->bands;
206
    int off, ret, last_frame, skip;
207 208
    int bits_used, bits_avail;

209
    memset(bands, 0, sizeof(*bands) * (c->maxbands + 1));
210 211 212 213 214 215 216 217 218 219

    buf_size = avpkt->size & ~3;
    if (buf_size <= 0) {
        av_log(avctx, AV_LOG_ERROR, "packet size is too small (%i bytes)\n",
               avpkt->size);
        return AVERROR_INVALIDDATA;
    }
    if (buf_size != avpkt->size) {
        av_log(avctx, AV_LOG_WARNING, "packet size is not a multiple of 4. "
               "extra bytes at the end will be skipped.\n");
220 221
    }

222 223 224 225 226
    skip       = buf[0];
    last_frame = buf[1];
    buf       += 4;
    buf_size  -= 4;

227
    /* get output buffer */
228
    c->frame.nb_samples = MPC_FRAME_SIZE;
229
    if ((ret = ff_get_buffer(avctx, &c->frame)) < 0) {
230 231
        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
        return ret;
232 233
    }

234 235
    av_fast_padded_malloc(&c->bits, &c->buf_size, buf_size);
    if (!c->bits)
236
        return AVERROR(ENOMEM);
237 238
    c->dsp.bswap_buf((uint32_t *)c->bits, (const uint32_t *)buf, buf_size >> 2);
    init_get_bits(&gb, c->bits, buf_size * 8);
239
    skip_bits_long(&gb, skip);
240 241 242 243

    /* read subband indexes */
    for(i = 0; i <= c->maxbands; i++){
        for(ch = 0; ch < 2; ch++){
244
            int t = 4;
245
            if(i) t = get_vlc2(&gb, hdr_vlc.table, MPC7_HDR_BITS, 1) - 5;
246
            if(t == 4) bands[i].res[ch] = get_bits(&gb, 4);
247
            else bands[i].res[ch] = bands[i-1].res[ch] + t;
248 249 250 251
            if (bands[i].res[ch] < -1 || bands[i].res[ch] > 17) {
                av_log(avctx, AV_LOG_ERROR, "subband index invalid\n");
                return AVERROR_INVALIDDATA;
            }
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
        }

        if(bands[i].res[0] || bands[i].res[1]){
            mb = i;
            if(c->MSS) bands[i].msf = get_bits1(&gb);
        }
    }
    /* get scale indexes coding method */
    for(i = 0; i <= mb; i++)
        for(ch = 0; ch < 2; ch++)
            if(bands[i].res[ch]) bands[i].scfi[ch] = get_vlc2(&gb, scfi_vlc.table, MPC7_SCFI_BITS, 1);
    /* get scale indexes */
    for(i = 0; i <= mb; i++){
        for(ch = 0; ch < 2; ch++){
            if(bands[i].res[ch]){
                bands[i].scf_idx[ch][2] = c->oldDSCF[ch][i];
268
                bands[i].scf_idx[ch][0] = get_scale_idx(&gb, bands[i].scf_idx[ch][2]);
269 270
                switch(bands[i].scfi[ch]){
                case 0:
271 272
                    bands[i].scf_idx[ch][1] = get_scale_idx(&gb, bands[i].scf_idx[ch][0]);
                    bands[i].scf_idx[ch][2] = get_scale_idx(&gb, bands[i].scf_idx[ch][1]);
273 274
                    break;
                case 1:
275
                    bands[i].scf_idx[ch][1] = get_scale_idx(&gb, bands[i].scf_idx[ch][0]);
276 277 278 279
                    bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1];
                    break;
                case 2:
                    bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0];
280
                    bands[i].scf_idx[ch][2] = get_scale_idx(&gb, bands[i].scf_idx[ch][1]);
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
                    break;
                case 3:
                    bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0];
                    break;
                }
                c->oldDSCF[ch][i] = bands[i].scf_idx[ch][2];
            }
        }
    }
    /* get quantizers */
    memset(c->Q, 0, sizeof(c->Q));
    off = 0;
    for(i = 0; i < BANDS; i++, off += SAMPLES_PER_BAND)
        for(ch = 0; ch < 2; ch++)
            idx_to_quant(c, &gb, bands[i].res[ch], c->Q[ch] + off);

297
    ff_mpc_dequantize_and_synth(c, mb, (int16_t **)c->frame.extended_data, 2);
298 299
    if(last_frame)
        c->frame.nb_samples = c->lastframelen;
300 301

    bits_used = get_bits_count(&gb);
302 303
    bits_avail = buf_size * 8;
    if (!last_frame && ((bits_avail < bits_used) || (bits_used + 32 <= bits_avail))) {
304
        av_log(avctx, AV_LOG_ERROR, "Error decoding frame: used %i of %i bits\n", bits_used, bits_avail);
305 306 307 308
        return -1;
    }
    if(c->frames_to_skip){
        c->frames_to_skip--;
309
        *got_frame_ptr = 0;
310
        return avpkt->size;
311
    }
312 313 314

    *got_frame_ptr   = 1;
    *(AVFrame *)data = c->frame;
315

316
    return avpkt->size;
317 318 319 320 321 322 323 324 325 326
}

static void mpc7_decode_flush(AVCodecContext *avctx)
{
    MPCContext *c = avctx->priv_data;

    memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
    c->frames_to_skip = 32;
}

327 328 329
static av_cold int mpc7_decode_close(AVCodecContext *avctx)
{
    MPCContext *c = avctx->priv_data;
330 331
    av_freep(&c->bits);
    c->buf_size = 0;
332 333 334
    return 0;
}

335
AVCodec ff_mpc7_decoder = {
336 337
    .name           = "mpc7",
    .type           = AVMEDIA_TYPE_AUDIO,
338
    .id             = AV_CODEC_ID_MUSEPACK7,
339 340
    .priv_data_size = sizeof(MPCContext),
    .init           = mpc7_decode_init,
341
    .close          = mpc7_decode_close,
342
    .decode         = mpc7_decode_frame,
343
    .flush          = mpc7_decode_flush,
344
    .capabilities   = CODEC_CAP_DR1,
345
    .long_name      = NULL_IF_CONFIG_SMALL("Musepack SV7"),
346 347
    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
                                                      AV_SAMPLE_FMT_NONE },
348
};