flac.c 21.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * FLAC (Free Lossless Audio Codec) decoder
 * Copyright (c) 2003 Alex Beregszaszi
 *
 * This library 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 of the License, or (at your option) any later version.
 *
 * This library 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 this library; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 19 20 21 22 23
 */

/**
 * @file flac.c
 * FLAC (Free Lossless Audio Codec) decoder
 * @author Alex Beregszaszi
24 25 26 27 28 29 30 31
 *
 * For more information on the FLAC format, visit:
 *  http://flac.sourceforge.net/
 *
 * This decoder can be used in 1 of 2 ways: Either raw FLAC data can be fed
 * through, starting from the initial 'fLaC' signature; or by passing the
 * 34-byte streaminfo structure through avctx->extradata[_size] followed
 * by data starting with the 0xFFF8 marker.
32
 */
33

Michael Niedermayer's avatar
Michael Niedermayer committed
34
#include <limits.h>
35

36
#include "avcodec.h"
37
#include "bitstream.h"
38
#include "golomb.h"
39
#include "crc.h"
40

Michael Niedermayer's avatar
Michael Niedermayer committed
41 42 43
#undef NDEBUG
#include <assert.h>

44 45
#define MAX_CHANNELS 8
#define MAX_BLOCKSIZE 65535
46
#define FLAC_STREAMINFO_SIZE 34
47

48
enum decorrelation_type {
49 50 51 52 53 54 55 56 57 58 59 60 61
    INDEPENDENT,
    LEFT_SIDE,
    RIGHT_SIDE,
    MID_SIDE,
};

typedef struct FLACContext {
    AVCodecContext *avctx;
    GetBitContext gb;

    int min_blocksize, max_blocksize;
    int min_framesize, max_framesize;
    int samplerate, channels;
Michael Niedermayer's avatar
Michael Niedermayer committed
62
    int blocksize/*, last_blocksize*/;
63
    int bps, curr_bps;
64
    enum decorrelation_type decorrelation;
65

Michael Niedermayer's avatar
Michael Niedermayer committed
66 67 68 69
    int32_t *decoded[MAX_CHANNELS];
    uint8_t *bitstream;
    int bitstream_size;
    int bitstream_index;
70
    unsigned int allocated_bitstream_size;
71 72 73 74 75 76 77
} FLACContext;

#define METADATA_TYPE_STREAMINFO 0

static int sample_rate_table[] =
{ 0, 0, 0, 0,
  8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000,
78
  0, 0, 0, 0 };
79

80
static int sample_size_table[] =
81 82
{ 0, 8, 12, 0, 16, 20, 24, 0 };

Michael Niedermayer's avatar
Michael Niedermayer committed
83
static int blocksize_table[] = {
84 85
     0,    192, 576<<0, 576<<1, 576<<2, 576<<3,      0,      0,
256<<0, 256<<1, 256<<2, 256<<3, 256<<4, 256<<5, 256<<6, 256<<7
Michael Niedermayer's avatar
Michael Niedermayer committed
86 87
};

88 89 90
static int64_t get_utf8(GetBitContext *gb){
    int64_t val;
    GET_UTF8(val, get_bits(gb, 8), return -1;)
Michael Niedermayer's avatar
Michael Niedermayer committed
91
    return val;
92 93
}

94 95 96
static void metadata_streaminfo(FLACContext *s);
static void dump_headers(FLACContext *s);

97 98
static int flac_decode_init(AVCodecContext * avctx)
{
99 100 101 102 103 104 105 106 107 108
    FLACContext *s = avctx->priv_data;
    s->avctx = avctx;

    /* initialize based on the demuxer-supplied streamdata header */
    if (avctx->extradata_size == FLAC_STREAMINFO_SIZE) {
        init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8);
        metadata_streaminfo(s);
        dump_headers(s);
    }

109 110 111 112 113
    return 0;
}

static void dump_headers(FLACContext *s)
{
Michael Niedermayer's avatar
Michael Niedermayer committed
114 115 116 117 118
    av_log(s->avctx, AV_LOG_DEBUG, "  Blocksize: %d .. %d (%d)\n", s->min_blocksize, s->max_blocksize, s->blocksize);
    av_log(s->avctx, AV_LOG_DEBUG, "  Framesize: %d .. %d\n", s->min_framesize, s->max_framesize);
    av_log(s->avctx, AV_LOG_DEBUG, "  Samplerate: %d\n", s->samplerate);
    av_log(s->avctx, AV_LOG_DEBUG, "  Channels: %d\n", s->channels);
    av_log(s->avctx, AV_LOG_DEBUG, "  Bits: %d\n", s->bps);
119 120
}

Michael Niedermayer's avatar
Michael Niedermayer committed
121
static void allocate_buffers(FLACContext *s){
122 123
    int i;

Michael Niedermayer's avatar
Michael Niedermayer committed
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
    assert(s->max_blocksize);

    if(s->max_framesize == 0 && s->max_blocksize){
        s->max_framesize= (s->channels * s->bps * s->max_blocksize + 7)/ 8; //FIXME header overhead
    }

    for (i = 0; i < s->channels; i++)
    {
        s->decoded[i] = av_realloc(s->decoded[i], sizeof(int32_t)*s->max_blocksize);
    }

    s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
}

static void metadata_streaminfo(FLACContext *s)
{
140 141 142 143 144 145
    /* mandatory streaminfo */
    s->min_blocksize = get_bits(&s->gb, 16);
    s->max_blocksize = get_bits(&s->gb, 16);

    s->min_framesize = get_bits_long(&s->gb, 24);
    s->max_framesize = get_bits_long(&s->gb, 24);
146

147 148 149
    s->samplerate = get_bits_long(&s->gb, 20);
    s->channels = get_bits(&s->gb, 3) + 1;
    s->bps = get_bits(&s->gb, 5) + 1;
150

151 152 153 154
    s->avctx->channels = s->channels;
    s->avctx->sample_rate = s->samplerate;

    skip_bits(&s->gb, 36); /* total num of samples */
155

156 157
    skip_bits(&s->gb, 64); /* md5 sum */
    skip_bits(&s->gb, 64); /* md5 sum */
158

Michael Niedermayer's avatar
Michael Niedermayer committed
159
    allocate_buffers(s);
160 161 162 163 164 165 166 167
}

static int decode_residuals(FLACContext *s, int channel, int pred_order)
{
    int i, tmp, partition, method_type, rice_order;
    int sample = 0, samples;

    method_type = get_bits(&s->gb, 2);
Michael Niedermayer's avatar
Michael Niedermayer committed
168 169
    if (method_type != 0){
        av_log(s->avctx, AV_LOG_DEBUG, "illegal residual coding method %d\n", method_type);
170
        return -1;
Michael Niedermayer's avatar
Michael Niedermayer committed
171
    }
172

173 174
    rice_order = get_bits(&s->gb, 4);

Michael Niedermayer's avatar
Michael Niedermayer committed
175
    samples= s->blocksize >> rice_order;
176

177
    sample=
Michael Niedermayer's avatar
Michael Niedermayer committed
178
    i= pred_order;
179 180 181
    for (partition = 0; partition < (1 << rice_order); partition++)
    {
        tmp = get_bits(&s->gb, 4);
Michael Niedermayer's avatar
Michael Niedermayer committed
182
        if (tmp == 15)
183
        {
Michael Niedermayer's avatar
Michael Niedermayer committed
184
            av_log(s->avctx, AV_LOG_DEBUG, "fixed len partition\n");
185 186
            tmp = get_bits(&s->gb, 5);
            for (; i < samples; i++, sample++)
187
                s->decoded[channel][sample] = get_sbits(&s->gb, tmp);
188 189 190
        }
        else
        {
Michael Niedermayer's avatar
Michael Niedermayer committed
191 192
//            av_log(s->avctx, AV_LOG_DEBUG, "rice coded partition k=%d\n", tmp);
            for (; i < samples; i++, sample++){
193
                s->decoded[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0);
Michael Niedermayer's avatar
Michael Niedermayer committed
194
            }
195
        }
Michael Niedermayer's avatar
Michael Niedermayer committed
196
        i= 0;
197 198
    }

Michael Niedermayer's avatar
Michael Niedermayer committed
199
//    av_log(s->avctx, AV_LOG_DEBUG, "partitions: %d, samples: %d\n", 1 << rice_order, sample);
200 201

    return 0;
202
}
203 204 205 206

static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order)
{
    int i;
207

208
//    av_log(s->avctx, AV_LOG_DEBUG, "  SUBFRAME FIXED\n");
209

210
    /* warm up samples */
211
//    av_log(s->avctx, AV_LOG_DEBUG, "   warm up samples: %d\n", pred_order);
212

213 214
    for (i = 0; i < pred_order; i++)
    {
Michael Niedermayer's avatar
Michael Niedermayer committed
215 216
        s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
//        av_log(s->avctx, AV_LOG_DEBUG, "    %d: %d\n", i, s->decoded[channel][i]);
217
    }
218

219 220 221 222 223 224 225 226 227
    if (decode_residuals(s, channel, pred_order) < 0)
        return -1;

    switch(pred_order)
    {
        case 0:
            break;
        case 1:
            for (i = pred_order; i < s->blocksize; i++)
228
                s->decoded[channel][i] +=   s->decoded[channel][i-1];
229 230 231
            break;
        case 2:
            for (i = pred_order; i < s->blocksize; i++)
232 233
                s->decoded[channel][i] += 2*s->decoded[channel][i-1]
                                          - s->decoded[channel][i-2];
234 235 236
            break;
        case 3:
            for (i = pred_order; i < s->blocksize; i++)
237
                s->decoded[channel][i] += 3*s->decoded[channel][i-1]
238 239
                                        - 3*s->decoded[channel][i-2]
                                        +   s->decoded[channel][i-3];
240 241 242
            break;
        case 4:
            for (i = pred_order; i < s->blocksize; i++)
243
                s->decoded[channel][i] += 4*s->decoded[channel][i-1]
244 245 246
                                        - 6*s->decoded[channel][i-2]
                                        + 4*s->decoded[channel][i-3]
                                        -   s->decoded[channel][i-4];
247
            break;
Michael Niedermayer's avatar
Michael Niedermayer committed
248 249 250
        default:
            av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order);
            return -1;
251
    }
Michael Niedermayer's avatar
Michael Niedermayer committed
252

253 254 255 256 257
    return 0;
}

static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order)
{
258
    int i, j;
259 260
    int coeff_prec, qlevel;
    int coeffs[pred_order];
261

Michael Niedermayer's avatar
Michael Niedermayer committed
262
//    av_log(s->avctx, AV_LOG_DEBUG, "  SUBFRAME LPC\n");
263

264
    /* warm up samples */
Michael Niedermayer's avatar
Michael Niedermayer committed
265
//    av_log(s->avctx, AV_LOG_DEBUG, "   warm up samples: %d\n", pred_order);
266

267 268
    for (i = 0; i < pred_order; i++)
    {
Michael Niedermayer's avatar
Michael Niedermayer committed
269 270
        s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
//        av_log(s->avctx, AV_LOG_DEBUG, "    %d: %d\n", i, s->decoded[channel][i]);
271
    }
272

273 274 275
    coeff_prec = get_bits(&s->gb, 4) + 1;
    if (coeff_prec == 16)
    {
Michael Niedermayer's avatar
Michael Niedermayer committed
276
        av_log(s->avctx, AV_LOG_DEBUG, "invalid coeff precision\n");
277 278
        return -1;
    }
279
//    av_log(s->avctx, AV_LOG_DEBUG, "   qlp coeff prec: %d\n", coeff_prec);
Michael Niedermayer's avatar
Michael Niedermayer committed
280
    qlevel = get_sbits(&s->gb, 5);
281 282 283 284 285 286
//    av_log(s->avctx, AV_LOG_DEBUG, "   quant level: %d\n", qlevel);
    if(qlevel < 0){
        av_log(s->avctx, AV_LOG_DEBUG, "qlevel %d not supported, maybe buggy stream\n", qlevel);
        return -1;
    }

287 288
    for (i = 0; i < pred_order; i++)
    {
Michael Niedermayer's avatar
Michael Niedermayer committed
289 290
        coeffs[i] = get_sbits(&s->gb, coeff_prec);
//        av_log(s->avctx, AV_LOG_DEBUG, "    %d: %d\n", i, coeffs[i]);
291
    }
292

293 294 295
    if (decode_residuals(s, channel, pred_order) < 0)
        return -1;

296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313
    if (s->bps > 16) {
        int64_t sum;
        for (i = pred_order; i < s->blocksize; i++)
        {
            sum = 0;
            for (j = 0; j < pred_order; j++)
                sum += (int64_t)coeffs[j] * s->decoded[channel][i-j-1];
            s->decoded[channel][i] += sum >> qlevel;
        }
    } else {
        int sum;
        for (i = pred_order; i < s->blocksize; i++)
        {
            sum = 0;
            for (j = 0; j < pred_order; j++)
                sum += coeffs[j] * s->decoded[channel][i-j-1];
            s->decoded[channel][i] += sum >> qlevel;
        }
314
    }
315

316 317 318 319 320 321 322
    return 0;
}

static inline int decode_subframe(FLACContext *s, int channel)
{
    int type, wasted = 0;
    int i, tmp;
323

324
    s->curr_bps = s->bps;
Michael Niedermayer's avatar
Michael Niedermayer committed
325
    if(channel == 0){
326
        if(s->decorrelation == RIGHT_SIDE)
Michael Niedermayer's avatar
Michael Niedermayer committed
327 328
            s->curr_bps++;
    }else{
329
        if(s->decorrelation == LEFT_SIDE || s->decorrelation == MID_SIDE)
Michael Niedermayer's avatar
Michael Niedermayer committed
330 331 332
            s->curr_bps++;
    }

333 334
    if (get_bits1(&s->gb))
    {
335
        av_log(s->avctx, AV_LOG_ERROR, "invalid subframe padding\n");
336 337 338 339
        return -1;
    }
    type = get_bits(&s->gb, 6);
//    wasted = get_bits1(&s->gb);
340

341 342 343 344 345 346 347 348
//    if (wasted)
//    {
//        while (!get_bits1(&s->gb))
//            wasted++;
//        if (wasted)
//            wasted++;
//        s->curr_bps -= wasted;
//    }
Michael Niedermayer's avatar
Michael Niedermayer committed
349 350 351 352 353
#if 0
    wasted= 16 - av_log2(show_bits(&s->gb, 17));
    skip_bits(&s->gb, wasted+1);
    s->curr_bps -= wasted;
#else
354 355 356 357 358 359
    if (get_bits1(&s->gb))
    {
        wasted = 1;
        while (!get_bits1(&s->gb))
            wasted++;
        s->curr_bps -= wasted;
Michael Niedermayer's avatar
Michael Niedermayer committed
360
        av_log(s->avctx, AV_LOG_DEBUG, "%d wasted bits\n", wasted);
361
    }
Michael Niedermayer's avatar
Michael Niedermayer committed
362 363
#endif
//FIXME use av_log2 for types
364 365
    if (type == 0)
    {
Michael Niedermayer's avatar
Michael Niedermayer committed
366 367
        av_log(s->avctx, AV_LOG_DEBUG, "coding type: constant\n");
        tmp = get_sbits(&s->gb, s->curr_bps);
368 369 370 371 372
        for (i = 0; i < s->blocksize; i++)
            s->decoded[channel][i] = tmp;
    }
    else if (type == 1)
    {
Michael Niedermayer's avatar
Michael Niedermayer committed
373
        av_log(s->avctx, AV_LOG_DEBUG, "coding type: verbatim\n");
374
        for (i = 0; i < s->blocksize; i++)
Michael Niedermayer's avatar
Michael Niedermayer committed
375
            s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
376 377 378
    }
    else if ((type >= 8) && (type <= 12))
    {
379
//        av_log(s->avctx, AV_LOG_DEBUG, "coding type: fixed\n");
380 381 382 383 384
        if (decode_subframe_fixed(s, channel, type & ~0x8) < 0)
            return -1;
    }
    else if (type >= 32)
    {
Michael Niedermayer's avatar
Michael Niedermayer committed
385
//        av_log(s->avctx, AV_LOG_DEBUG, "coding type: lpc\n");
386 387 388 389 390
        if (decode_subframe_lpc(s, channel, (type & ~0x20)+1) < 0)
            return -1;
    }
    else
    {
391
        av_log(s->avctx, AV_LOG_ERROR, "invalid coding type\n");
392 393
        return -1;
    }
394

395 396 397 398 399 400 401 402 403 404 405 406
    if (wasted)
    {
        int i;
        for (i = 0; i < s->blocksize; i++)
            s->decoded[channel][i] <<= wasted;
    }

    return 0;
}

static int decode_frame(FLACContext *s)
{
407
    int blocksize_code, sample_rate_code, sample_size_code, assignment, i, crc8;
Michael Niedermayer's avatar
Michael Niedermayer committed
408
    int decorrelation, bps, blocksize, samplerate;
409

410 411 412
    blocksize_code = get_bits(&s->gb, 4);

    sample_rate_code = get_bits(&s->gb, 4);
413

414
    assignment = get_bits(&s->gb, 4); /* channel assignment */
Michael Niedermayer's avatar
Michael Niedermayer committed
415 416 417 418
    if (assignment < 8 && s->channels == assignment+1)
        decorrelation = INDEPENDENT;
    else if (assignment >=8 && assignment < 11 && s->channels == 2)
        decorrelation = LEFT_SIDE + assignment - 8;
419 420
    else
    {
421
        av_log(s->avctx, AV_LOG_ERROR, "unsupported channel assignment %d (channels=%d)\n", assignment, s->channels);
422 423
        return -1;
    }
424

425
    sample_size_code = get_bits(&s->gb, 3);
Michael Niedermayer's avatar
Michael Niedermayer committed
426 427 428 429
    if(sample_size_code == 0)
        bps= s->bps;
    else if((sample_size_code != 3) && (sample_size_code != 7))
        bps = sample_size_table[sample_size_code];
430
    else
431
    {
432
        av_log(s->avctx, AV_LOG_ERROR, "invalid sample size code (%d)\n", sample_size_code);
433 434 435 436 437
        return -1;
    }

    if (get_bits1(&s->gb))
    {
438
        av_log(s->avctx, AV_LOG_ERROR, "broken stream, invalid padding\n");
Michael Niedermayer's avatar
Michael Niedermayer committed
439
        return -1;
440
    }
441

Michael Niedermayer's avatar
Michael Niedermayer committed
442 443 444 445
    if(get_utf8(&s->gb) < 0){
        av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n");
        return -1;
    }
446
#if 0
Michael Niedermayer's avatar
Michael Niedermayer committed
447 448 449
    if (/*((blocksize_code == 6) || (blocksize_code == 7)) &&*/
        (s->min_blocksize != s->max_blocksize)){
    }else{
450
    }
Michael Niedermayer's avatar
Michael Niedermayer committed
451
#endif
452

Michael Niedermayer's avatar
Michael Niedermayer committed
453
    if (blocksize_code == 0)
Michael Niedermayer's avatar
Michael Niedermayer committed
454
        blocksize = s->min_blocksize;
Michael Niedermayer's avatar
Michael Niedermayer committed
455
    else if (blocksize_code == 6)
Michael Niedermayer's avatar
Michael Niedermayer committed
456
        blocksize = get_bits(&s->gb, 8)+1;
Michael Niedermayer's avatar
Michael Niedermayer committed
457
    else if (blocksize_code == 7)
Michael Niedermayer's avatar
Michael Niedermayer committed
458
        blocksize = get_bits(&s->gb, 16)+1;
459
    else
Michael Niedermayer's avatar
Michael Niedermayer committed
460
        blocksize = blocksize_table[blocksize_code];
461

Michael Niedermayer's avatar
Michael Niedermayer committed
462 463
    if(blocksize > s->max_blocksize){
        av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", blocksize, s->max_blocksize);
Michael Niedermayer's avatar
Michael Niedermayer committed
464 465 466 467
        return -1;
    }

    if (sample_rate_code == 0){
Michael Niedermayer's avatar
Michael Niedermayer committed
468
        samplerate= s->samplerate;
Michael Niedermayer's avatar
Michael Niedermayer committed
469
    }else if ((sample_rate_code > 3) && (sample_rate_code < 12))
Michael Niedermayer's avatar
Michael Niedermayer committed
470
        samplerate = sample_rate_table[sample_rate_code];
Michael Niedermayer's avatar
Michael Niedermayer committed
471
    else if (sample_rate_code == 12)
Michael Niedermayer's avatar
Michael Niedermayer committed
472
        samplerate = get_bits(&s->gb, 8) * 1000;
Michael Niedermayer's avatar
Michael Niedermayer committed
473
    else if (sample_rate_code == 13)
Michael Niedermayer's avatar
Michael Niedermayer committed
474
        samplerate = get_bits(&s->gb, 16);
Michael Niedermayer's avatar
Michael Niedermayer committed
475
    else if (sample_rate_code == 14)
Michael Niedermayer's avatar
Michael Niedermayer committed
476
        samplerate = get_bits(&s->gb, 16) * 10;
Michael Niedermayer's avatar
Michael Niedermayer committed
477 478 479
    else{
        av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n", sample_rate_code);
        return -1;
480 481
    }

482
    skip_bits(&s->gb, 8);
483
    crc8= av_crc(av_crc07, 0, s->gb.buffer, get_bits_count(&s->gb)/8);
484
    if(crc8){
485
        av_log(s->avctx, AV_LOG_ERROR, "header crc mismatch crc=%2X\n", crc8);
486 487
        return -1;
    }
488

Michael Niedermayer's avatar
Michael Niedermayer committed
489 490 491 492
    s->blocksize    = blocksize;
    s->samplerate   = samplerate;
    s->bps          = bps;
    s->decorrelation= decorrelation;
493

Michael Niedermayer's avatar
Michael Niedermayer committed
494
//    dump_headers(s);
495 496 497 498

    /* subframes */
    for (i = 0; i < s->channels; i++)
    {
Michael Niedermayer's avatar
Michael Niedermayer committed
499
//        av_log(s->avctx, AV_LOG_DEBUG, "decoded: %x residual: %x\n", s->decoded[i], s->residual[i]);
500 501 502
        if (decode_subframe(s, i) < 0)
            return -1;
    }
503

504 505 506 507 508 509 510 511
    align_get_bits(&s->gb);

    /* frame footer */
    skip_bits(&s->gb, 16); /* data crc */

    return 0;
}

512 513 514 515 516 517 518 519 520 521 522
static inline int16_t shift_to_16_bits(int32_t data, int bps)
{
    if (bps == 24) {
        return (data >> 8);
    } else if (bps == 20) {
        return (data >> 4);
    } else {
        return data;
    }
}

523 524 525 526 527
static int flac_decode_frame(AVCodecContext *avctx,
                            void *data, int *data_size,
                            uint8_t *buf, int buf_size)
{
    FLACContext *s = avctx->priv_data;
Michael Niedermayer's avatar
Michael Niedermayer committed
528
    int metadata_last, metadata_type, metadata_size;
Mike Melanson's avatar
Mike Melanson committed
529 530
    int tmp = 0, i, j = 0, input_buf_size = 0;
    int16_t *samples = data;
531

Michael Niedermayer's avatar
Michael Niedermayer committed
532
    if(s->max_framesize == 0){
533
        s->max_framesize= 65536; // should hopefully be enough for the first header
Michael Niedermayer's avatar
Michael Niedermayer committed
534 535 536 537
        s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
    }

    if(1 && s->max_framesize){//FIXME truncated
538
            buf_size= FFMAX(FFMIN(buf_size, s->max_framesize - s->bitstream_size), 0);
Michael Niedermayer's avatar
Michael Niedermayer committed
539 540 541 542 543 544 545 546 547 548 549
            input_buf_size= buf_size;

            if(s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size){
//                printf("memmove\n");
                memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size);
                s->bitstream_index=0;
            }
            memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf, buf_size);
            buf= &s->bitstream[s->bitstream_index];
            buf_size += s->bitstream_size;
            s->bitstream_size= buf_size;
550

Michael Niedermayer's avatar
Michael Niedermayer committed
551 552 553 554 555
            if(buf_size < s->max_framesize){
//                printf("wanna more data ...\n");
                return input_buf_size;
            }
    }
556 557

    init_get_bits(&s->gb, buf, buf_size*8);
558

559
    /* fLaC signature (be) */
Michael Niedermayer's avatar
Michael Niedermayer committed
560
    if (show_bits_long(&s->gb, 32) == bswap_32(ff_get_fourcc("fLaC")))
561
    {
Michael Niedermayer's avatar
Michael Niedermayer committed
562 563 564
        skip_bits(&s->gb, 32);

        av_log(s->avctx, AV_LOG_DEBUG, "STREAM HEADER\n");
565
        do {
Michael Niedermayer's avatar
Michael Niedermayer committed
566
            metadata_last = get_bits(&s->gb, 1);
567 568
            metadata_type = get_bits(&s->gb, 7);
            metadata_size = get_bits_long(&s->gb, 24);
569

Michael Niedermayer's avatar
Michael Niedermayer committed
570 571
            av_log(s->avctx, AV_LOG_DEBUG, " metadata block: flag = %d, type = %d, size = %d\n",
                metadata_last, metadata_type,
572
                metadata_size);
Michael Niedermayer's avatar
Michael Niedermayer committed
573 574 575
            if(metadata_size){
                switch(metadata_type)
                {
576
                case METADATA_TYPE_STREAMINFO:{
577
                    metadata_streaminfo(s);
578

579 580 581 582 583 584 585 586
                    /* Buffer might have been reallocated, reinit bitreader */
                    if(buf != &s->bitstream[s->bitstream_index])
                    {
                        int bits_count = get_bits_count(&s->gb);
                        buf= &s->bitstream[s->bitstream_index];
                        init_get_bits(&s->gb, buf, buf_size*8);
                        skip_bits(&s->gb, bits_count);
                    }
587

588
                    dump_headers(s);
589
                    break;}
590
                default:
Michael Niedermayer's avatar
Michael Niedermayer committed
591
                    for(i=0; i<metadata_size; i++)
592
                        skip_bits(&s->gb, 8);
Michael Niedermayer's avatar
Michael Niedermayer committed
593
                }
594
            }
Michael Niedermayer's avatar
Michael Niedermayer committed
595
        } while(!metadata_last);
596 597 598
    }
    else
    {
599

600
        tmp = show_bits(&s->gb, 16);
Michael Niedermayer's avatar
Michael Niedermayer committed
601 602 603 604 605 606 607
        if(tmp != 0xFFF8){
            av_log(s->avctx, AV_LOG_ERROR, "FRAME HEADER not here\n");
            while(get_bits_count(&s->gb)/8+2 < buf_size && show_bits(&s->gb, 16) != 0xFFF8)
                skip_bits(&s->gb, 8);
            goto end; // we may not have enough bits left to decode a frame, so try next time
        }
        skip_bits(&s->gb, 16);
608 609 610 611
        if (decode_frame(s) < 0){
            av_log(s->avctx, AV_LOG_ERROR, "decode_frame() failed\n");
            s->bitstream_size=0;
            s->bitstream_index=0;
612
            return -1;
613
        }
614
    }
Michael Niedermayer's avatar
Michael Niedermayer committed
615

616

617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652
#if 0
    /* fix the channel order here */
    if (s->order == MID_SIDE)
    {
        short *left = samples;
        short *right = samples + s->blocksize;
        for (i = 0; i < s->blocksize; i += 2)
        {
            uint32_t x = s->decoded[0][i];
            uint32_t y = s->decoded[0][i+1];

            right[i] = x - (y / 2);
            left[i] = right[i] + y;
        }
        *data_size = 2 * s->blocksize;
    }
    else
    {
    for (i = 0; i < s->channels; i++)
    {
        switch(s->order)
        {
            case INDEPENDENT:
                for (j = 0; j < s->blocksize; j++)
                    samples[(s->blocksize*i)+j] = s->decoded[i][j];
                break;
            case LEFT_SIDE:
            case RIGHT_SIDE:
                if (i == 0)
                    for (j = 0; j < s->blocksize; j++)
                        samples[(s->blocksize*i)+j] = s->decoded[0][j];
                else
                    for (j = 0; j < s->blocksize; j++)
                        samples[(s->blocksize*i)+j] = s->decoded[0][j] - s->decoded[i][j];
                break;
//            case MID_SIDE:
Michael Niedermayer's avatar
Michael Niedermayer committed
653
//                av_log(s->avctx, AV_LOG_DEBUG, "mid-side unsupported\n");
654 655 656 657 658
        }
        *data_size += s->blocksize;
    }
    }
#else
659 660 661 662 663 664 665 666 667 668 669
#define DECORRELATE(left, right)\
            assert(s->channels == 2);\
            for (i = 0; i < s->blocksize; i++)\
            {\
                int a= s->decoded[0][i];\
                int b= s->decoded[1][i];\
                *(samples++) = (left ) >> (16 - s->bps);\
                *(samples++) = (right) >> (16 - s->bps);\
            }\
            break;

670
    switch(s->decorrelation)
671 672
    {
        case INDEPENDENT:
Michael Niedermayer's avatar
Michael Niedermayer committed
673
            for (j = 0; j < s->blocksize; j++)
674
            {
Michael Niedermayer's avatar
Michael Niedermayer committed
675
                for (i = 0; i < s->channels; i++)
676
                    *(samples++) = shift_to_16_bits(s->decoded[i][j], s->bps);
677 678 679
            }
            break;
        case LEFT_SIDE:
680
            DECORRELATE(a,a-b)
681
        case RIGHT_SIDE:
682
            DECORRELATE(a+b,b)
683
        case MID_SIDE:
684
            DECORRELATE( (a-=b>>1) + b, a)
685 686 687
    }
#endif

Michael Niedermayer's avatar
Michael Niedermayer committed
688
    *data_size = (int8_t *)samples - (int8_t *)data;
689
//    av_log(s->avctx, AV_LOG_DEBUG, "data size: %d\n", *data_size);
690

Michael Niedermayer's avatar
Michael Niedermayer committed
691 692 693 694 695
//    s->last_blocksize = s->blocksize;
end:
    i= (get_bits_count(&s->gb)+7)/8;;
    if(i > buf_size){
        av_log(s->avctx, AV_LOG_ERROR, "overread: %d\n", i - buf_size);
696 697
        s->bitstream_size=0;
        s->bitstream_index=0;
Michael Niedermayer's avatar
Michael Niedermayer committed
698 699
        return -1;
    }
700

Michael Niedermayer's avatar
Michael Niedermayer committed
701 702 703 704
    if(s->bitstream_size){
        s->bitstream_index += i;
        s->bitstream_size  -= i;
        return input_buf_size;
705
    }else
Michael Niedermayer's avatar
Michael Niedermayer committed
706
        return i;
707 708 709 710 711 712
}

static int flac_decode_close(AVCodecContext *avctx)
{
    FLACContext *s = avctx->priv_data;
    int i;
713

714 715
    for (i = 0; i < s->channels; i++)
    {
Michael Niedermayer's avatar
Michael Niedermayer committed
716
        av_freep(&s->decoded[i]);
717
    }
Michael Niedermayer's avatar
Michael Niedermayer committed
718
    av_freep(&s->bitstream);
719

720 721 722
    return 0;
}

Michael Niedermayer's avatar
Michael Niedermayer committed
723 724 725 726 727 728 729
static void flac_flush(AVCodecContext *avctx){
    FLACContext *s = avctx->priv_data;

    s->bitstream_size=
    s->bitstream_index= 0;
}

730 731 732 733 734 735 736 737 738
AVCodec flac_decoder = {
    "flac",
    CODEC_TYPE_AUDIO,
    CODEC_ID_FLAC,
    sizeof(FLACContext),
    flac_decode_init,
    NULL,
    flac_decode_close,
    flac_decode_frame,
739
    .flush= flac_flush,
740
};