alac.c 23 KB
Newer Older
1 2 3 4
/*
 * ALAC (Apple Lossless Audio Codec) decoder
 * Copyright (c) 2005 David Hammerton
 *
5 6 7
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
8 9
 * modify it under the terms of the GNU Lesser General Public
 * 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 14 15 16 17
 * 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
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 25 26 27 28 29 30 31 32 33 34 35
 * ALAC (Apple Lossless Audio Codec) decoder
 * @author 2005 David Hammerton
 *
 * For more information on the ALAC format, visit:
 *  http://crazney.net/programs/itunes/alac.html
 *
 * Note: This decoder expects a 36- (0x24-)byte QuickTime atom to be
 * passed through the extradata[_size] fields. This atom is tacked onto
 * the end of an 'alac' stsd atom and has the following format:
 *  bytes 0-3   atom size (0x24), big-endian
 *  bytes 4-7   atom type ('alac', not the 'alac' tag from start of stsd)
 *  bytes 8-35  data bytes needed by decoder
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
 *
 * Extradata:
 * 32bit  size
 * 32bit  tag (=alac)
 * 32bit  zero?
 * 32bit  max sample per frame
 *  8bit  ?? (zero?)
 *  8bit  sample size
 *  8bit  history mult
 *  8bit  initial history
 *  8bit  kmodifier
 *  8bit  channels?
 * 16bit  ??
 * 32bit  max coded frame size
 * 32bit  bitrate?
 * 32bit  samplerate
52 53 54 55
 */


#include "avcodec.h"
56
#include "get_bits.h"
57
#include "bytestream.h"
58
#include "unary.h"
59
#include "mathops.h"
60 61

#define ALAC_EXTRADATA_SIZE 36
62
#define MAX_CHANNELS 2
63

64 65 66 67 68 69 70
typedef struct {

    AVCodecContext *avctx;
    GetBitContext gb;
    /* init to 0; first frame decode should initialize from extradata and
     * set this to 1 */
    int context_initialized;
71 72 73 74 75

    int numchannels;
    int bytespersample;

    /* buffers */
76
    int32_t *predicterror_buffer[MAX_CHANNELS];
77

78
    int32_t *outputsamples_buffer[MAX_CHANNELS];
79

80 81
    int32_t *wasted_bits_buffer[MAX_CHANNELS];

82 83 84 85 86 87 88 89
    /* stuff from setinfo */
    uint32_t setinfo_max_samples_per_frame; /* 0x1000 = 4096 */    /* max samples per frame? */
    uint8_t setinfo_sample_size; /* 0x10 */
    uint8_t setinfo_rice_historymult; /* 0x28 */
    uint8_t setinfo_rice_initialhistory; /* 0x0a */
    uint8_t setinfo_rice_kmodifier; /* 0x0e */
    /* end setinfo stuff */

90
    int wasted_bits;
91 92
} ALACContext;

93
static void allocate_buffers(ALACContext *alac)
94
{
95 96 97 98
    int chan;
    for (chan = 0; chan < MAX_CHANNELS; chan++) {
        alac->predicterror_buffer[chan] =
            av_malloc(alac->setinfo_max_samples_per_frame * 4);
99

100 101
        alac->outputsamples_buffer[chan] =
            av_malloc(alac->setinfo_max_samples_per_frame * 4);
102 103

        alac->wasted_bits_buffer[chan] = av_malloc(alac->setinfo_max_samples_per_frame * 4);
104
    }
105 106
}

107
static int alac_set_info(ALACContext *alac)
108
{
Michael Niedermayer's avatar
Michael Niedermayer committed
109
    const unsigned char *ptr = alac->avctx->extradata;
110 111 112 113 114

    ptr += 4; /* size */
    ptr += 4; /* alac */
    ptr += 4; /* 0 ? */

115
    if(AV_RB32(ptr) >= UINT_MAX/4){
116 117 118
        av_log(alac->avctx, AV_LOG_ERROR, "setinfo_max_samples_per_frame too large\n");
        return -1;
    }
119 120 121

    /* buffer size / 2 ? */
    alac->setinfo_max_samples_per_frame = bytestream_get_be32(&ptr);
122
    ptr++;                          /* ??? */
Vitor Sessak's avatar
Vitor Sessak committed
123
    alac->setinfo_sample_size           = *ptr++;
124 125 126 127
    if (alac->setinfo_sample_size > 32) {
        av_log(alac->avctx, AV_LOG_ERROR, "setinfo_sample_size too large\n");
        return -1;
    }
Vitor Sessak's avatar
Vitor Sessak committed
128 129 130
    alac->setinfo_rice_historymult      = *ptr++;
    alac->setinfo_rice_initialhistory   = *ptr++;
    alac->setinfo_rice_kmodifier        = *ptr++;
131
    ptr++;                         /* channels? */
132 133 134
    bytestream_get_be16(&ptr);      /* ??? */
    bytestream_get_be32(&ptr);      /* max coded frame size */
    bytestream_get_be32(&ptr);      /* bitrate ? */
135
    bytestream_get_be32(&ptr);      /* samplerate */
136 137

    allocate_buffers(alac);
138 139

    return 0;
140 141
}

142 143 144 145 146 147 148 149
static inline int decode_scalar(GetBitContext *gb, int k, int limit, int readsamplesize){
    /* read x - number of 1s before 0 represent the rice */
    int x = get_unary_0_9(gb);

    if (x > 8) { /* RICE THRESHOLD */
        /* use alternative encoding */
        x = get_bits(gb, readsamplesize);
    } else {
Michael Niedermayer's avatar
Michael Niedermayer committed
150 151
        if (k >= limit)
            k = limit;
152

Michael Niedermayer's avatar
Michael Niedermayer committed
153 154
        if (k != 1) {
            int extrabits = show_bits(gb, k);
155

Michael Niedermayer's avatar
Michael Niedermayer committed
156 157
            /* multiply x by 2^k - 1, as part of their strange algorithm */
            x = (x << k) - x;
158

Michael Niedermayer's avatar
Michael Niedermayer committed
159 160 161 162 163 164
            if (extrabits > 1) {
                x += extrabits - 1;
                skip_bits(gb, k);
            } else
                skip_bits(gb, k - 1);
        }
165
    }
166 167 168
    return x;
}

169
static void bastardized_rice_decompress(ALACContext *alac,
170 171 172 173 174 175 176 177 178 179 180 181 182 183
                                 int32_t *output_buffer,
                                 int output_size,
                                 int readsamplesize, /* arg_10 */
                                 int rice_initialhistory, /* arg424->b */
                                 int rice_kmodifier, /* arg424->d */
                                 int rice_historymult, /* arg424->c */
                                 int rice_kmodifier_mask /* arg424->e */
        )
{
    int output_count;
    unsigned int history = rice_initialhistory;
    int sign_modifier = 0;

    for (output_count = 0; output_count < output_size; output_count++) {
184
        int32_t x;
185 186 187
        int32_t x_modified;
        int32_t final_val;

Michael Niedermayer's avatar
Michael Niedermayer committed
188 189
        /* standard rice encoding */
        int k; /* size of extra bits */
190

Michael Niedermayer's avatar
Michael Niedermayer committed
191
        /* read k, that is bits as is */
192
        k = av_log2((history >> 9) + 3);
Michael Niedermayer's avatar
Michael Niedermayer committed
193
        x= decode_scalar(&alac->gb, k, rice_kmodifier, readsamplesize);
194 195 196 197 198 199 200 201 202 203

        x_modified = sign_modifier + x;
        final_val = (x_modified + 1) / 2;
        if (x_modified & 1) final_val *= -1;

        output_buffer[output_count] = final_val;

        sign_modifier = 0;

        /* now update the history */
Vitor Sessak's avatar
Vitor Sessak committed
204 205
        history += x_modified * rice_historymult
                   - ((history * rice_historymult) >> 9);
206 207 208 209 210 211

        if (x_modified > 0xffff)
            history = 0xffff;

        /* special case: there may be compressed blocks of 0 */
        if ((history < 128) && (output_count+1 < output_size)) {
212 213
            int k;
            unsigned int block_size;
214 215 216

            sign_modifier = 1;

217
            k = 7 - av_log2(history) + ((history + 16) >> 6 /* / 64 */);
218

Michael Niedermayer's avatar
Michael Niedermayer committed
219
            block_size= decode_scalar(&alac->gb, k, rice_kmodifier, 16);
220 221

            if (block_size > 0) {
222 223 224 225
                if(block_size >= output_size - output_count){
                    av_log(alac->avctx, AV_LOG_ERROR, "invalid zero block size of %d %d %d\n", block_size, output_size, output_count);
                    block_size= output_size - output_count - 1;
                }
226 227 228 229 230 231 232 233 234 235 236 237
                memset(&output_buffer[output_count+1], 0, block_size * 4);
                output_count += block_size;
            }

            if (block_size > 0xffff)
                sign_modifier = 0;

            history = 0;
        }
    }
}

238 239 240 241
static inline int sign_only(int v)
{
    return v ? FFSIGN(v) : 0;
}
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256

static void predictor_decompress_fir_adapt(int32_t *error_buffer,
                                           int32_t *buffer_out,
                                           int output_size,
                                           int readsamplesize,
                                           int16_t *predictor_coef_table,
                                           int predictor_coef_num,
                                           int predictor_quantitization)
{
    int i;

    /* first sample always copies */
    *buffer_out = *error_buffer;

    if (!predictor_coef_num) {
Vitor Sessak's avatar
Vitor Sessak committed
257 258 259
        if (output_size <= 1)
            return;

260 261 262 263 264 265 266 267
        memcpy(buffer_out+1, error_buffer+1, (output_size-1) * 4);
        return;
    }

    if (predictor_coef_num == 0x1f) { /* 11111 - max value of predictor_coef_num */
      /* second-best case scenario for fir decompression,
       * error describes a small difference from the previous sample only
       */
Vitor Sessak's avatar
Vitor Sessak committed
268 269
        if (output_size <= 1)
            return;
270 271 272 273 274 275
        for (i = 0; i < output_size - 1; i++) {
            int32_t prev_value;
            int32_t error_value;

            prev_value = buffer_out[i];
            error_value = error_buffer[i+1];
Vitor Sessak's avatar
Vitor Sessak committed
276
            buffer_out[i+1] =
277
                sign_extend((prev_value + error_value), readsamplesize);
278 279 280 281 282
        }
        return;
    }

    /* read warm-up samples */
Vitor Sessak's avatar
Vitor Sessak committed
283
    if (predictor_coef_num > 0)
284 285 286 287
        for (i = 0; i < predictor_coef_num; i++) {
            int32_t val;

            val = buffer_out[i] + error_buffer[i+1];
288
            val = sign_extend(val, readsamplesize);
289 290 291 292 293
            buffer_out[i+1] = val;
        }

#if 0
    /* 4 and 8 are very common cases (the only ones i've seen). these
Vitor Sessak's avatar
Vitor Sessak committed
294
     * should be unrolled and optimized
295 296
     */
    if (predictor_coef_num == 4) {
Vitor Sessak's avatar
Vitor Sessak committed
297
        /* FIXME: optimized general case */
298 299 300 301
        return;
    }

    if (predictor_coef_table == 8) {
Vitor Sessak's avatar
Vitor Sessak committed
302
        /* FIXME: optimized general case */
303 304 305 306 307 308
        return;
    }
#endif

    /* general case */
    if (predictor_coef_num > 0) {
Vitor Sessak's avatar
Vitor Sessak committed
309
        for (i = predictor_coef_num + 1; i < output_size; i++) {
310 311 312 313 314 315 316 317 318 319 320 321 322
            int j;
            int sum = 0;
            int outval;
            int error_val = error_buffer[i];

            for (j = 0; j < predictor_coef_num; j++) {
                sum += (buffer_out[predictor_coef_num-j] - buffer_out[0]) *
                       predictor_coef_table[j];
            }

            outval = (1 << (predictor_quantitization-1)) + sum;
            outval = outval >> predictor_quantitization;
            outval = outval + buffer_out[0] + error_val;
323
            outval = sign_extend(outval, readsamplesize);
324 325 326 327 328 329 330 331

            buffer_out[predictor_coef_num+1] = outval;

            if (error_val > 0) {
                int predictor_num = predictor_coef_num - 1;

                while (predictor_num >= 0 && error_val > 0) {
                    int val = buffer_out[0] - buffer_out[predictor_coef_num - predictor_num];
332
                    int sign = sign_only(val);
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347

                    predictor_coef_table[predictor_num] -= sign;

                    val *= sign; /* absolute value */

                    error_val -= ((val >> predictor_quantitization) *
                                  (predictor_coef_num - predictor_num));

                    predictor_num--;
                }
            } else if (error_val < 0) {
                int predictor_num = predictor_coef_num - 1;

                while (predictor_num >= 0 && error_val < 0) {
                    int val = buffer_out[0] - buffer_out[predictor_coef_num - predictor_num];
348
                    int sign = - sign_only(val);
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365

                    predictor_coef_table[predictor_num] -= sign;

                    val *= sign; /* neg value */

                    error_val -= ((val >> predictor_quantitization) *
                                  (predictor_coef_num - predictor_num));

                    predictor_num--;
                }
            }

            buffer_out++;
        }
    }
}

Vitor Sessak's avatar
Vitor Sessak committed
366
static void reconstruct_stereo_16(int32_t *buffer[MAX_CHANNELS],
Vitor Sessak's avatar
Vitor Sessak committed
367 368 369 370
                                  int16_t *buffer_out,
                                  int numchannels, int numsamples,
                                  uint8_t interlacing_shift,
                                  uint8_t interlacing_leftweight)
371
{
372
    int i;
Vitor Sessak's avatar
Vitor Sessak committed
373 374
    if (numsamples <= 0)
        return;
375 376 377 378

    /* weighted interlacing */
    if (interlacing_leftweight) {
        for (i = 0; i < numsamples; i++) {
379
            int32_t a, b;
380

381 382
            a = buffer[0][i];
            b = buffer[1][i];
383

384 385
            a -= (b * interlacing_leftweight) >> interlacing_shift;
            b += a;
386

387 388
            buffer_out[i*numchannels] = b;
            buffer_out[i*numchannels + 1] = a;
389 390 391 392 393 394 395 396 397
        }

        return;
    }

    /* otherwise basic interlacing took place */
    for (i = 0; i < numsamples; i++) {
        int16_t left, right;

398 399
        left = buffer[0][i];
        right = buffer[1][i];
400 401 402 403 404 405

        buffer_out[i*numchannels] = left;
        buffer_out[i*numchannels + 1] = right;
    }
}

406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455
static void decorrelate_stereo_24(int32_t *buffer[MAX_CHANNELS],
                                  int32_t *buffer_out,
                                  int32_t *wasted_bits_buffer[MAX_CHANNELS],
                                  int wasted_bits,
                                  int numchannels, int numsamples,
                                  uint8_t interlacing_shift,
                                  uint8_t interlacing_leftweight)
{
    int i;

    if (numsamples <= 0)
        return;

    /* weighted interlacing */
    if (interlacing_leftweight) {
        for (i = 0; i < numsamples; i++) {
            int32_t a, b;

            a = buffer[0][i];
            b = buffer[1][i];

            a -= (b * interlacing_leftweight) >> interlacing_shift;
            b += a;

            if (wasted_bits) {
                b  = (b  << wasted_bits) | wasted_bits_buffer[0][i];
                a  = (a  << wasted_bits) | wasted_bits_buffer[1][i];
            }

            buffer_out[i * numchannels]     = b << 8;
            buffer_out[i * numchannels + 1] = a << 8;
        }
    } else {
        for (i = 0; i < numsamples; i++) {
            int32_t left, right;

            left  = buffer[0][i];
            right = buffer[1][i];

            if (wasted_bits) {
                left   = (left   << wasted_bits) | wasted_bits_buffer[0][i];
                right  = (right  << wasted_bits) | wasted_bits_buffer[1][i];
            }

            buffer_out[i * numchannels]     = left  << 8;
            buffer_out[i * numchannels + 1] = right << 8;
        }
    }
}

456 457
static int alac_decode_frame(AVCodecContext *avctx,
                             void *outbuffer, int *outputsize,
458
                             AVPacket *avpkt)
459
{
460 461
    const uint8_t *inbuffer = avpkt->data;
    int input_buffer_size = avpkt->size;
462
    ALACContext *alac = avctx->priv_data;
463

464
    int channels;
465
    unsigned int outputsamples;
466
    int hassize;
467
    unsigned int readsamplesize;
468
    int isnotcompressed;
469 470
    uint8_t interlacing_shift;
    uint8_t interlacing_leftweight;
471

472 473 474 475
    /* short-circuit null buffers */
    if (!inbuffer || !input_buffer_size)
        return input_buffer_size;

476
    /* initialize from the extradata */
477 478
    if (!alac->context_initialized) {
        if (alac->avctx->extradata_size != ALAC_EXTRADATA_SIZE) {
479
            av_log(avctx, AV_LOG_ERROR, "alac: expected %d extradata bytes\n",
480 481 482
                ALAC_EXTRADATA_SIZE);
            return input_buffer_size;
        }
483 484 485 486
        if (alac_set_info(alac)) {
            av_log(avctx, AV_LOG_ERROR, "alac: set_info failed\n");
            return input_buffer_size;
        }
487
        alac->context_initialized = 1;
488
    }
489

490
    init_get_bits(&alac->gb, inbuffer, input_buffer_size * 8);
491

492
    channels = get_bits(&alac->gb, 3) + 1;
493 494 495 496 497
    if (channels > MAX_CHANNELS) {
        av_log(avctx, AV_LOG_ERROR, "channels > %d not supported\n",
               MAX_CHANNELS);
        return input_buffer_size;
    }
498

Vitor Sessak's avatar
Vitor Sessak committed
499 500 501
    /* 2^result = something to do with output waiting.
     * perhaps matters if we read > 1 frame in a pass?
     */
502
    skip_bits(&alac->gb, 4);
503

504
    skip_bits(&alac->gb, 12); /* unknown, skip 12 bits */
505

Vitor Sessak's avatar
Vitor Sessak committed
506
    /* the output sample size is stored soon */
507
    hassize = get_bits1(&alac->gb);
508

509
    alac->wasted_bits = get_bits(&alac->gb, 2) << 3;
510

Vitor Sessak's avatar
Vitor Sessak committed
511
    /* whether the frame is compressed */
512
    isnotcompressed = get_bits1(&alac->gb);
513

Vitor Sessak's avatar
Vitor Sessak committed
514 515
    if (hassize) {
        /* now read the number of samples as a 32bit integer */
516
        outputsamples = get_bits_long(&alac->gb, 32);
517 518 519 520
        if(outputsamples > alac->setinfo_max_samples_per_frame){
            av_log(avctx, AV_LOG_ERROR, "outputsamples %d > %d\n", outputsamples, alac->setinfo_max_samples_per_frame);
            return -1;
        }
Vitor Sessak's avatar
Vitor Sessak committed
521 522
    } else
        outputsamples = alac->setinfo_max_samples_per_frame;
523

524 525 526 527 528 529 530 531 532 533 534 535
    switch (alac->setinfo_sample_size) {
    case 16: avctx->sample_fmt    = SAMPLE_FMT_S16;
             alac->bytespersample = channels << 1;
             break;
    case 24: avctx->sample_fmt    = SAMPLE_FMT_S32;
             alac->bytespersample = channels << 2;
             break;
    default: av_log(avctx, AV_LOG_ERROR, "Sample depth %d is not supported.\n",
                    alac->setinfo_sample_size);
             return -1;
    }

536 537 538 539 540
    if(outputsamples > *outputsize / alac->bytespersample){
        av_log(avctx, AV_LOG_ERROR, "sample buffer too small\n");
        return -1;
    }

Vitor Sessak's avatar
Vitor Sessak committed
541
    *outputsize = outputsamples * alac->bytespersample;
542
    readsamplesize = alac->setinfo_sample_size - (alac->wasted_bits) + channels - 1;
543 544 545 546
    if (readsamplesize > MIN_CACHE_BITS) {
        av_log(avctx, AV_LOG_ERROR, "readsamplesize too big (%d)\n", readsamplesize);
        return -1;
    }
547

Vitor Sessak's avatar
Vitor Sessak committed
548 549
    if (!isnotcompressed) {
        /* so it is compressed */
550 551 552 553 554
        int16_t predictor_coef_table[MAX_CHANNELS][32];
        int predictor_coef_num[MAX_CHANNELS];
        int prediction_type[MAX_CHANNELS];
        int prediction_quantitization[MAX_CHANNELS];
        int ricemodifier[MAX_CHANNELS];
Vitor Sessak's avatar
Vitor Sessak committed
555
        int i, chan;
556

Vitor Sessak's avatar
Vitor Sessak committed
557 558
        interlacing_shift = get_bits(&alac->gb, 8);
        interlacing_leftweight = get_bits(&alac->gb, 8);
559

Vitor Sessak's avatar
Vitor Sessak committed
560
        for (chan = 0; chan < channels; chan++) {
561 562
            prediction_type[chan] = get_bits(&alac->gb, 4);
            prediction_quantitization[chan] = get_bits(&alac->gb, 4);
563

564 565
            ricemodifier[chan] = get_bits(&alac->gb, 3);
            predictor_coef_num[chan] = get_bits(&alac->gb, 5);
566 567

            /* read the predictor table */
Vitor Sessak's avatar
Vitor Sessak committed
568
            for (i = 0; i < predictor_coef_num[chan]; i++)
569
                predictor_coef_table[chan][i] = (int16_t)get_bits(&alac->gb, 16);
Vitor Sessak's avatar
Vitor Sessak committed
570
        }
571

572 573 574 575 576 577 578
        if (alac->wasted_bits) {
            int i, ch;
            for (i = 0; i < outputsamples; i++) {
                for (ch = 0; ch < channels; ch++)
                    alac->wasted_bits_buffer[ch][i] = get_bits(&alac->gb, alac->wasted_bits);
            }
        }
Vitor Sessak's avatar
Vitor Sessak committed
579
        for (chan = 0; chan < channels; chan++) {
580
            bastardized_rice_decompress(alac,
581
                                        alac->predicterror_buffer[chan],
582 583 584 585
                                        outputsamples,
                                        readsamplesize,
                                        alac->setinfo_rice_initialhistory,
                                        alac->setinfo_rice_kmodifier,
586
                                        ricemodifier[chan] * alac->setinfo_rice_historymult / 4,
587 588
                                        (1 << alac->setinfo_rice_kmodifier) - 1);

589
            if (prediction_type[chan] == 0) {
Vitor Sessak's avatar
Vitor Sessak committed
590
                /* adaptive fir */
591 592
                predictor_decompress_fir_adapt(alac->predicterror_buffer[chan],
                                               alac->outputsamples_buffer[chan],
593 594
                                               outputsamples,
                                               readsamplesize,
595 596 597
                                               predictor_coef_table[chan],
                                               predictor_coef_num[chan],
                                               prediction_quantitization[chan]);
598
            } else {
599
                av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type[chan]);
Vitor Sessak's avatar
Vitor Sessak committed
600 601
                /* I think the only other prediction type (or perhaps this is
                 * just a boolean?) runs adaptive fir twice.. like:
602 603 604 605
                 * predictor_decompress_fir_adapt(predictor_error, tempout, ...)
                 * predictor_decompress_fir_adapt(predictor_error, outputsamples ...)
                 * little strange..
                 */
606
            }
Vitor Sessak's avatar
Vitor Sessak committed
607 608 609
        }
    } else {
        /* not compressed, easy case */
610
        int i, chan;
611
        if (alac->setinfo_sample_size <= 16) {
612 613
        for (i = 0; i < outputsamples; i++)
            for (chan = 0; chan < channels; chan++) {
614
                int32_t audiobits;
615

616
                audiobits = get_sbits_long(&alac->gb, alac->setinfo_sample_size);
617

618 619
                alac->outputsamples_buffer[chan][i] = audiobits;
            }
620 621 622 623 624 625 626 627 628 629 630
        } else {
            for (i = 0; i < outputsamples; i++) {
                for (chan = 0; chan < channels; chan++) {
                    alac->outputsamples_buffer[chan][i] = get_bits(&alac->gb,
                                                          alac->setinfo_sample_size);
                    alac->outputsamples_buffer[chan][i] = sign_extend(alac->outputsamples_buffer[chan][i],
                                                                      alac->setinfo_sample_size);
                }
            }
        }
        alac->wasted_bits = 0;
Vitor Sessak's avatar
Vitor Sessak committed
631 632 633
        interlacing_shift = 0;
        interlacing_leftweight = 0;
    }
Matthieu Castet's avatar
Matthieu Castet committed
634 635
    if (get_bits(&alac->gb, 3) != 7)
        av_log(avctx, AV_LOG_ERROR, "Error : Wrong End Of Frame\n");
636

Vitor Sessak's avatar
Vitor Sessak committed
637
    switch(alac->setinfo_sample_size) {
Vitor Sessak's avatar
Vitor Sessak committed
638
    case 16:
Vitor Sessak's avatar
Vitor Sessak committed
639
        if (channels == 2) {
Vitor Sessak's avatar
Vitor Sessak committed
640
            reconstruct_stereo_16(alac->outputsamples_buffer,
Vitor Sessak's avatar
Vitor Sessak committed
641 642 643 644 645
                                  (int16_t*)outbuffer,
                                  alac->numchannels,
                                  outputsamples,
                                  interlacing_shift,
                                  interlacing_leftweight);
Vitor Sessak's avatar
Vitor Sessak committed
646 647 648
        } else {
            int i;
            for (i = 0; i < outputsamples; i++) {
649
                ((int16_t*)outbuffer)[i] = alac->outputsamples_buffer[0][i];
Vitor Sessak's avatar
Vitor Sessak committed
650
            }
651
        }
Vitor Sessak's avatar
Vitor Sessak committed
652 653
        break;
    case 24:
654 655 656 657 658 659 660 661 662 663 664 665 666 667
        if (channels == 2) {
            decorrelate_stereo_24(alac->outputsamples_buffer,
                                  outbuffer,
                                  alac->wasted_bits_buffer,
                                  alac->wasted_bits,
                                  alac->numchannels,
                                  outputsamples,
                                  interlacing_shift,
                                  interlacing_leftweight);
        } else {
            int i;
            for (i = 0; i < outputsamples; i++)
                ((int32_t *)outbuffer)[i] = alac->outputsamples_buffer[0][i] << 8;
        }
Vitor Sessak's avatar
Vitor Sessak committed
668 669
        break;
    }
670

Matthieu Castet's avatar
Matthieu Castet committed
671 672 673
    if (input_buffer_size * 8 - get_bits_count(&alac->gb) > 8)
        av_log(avctx, AV_LOG_ERROR, "Error : %d bits left\n", input_buffer_size * 8 - get_bits_count(&alac->gb));

674
    return input_buffer_size;
675 676
}

677
static av_cold int alac_decode_init(AVCodecContext * avctx)
678
{
679 680 681
    ALACContext *alac = avctx->priv_data;
    alac->avctx = avctx;
    alac->context_initialized = 0;
682

683
    alac->numchannels = alac->avctx->channels;
684 685 686 687

    return 0;
}

688
static av_cold int alac_decode_close(AVCodecContext *avctx)
689
{
690
    ALACContext *alac = avctx->priv_data;
691

692 693
    int chan;
    for (chan = 0; chan < MAX_CHANNELS; chan++) {
694 695
        av_freep(&alac->predicterror_buffer[chan]);
        av_freep(&alac->outputsamples_buffer[chan]);
696
        av_freep(&alac->wasted_bits_buffer[chan]);
697
    }
698 699 700 701 702 703

    return 0;
}

AVCodec alac_decoder = {
    "alac",
704
    AVMEDIA_TYPE_AUDIO,
705 706 707 708 709 710
    CODEC_ID_ALAC,
    sizeof(ALACContext),
    alac_decode_init,
    NULL,
    alac_decode_close,
    alac_decode_frame,
711
    .long_name = NULL_IF_CONFIG_SMALL("ALAC (Apple Lossless Audio Codec)"),
712
};