mpegaudiodec.c 85.4 KB
Newer Older
Fabrice Bellard's avatar
Fabrice Bellard committed
1 2
/*
 * MPEG Audio decoder
3
 * Copyright (c) 2001, 2002 Fabrice Bellard.
Fabrice Bellard's avatar
Fabrice Bellard committed
4
 *
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.
Fabrice Bellard's avatar
Fabrice Bellard committed
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
Fabrice Bellard's avatar
Fabrice Bellard committed
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
Fabrice Bellard's avatar
Fabrice Bellard committed
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
Fabrice Bellard's avatar
Fabrice Bellard committed
20
 */
Michael Niedermayer's avatar
Michael Niedermayer committed
21 22 23 24

/**
 * @file mpegaudiodec.c
 * MPEG Audio decoder.
25
 */
Michael Niedermayer's avatar
Michael Niedermayer committed
26

27
//#define DEBUG
Fabrice Bellard's avatar
Fabrice Bellard committed
28
#include "avcodec.h"
29
#include "bitstream.h"
30
#include "dsputil.h"
Fabrice Bellard's avatar
Fabrice Bellard committed
31 32

/*
33 34 35
 * TODO:
 *  - in low precision mode, use more 16 bit multiplies in synth filter
 *  - test lsf / mpeg25 extensively.
Fabrice Bellard's avatar
Fabrice Bellard committed
36 37
 */

38 39
/* define USE_HIGHPRECISION to have a bit exact (but slower) mpeg
   audio decoder */
40
#ifdef CONFIG_MPEGAUDIO_HP
41
#   define USE_HIGHPRECISION
42
#endif
43

Roberto Togni's avatar
Roberto Togni committed
44
#include "mpegaudio.h"
45

Luca Barbato's avatar
Luca Barbato committed
46 47
#include "mathops.h"

48 49 50 51 52 53 54
#define FRAC_ONE    (1 << FRAC_BITS)

#define FIX(a)   ((int)((a) * FRAC_ONE))
/* WARNING: only correct for posititive numbers */
#define FIXR(a)   ((int)((a) * FRAC_ONE + 0.5))
#define FRAC_RND(a) (((a) + (FRAC_ONE/2)) >> FRAC_BITS)

55 56
#define FIXHR(a) ((int)((a) * (1LL<<32) + 0.5))

57 58
/****************/

Fabrice Bellard's avatar
Fabrice Bellard committed
59 60
#define HEADER_SIZE 4
#define BACKSTEP_SIZE 512
61
#define EXTRABYTES 24
Fabrice Bellard's avatar
Fabrice Bellard committed
62

63 64
struct GranuleDef;

Fabrice Bellard's avatar
Fabrice Bellard committed
65
typedef struct MPADecodeContext {
66
    DECLARE_ALIGNED_8(uint8_t, last_buf[2*BACKSTEP_SIZE + EXTRABYTES]);
67
    int last_buf_size;
Fabrice Bellard's avatar
Fabrice Bellard committed
68
    int frame_size;
69
    /* next header (used in free format parsing) */
70
    uint32_t free_format_next_header;
Fabrice Bellard's avatar
Fabrice Bellard committed
71 72 73
    int error_protection;
    int layer;
    int sample_rate;
74
    int sample_rate_index; /* between 0 and 8 */
Fabrice Bellard's avatar
Fabrice Bellard committed
75 76
    int bit_rate;
    GetBitContext gb;
77
    GetBitContext in_gb;
78 79 80 81
    int nb_channels;
    int mode;
    int mode_ext;
    int lsf;
82
    MPA_INT synth_buf[MPA_MAX_CHANNELS][512 * 2] __attribute__((aligned(16)));
83
    int synth_buf_offset[MPA_MAX_CHANNELS];
84
    int32_t sb_samples[MPA_MAX_CHANNELS][36][SBLIMIT] __attribute__((aligned(16)));
85
    int32_t mdct_buf[MPA_MAX_CHANNELS][SBLIMIT * 18]; /* previous samples, for layer 3 MDCT */
86 87 88
#ifdef DEBUG
    int frame_count;
#endif
89
    void (*compute_antialias)(struct MPADecodeContext *s, struct GranuleDef *g);
Roberto Togni's avatar
Roberto Togni committed
90
    int adu_mode; ///< 0 for standard mp3, 1 for adu formatted mp3
91
    int dither_state;
92
    int error_resilience;
93
    AVCodecContext* avctx;
Fabrice Bellard's avatar
Fabrice Bellard committed
94 95
} MPADecodeContext;

96 97 98 99 100 101 102 103 104
/**
 * Context for MP3On4 decoder
 */
typedef struct MP3On4DecodeContext {
    int frames;   ///< number of mp3 frames per block (number of mp3 decoder instances)
    int chan_cfg; ///< channel config number
    MPADecodeContext *mp3decctx[5]; ///< MPADecodeContext for every decoder instance
} MP3On4DecodeContext;

105 106
/* layer 3 "granule" */
typedef struct GranuleDef {
107
    uint8_t scfsi;
108 109 110 111
    int part2_3_length;
    int big_values;
    int global_gain;
    int scalefac_compress;
112 113
    uint8_t block_type;
    uint8_t switch_point;
114 115
    int table_select[3];
    int subblock_gain[3];
116 117
    uint8_t scalefac_scale;
    uint8_t count1table_select;
118 119 120
    int region_size[3]; /* number of huffman codes in each region */
    int preflag;
    int short_start, long_end; /* long/short band indexes */
121 122
    uint8_t scale_factors[40];
    int32_t sb_hybrid[SBLIMIT * 18]; /* 576 samples */
123
} GranuleDef;
Fabrice Bellard's avatar
Fabrice Bellard committed
124

125 126 127 128 129 130
#define MODE_EXT_MS_STEREO 2
#define MODE_EXT_I_STEREO  1

/* layer 3 huffman tables */
typedef struct HuffTable {
    int xsize;
131 132
    const uint8_t *bits;
    const uint16_t *codes;
133 134 135 136
} HuffTable;

#include "mpegaudiodectab.h"

137 138 139
static void compute_antialias_integer(MPADecodeContext *s, GranuleDef *g);
static void compute_antialias_float(MPADecodeContext *s, GranuleDef *g);

140
/* vlc structure for decoding layer 3 huffman tables */
141
static VLC huff_vlc[16];
142 143
static VLC huff_quad_vlc[2];
/* computed from band_size_long */
144
static uint16_t band_index_long[9][23];
145
/* XXX: free when all decoders are closed */
146
#define TABLE_4_3_SIZE (8191 + 16)*4
147 148
static int8_t  table_4_3_exp[TABLE_4_3_SIZE];
static uint32_t table_4_3_value[TABLE_4_3_SIZE];
149
static uint32_t exp_table[512];
150
static uint32_t expval_table[512][16];
151
/* intensity stereo coef table */
152 153
static int32_t is_table[2][16];
static int32_t is_table_lsf[2][2][16];
154 155
static int32_t csa_table[8][4];
static float csa_table_float[8][4];
156
static int32_t mdct_win[8][36];
157 158

/* lower 2 bits: modulo 3, higher bits: shift */
159
static uint16_t scale_factor_modshift[64];
160
/* [i][j]:  2^(-j/3) * FRAC_ONE * 2^(i+2) / (2^(i+2) - 1) */
161
static int32_t scale_factor_mult[15][3];
162 163 164 165 166
/* mult table for layer 2 group quantization */

#define SCALE_GEN(v) \
{ FIXR(1.0 * (v)), FIXR(0.7937005259 * (v)), FIXR(0.6299605249 * (v)) }

Michael Niedermayer's avatar
Michael Niedermayer committed
167
static const int32_t scale_factor_mult2[3][3] = {
168 169 170
    SCALE_GEN(4.0 / 3.0), /* 3 steps */
    SCALE_GEN(4.0 / 5.0), /* 5 steps */
    SCALE_GEN(4.0 / 9.0), /* 9 steps */
171 172
};

173
static MPA_INT window[512] __attribute__((aligned(16)));
174

175 176 177 178 179
/* layer 1 unscaling */
/* n = number of bits of the mantissa minus 1 */
static inline int l1_unscale(int n, int mant, int scale_factor)
{
    int shift, mod;
180
    int64_t val;
181 182 183 184 185 186

    shift = scale_factor_modshift[scale_factor];
    mod = shift & 3;
    shift >>= 2;
    val = MUL64(mant + (-1 << n) + 1, scale_factor_mult[n-1][mod]);
    shift += n;
187 188
    /* NOTE: at this point, 1 <= shift >= 21 + 15 */
    return (int)((val + (1LL << (shift - 1))) >> shift);
189 190 191 192 193 194 195 196 197
}

static inline int l2_unscale_group(int steps, int mant, int scale_factor)
{
    int shift, mod, val;

    shift = scale_factor_modshift[scale_factor];
    mod = shift & 3;
    shift >>= 2;
198 199 200 201 202 203

    val = (mant - (steps >> 1)) * scale_factor_mult2[steps >> 2][mod];
    /* NOTE: at this point, 0 <= shift <= 21 */
    if (shift > 0)
        val = (val + (1 << (shift - 1))) >> shift;
    return val;
204 205 206 207 208 209 210 211
}

/* compute value^(4/3) * 2^(exponent/4). It normalized to FRAC_BITS */
static inline int l3_unscale(int value, int exponent)
{
    unsigned int m;
    int e;

212 213 214 215
    e = table_4_3_exp  [4*value + (exponent&3)];
    m = table_4_3_value[4*value + (exponent&3)];
    e -= (exponent >> 2);
    assert(e>=1);
216
    if (e > 31)
217
        return 0;
218
    m = (m + (1 << (e-1))) >> e;
219

220 221 222
    return m;
}

223 224 225 226 227 228
/* all integer n^(4/3) computation code */
#define DEV_ORDER 13

#define POW_FRAC_BITS 24
#define POW_FRAC_ONE    (1 << POW_FRAC_BITS)
#define POW_FIX(a)   ((int)((a) * POW_FRAC_ONE))
229
#define POW_MULL(a,b) (((int64_t)(a) * (int64_t)(b)) >> POW_FRAC_BITS)
230 231 232

static int dev_4_3_coefs[DEV_ORDER];

233
#if 0 /* unused */
234 235 236 237 238
static int pow_mult3[3] = {
    POW_FIX(1.0),
    POW_FIX(1.25992104989487316476),
    POW_FIX(1.58740105196819947474),
};
239
#endif
240 241 242 243 244 245 246 247 248 249 250 251

static void int_pow_init(void)
{
    int i, a;

    a = POW_FIX(1.0);
    for(i=0;i<DEV_ORDER;i++) {
        a = POW_MULL(a, POW_FIX(4.0 / 3.0) - i * POW_FIX(1.0)) / (i + 1);
        dev_4_3_coefs[i] = a;
    }
}

252
#if 0 /* unused, remove? */
253 254 255 256 257
/* return the mantissa and the binary exponent */
static int int_pow(int i, int *exp_ptr)
{
    int e, er, eq, j;
    int a, a1;
258

259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284
    /* renormalize */
    a = i;
    e = POW_FRAC_BITS;
    while (a < (1 << (POW_FRAC_BITS - 1))) {
        a = a << 1;
        e--;
    }
    a -= (1 << POW_FRAC_BITS);
    a1 = 0;
    for(j = DEV_ORDER - 1; j >= 0; j--)
        a1 = POW_MULL(a, dev_4_3_coefs[j] + a1);
    a = (1 << POW_FRAC_BITS) + a1;
    /* exponent compute (exact) */
    e = e * 4;
    er = e % 3;
    eq = e / 3;
    a = POW_MULL(a, pow_mult3[er]);
    while (a >= 2 * POW_FRAC_ONE) {
        a = a >> 1;
        eq++;
    }
    /* convert to float */
    while (a < POW_FRAC_ONE) {
        a = a << 1;
        eq--;
    }
285
    /* now POW_FRAC_ONE <= a < 2 * POW_FRAC_ONE */
286
#if POW_FRAC_BITS > FRAC_BITS
287 288 289 290 291 292 293
    a = (a + (1 << (POW_FRAC_BITS - FRAC_BITS - 1))) >> (POW_FRAC_BITS - FRAC_BITS);
    /* correct overflow */
    if (a >= 2 * (1 << FRAC_BITS)) {
        a = a >> 1;
        eq++;
    }
#endif
294 295 296
    *exp_ptr = eq;
    return a;
}
297
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
298 299 300 301

static int decode_init(AVCodecContext * avctx)
{
    MPADecodeContext *s = avctx->priv_data;
302
    static int init=0;
303
    int i, j, k;
Fabrice Bellard's avatar
Fabrice Bellard committed
304

305 306
    s->avctx = avctx;

307
#if defined(USE_HIGHPRECISION) && defined(CONFIG_AUDIO_NONSHORT)
308 309 310
    avctx->sample_fmt= SAMPLE_FMT_S32;
#else
    avctx->sample_fmt= SAMPLE_FMT_S16;
311
#endif
312
    s->error_resilience= avctx->error_resilience;
313

Michael Niedermayer's avatar
Michael Niedermayer committed
314
    if(avctx->antialias_algo != FF_AA_FLOAT)
Michael Niedermayer's avatar
Michael Niedermayer committed
315 316 317 318
        s->compute_antialias= compute_antialias_integer;
    else
        s->compute_antialias= compute_antialias_float;

319
    if (!init && !avctx->parse_only) {
320 321 322 323
        /* scale factors table for layer 1/2 */
        for(i=0;i<64;i++) {
            int shift, mod;
            /* 1.0 (i = 3) is normalized to 2 ^ FRAC_BITS */
324
            shift = (i / 3);
325 326 327 328 329 330 331 332
            mod = i % 3;
            scale_factor_modshift[i] = mod | (shift << 2);
        }

        /* scale factor multiply for layer 1 */
        for(i=0;i<15;i++) {
            int n, norm;
            n = i + 2;
333
            norm = ((INT64_C(1) << n) * FRAC_ONE) / ((1 << n) - 1);
334 335 336
            scale_factor_mult[i][0] = MULL(FIXR(1.0 * 2.0), norm);
            scale_factor_mult[i][1] = MULL(FIXR(0.7937005259 * 2.0), norm);
            scale_factor_mult[i][2] = MULL(FIXR(0.6299605249 * 2.0), norm);
337
            dprintf(avctx, "%d: norm=%x s=%x %x %x\n",
338
                    i, norm,
339 340 341 342
                    scale_factor_mult[i][0],
                    scale_factor_mult[i][1],
                    scale_factor_mult[i][2]);
        }
343

344
        ff_mpa_synth_init(window);
345

346 347 348
        /* huffman decode tables */
        for(i=1;i<16;i++) {
            const HuffTable *h = &mpa_huff_tables[i];
349
            int xsize, x, y;
350
            unsigned int n;
Michael Niedermayer's avatar
Michael Niedermayer committed
351 352
            uint8_t  tmp_bits [512];
            uint16_t tmp_codes[512];
Michael Niedermayer's avatar
Michael Niedermayer committed
353 354 355

            memset(tmp_bits , 0, sizeof(tmp_bits ));
            memset(tmp_codes, 0, sizeof(tmp_codes));
356 357 358

            xsize = h->xsize;
            n = xsize * xsize;
359

360 361
            j = 0;
            for(x=0;x<xsize;x++) {
Michael Niedermayer's avatar
Michael Niedermayer committed
362
                for(y=0;y<xsize;y++){
Michael Niedermayer's avatar
Michael Niedermayer committed
363 364
                    tmp_bits [(x << 5) | y | ((x&&y)<<4)]= h->bits [j  ];
                    tmp_codes[(x << 5) | y | ((x&&y)<<4)]= h->codes[j++];
Michael Niedermayer's avatar
Michael Niedermayer committed
365
                }
366
            }
Michael Niedermayer's avatar
Michael Niedermayer committed
367 368

            /* XXX: fail test */
Michael Niedermayer's avatar
Michael Niedermayer committed
369
            init_vlc(&huff_vlc[i], 7, 512,
Michael Niedermayer's avatar
Michael Niedermayer committed
370
                     tmp_bits, 1, 1, tmp_codes, 2, 2, 1);
371 372
        }
        for(i=0;i<2;i++) {
373
            init_vlc(&huff_quad_vlc[i], i == 0 ? 7 : 4, 16,
374
                     mpa_quad_bits[i], 1, 1, mpa_quad_codes[i], 1, 1, 1);
375 376 377 378 379 380 381 382 383 384 385
        }

        for(i=0;i<9;i++) {
            k = 0;
            for(j=0;j<22;j++) {
                band_index_long[i][j] = k;
                k += band_size_long[i][j];
            }
            band_index_long[i][22] = k;
        }

386
        /* compute n ^ (4/3) and store it in mantissa/exp format */
387

388
        int_pow_init();
389
        for(i=1;i<TABLE_4_3_SIZE;i++) {
390
            double f, fm;
391
            int e, m;
392 393
            f = pow((double)(i/4), 4.0 / 3.0) * pow(2, (i&3)*0.25);
            fm = frexp(f, &e);
394
            m = (uint32_t)(fm*(1LL<<31) + 0.5);
395
            e+= FRAC_BITS - 31 + 5 - 100;
396

397 398
            /* normalized to FRAC_BITS */
            table_4_3_value[i] = m;
399 400
//            av_log(NULL, AV_LOG_DEBUG, "%d %d %f\n", i, m, pow((double)i, 4.0 / 3.0));
            table_4_3_exp[i] = -e;
401
        }
402
        for(i=0; i<512*16; i++){
403 404
            int exponent= (i>>4);
            double f= pow(i&15, 4.0 / 3.0) * pow(2, (exponent-400)*0.25 + FRAC_BITS + 5);
405
            expval_table[exponent][i&15]= llrint(f);
406
            if((i&15)==1)
407
                exp_table[exponent]= llrint(f);
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
        for(i=0;i<7;i++) {
            float f;
            int v;
            if (i != 6) {
                f = tan((double)i * M_PI / 12.0);
                v = FIXR(f / (1.0 + f));
            } else {
                v = FIXR(1.0);
            }
            is_table[0][i] = v;
            is_table[1][6 - i] = v;
        }
        /* invalid values */
        for(i=7;i<16;i++)
            is_table[0][i] = is_table[1][i] = 0.0;

        for(i=0;i<16;i++) {
            double f;
            int e, k;

            for(j=0;j<2;j++) {
                e = -(j + 1) * ((i + 1) >> 1);
                f = pow(2.0, e / 4.0);
                k = i & 1;
                is_table_lsf[j][k ^ 1][i] = FIXR(f);
                is_table_lsf[j][k][i] = FIXR(1.0);
436
                dprintf(avctx, "is_table_lsf %d %d: %x %x\n",
437 438 439 440 441 442 443 444 445
                        i, j, is_table_lsf[j][0][i], is_table_lsf[j][1][i]);
            }
        }

        for(i=0;i<8;i++) {
            float ci, cs, ca;
            ci = ci_table[i];
            cs = 1.0 / sqrt(1.0 + ci * ci);
            ca = cs * ci;
Michael Niedermayer's avatar
Michael Niedermayer committed
446 447 448
            csa_table[i][0] = FIXHR(cs/4);
            csa_table[i][1] = FIXHR(ca/4);
            csa_table[i][2] = FIXHR(ca/4) + FIXHR(cs/4);
449
            csa_table[i][3] = FIXHR(ca/4) - FIXHR(cs/4);
450 451 452
            csa_table_float[i][0] = cs;
            csa_table_float[i][1] = ca;
            csa_table_float[i][2] = ca + cs;
453
            csa_table_float[i][3] = ca - cs;
454
//            printf("%d %d %d %d\n", FIX(cs), FIX(cs-1), FIX(ca), FIX(cs)-FIX(ca));
455
//            av_log(NULL, AV_LOG_DEBUG,"%f %f %f %f\n", cs, ca, ca+cs, ca-cs);
456 457 458 459
        }

        /* compute mdct windows */
        for(i=0;i<36;i++) {
460 461
            for(j=0; j<4; j++){
                double d;
462

Michael Niedermayer's avatar
Michael Niedermayer committed
463 464
                if(j==2 && i%3 != 1)
                    continue;
465

466 467 468 469 470 471 472 473 474 475 476
                d= sin(M_PI * (i + 0.5) / 36.0);
                if(j==1){
                    if     (i>=30) d= 0;
                    else if(i>=24) d= sin(M_PI * (i - 18 + 0.5) / 12.0);
                    else if(i>=18) d= 1;
                }else if(j==3){
                    if     (i<  6) d= 0;
                    else if(i< 12) d= sin(M_PI * (i -  6 + 0.5) / 12.0);
                    else if(i< 18) d= 1;
                }
                //merge last stage of imdct into the window coefficients
Michael Niedermayer's avatar
Michael Niedermayer committed
477 478 479 480 481 482
                d*= 0.5 / cos(M_PI*(2*i + 19)/72);

                if(j==2)
                    mdct_win[j][i/3] = FIXHR((d / (1<<5)));
                else
                    mdct_win[j][i  ] = FIXHR((d / (1<<5)));
483 484
//                av_log(NULL, AV_LOG_DEBUG, "%2d %d %f\n", i,j,d / (1<<5));
            }
485 486 487 488 489 490 491 492 493 494 495 496 497
        }

        /* NOTE: we do frequency inversion adter the MDCT by changing
           the sign of the right window coefs */
        for(j=0;j<4;j++) {
            for(i=0;i<36;i+=2) {
                mdct_win[j + 4][i] = mdct_win[j][i];
                mdct_win[j + 4][i + 1] = -mdct_win[j][i + 1];
            }
        }

#if defined(DEBUG)
        for(j=0;j<8;j++) {
498
            av_log(avctx, AV_LOG_DEBUG, "win%d=\n", j);
499
            for(i=0;i<36;i++)
500 501
                av_log(avctx, AV_LOG_DEBUG, "%f, ", (double)mdct_win[j][i] / FRAC_ONE);
            av_log(avctx, AV_LOG_DEBUG, "\n");
502 503
        }
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
504 505 506
        init = 1;
    }

507 508 509
#ifdef DEBUG
    s->frame_count = 0;
#endif
Roberto Togni's avatar
Roberto Togni committed
510 511
    if (avctx->codec_id == CODEC_ID_MP3ADU)
        s->adu_mode = 1;
Fabrice Bellard's avatar
Fabrice Bellard committed
512 513 514
    return 0;
}

515
/* tab[i][j] = 1.0 / (2.0 * cos(pi*(2*k+1) / 2^(6 - j))) */
516 517 518

/* cos(i*pi/64) */

519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553
#define COS0_0  FIXHR(0.50060299823519630134/2)
#define COS0_1  FIXHR(0.50547095989754365998/2)
#define COS0_2  FIXHR(0.51544730992262454697/2)
#define COS0_3  FIXHR(0.53104259108978417447/2)
#define COS0_4  FIXHR(0.55310389603444452782/2)
#define COS0_5  FIXHR(0.58293496820613387367/2)
#define COS0_6  FIXHR(0.62250412303566481615/2)
#define COS0_7  FIXHR(0.67480834145500574602/2)
#define COS0_8  FIXHR(0.74453627100229844977/2)
#define COS0_9  FIXHR(0.83934964541552703873/2)
#define COS0_10 FIXHR(0.97256823786196069369/2)
#define COS0_11 FIXHR(1.16943993343288495515/4)
#define COS0_12 FIXHR(1.48416461631416627724/4)
#define COS0_13 FIXHR(2.05778100995341155085/8)
#define COS0_14 FIXHR(3.40760841846871878570/8)
#define COS0_15 FIXHR(10.19000812354805681150/32)

#define COS1_0 FIXHR(0.50241928618815570551/2)
#define COS1_1 FIXHR(0.52249861493968888062/2)
#define COS1_2 FIXHR(0.56694403481635770368/2)
#define COS1_3 FIXHR(0.64682178335999012954/2)
#define COS1_4 FIXHR(0.78815462345125022473/2)
#define COS1_5 FIXHR(1.06067768599034747134/4)
#define COS1_6 FIXHR(1.72244709823833392782/4)
#define COS1_7 FIXHR(5.10114861868916385802/16)

#define COS2_0 FIXHR(0.50979557910415916894/2)
#define COS2_1 FIXHR(0.60134488693504528054/2)
#define COS2_2 FIXHR(0.89997622313641570463/2)
#define COS2_3 FIXHR(2.56291544774150617881/8)

#define COS3_0 FIXHR(0.54119610014619698439/2)
#define COS3_1 FIXHR(1.30656296487637652785/4)

#define COS4_0 FIXHR(0.70710678118654752439/2)
554 555

/* butterfly operator */
556
#define BF(a, b, c, s)\
557 558 559 560
{\
    tmp0 = tab[a] + tab[b];\
    tmp1 = tab[a] - tab[b];\
    tab[a] = tmp0;\
561
    tab[b] = MULH(tmp1<<(s), c);\
562 563 564 565
}

#define BF1(a, b, c, d)\
{\
566 567
    BF(a, b, COS4_0, 1);\
    BF(c, d,-COS4_0, 1);\
568 569 570 571 572
    tab[c] += tab[d];\
}

#define BF2(a, b, c, d)\
{\
573 574
    BF(a, b, COS4_0, 1);\
    BF(c, d,-COS4_0, 1);\
575 576 577 578 579 580 581 582 583
    tab[c] += tab[d];\
    tab[a] += tab[c];\
    tab[c] += tab[b];\
    tab[b] += tab[d];\
}

#define ADD(a, b) tab[a] += tab[b]

/* DCT32 without 1/sqrt(2) coef zero scaling. */
584
static void dct32(int32_t *out, int32_t *tab)
585 586 587 588
{
    int tmp0, tmp1;

    /* pass 1 */
589 590
    BF( 0, 31, COS0_0 , 1);
    BF(15, 16, COS0_15, 5);
591
    /* pass 2 */
592 593
    BF( 0, 15, COS1_0 , 1);
    BF(16, 31,-COS1_0 , 1);
594
    /* pass 1 */
595 596
    BF( 7, 24, COS0_7 , 1);
    BF( 8, 23, COS0_8 , 1);
597
    /* pass 2 */
598 599
    BF( 7,  8, COS1_7 , 4);
    BF(23, 24,-COS1_7 , 4);
600
    /* pass 3 */
601 602 603 604
    BF( 0,  7, COS2_0 , 1);
    BF( 8, 15,-COS2_0 , 1);
    BF(16, 23, COS2_0 , 1);
    BF(24, 31,-COS2_0 , 1);
605
    /* pass 1 */
606 607
    BF( 3, 28, COS0_3 , 1);
    BF(12, 19, COS0_12, 2);
608
    /* pass 2 */
609 610
    BF( 3, 12, COS1_3 , 1);
    BF(19, 28,-COS1_3 , 1);
611
    /* pass 1 */
612 613
    BF( 4, 27, COS0_4 , 1);
    BF(11, 20, COS0_11, 2);
614
    /* pass 2 */
615 616
    BF( 4, 11, COS1_4 , 1);
    BF(20, 27,-COS1_4 , 1);
617
    /* pass 3 */
618 619 620 621
    BF( 3,  4, COS2_3 , 3);
    BF(11, 12,-COS2_3 , 3);
    BF(19, 20, COS2_3 , 3);
    BF(27, 28,-COS2_3 , 3);
622
    /* pass 4 */
623 624 625 626 627 628 629 630
    BF( 0,  3, COS3_0 , 1);
    BF( 4,  7,-COS3_0 , 1);
    BF( 8, 11, COS3_0 , 1);
    BF(12, 15,-COS3_0 , 1);
    BF(16, 19, COS3_0 , 1);
    BF(20, 23,-COS3_0 , 1);
    BF(24, 27, COS3_0 , 1);
    BF(28, 31,-COS3_0 , 1);
631

632 633 634


    /* pass 1 */
635 636
    BF( 1, 30, COS0_1 , 1);
    BF(14, 17, COS0_14, 3);
637
    /* pass 2 */
638 639
    BF( 1, 14, COS1_1 , 1);
    BF(17, 30,-COS1_1 , 1);
640
    /* pass 1 */
641 642
    BF( 6, 25, COS0_6 , 1);
    BF( 9, 22, COS0_9 , 1);
643
    /* pass 2 */
644 645
    BF( 6,  9, COS1_6 , 2);
    BF(22, 25,-COS1_6 , 2);
646
    /* pass 3 */
647 648 649 650
    BF( 1,  6, COS2_1 , 1);
    BF( 9, 14,-COS2_1 , 1);
    BF(17, 22, COS2_1 , 1);
    BF(25, 30,-COS2_1 , 1);
651

652
    /* pass 1 */
653 654
    BF( 2, 29, COS0_2 , 1);
    BF(13, 18, COS0_13, 3);
655
    /* pass 2 */
656 657
    BF( 2, 13, COS1_2 , 1);
    BF(18, 29,-COS1_2 , 1);
658
    /* pass 1 */
659 660
    BF( 5, 26, COS0_5 , 1);
    BF(10, 21, COS0_10, 1);
661
    /* pass 2 */
662 663
    BF( 5, 10, COS1_5 , 2);
    BF(21, 26,-COS1_5 , 2);
664
    /* pass 3 */
665 666 667 668
    BF( 2,  5, COS2_2 , 1);
    BF(10, 13,-COS2_2 , 1);
    BF(18, 21, COS2_2 , 1);
    BF(26, 29,-COS2_2 , 1);
669
    /* pass 4 */
670 671 672 673 674 675 676 677
    BF( 1,  2, COS3_1 , 2);
    BF( 5,  6,-COS3_1 , 2);
    BF( 9, 10, COS3_1 , 2);
    BF(13, 14,-COS3_1 , 2);
    BF(17, 18, COS3_1 , 2);
    BF(21, 22,-COS3_1 , 2);
    BF(25, 26, COS3_1 , 2);
    BF(29, 30,-COS3_1 , 2);
678

679
    /* pass 5 */
680 681 682
    BF1( 0,  1,  2,  3);
    BF2( 4,  5,  6,  7);
    BF1( 8,  9, 10, 11);
683 684 685 686 687
    BF2(12, 13, 14, 15);
    BF1(16, 17, 18, 19);
    BF2(20, 21, 22, 23);
    BF1(24, 25, 26, 27);
    BF2(28, 29, 30, 31);
688

689
    /* pass 6 */
690

691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714
    ADD( 8, 12);
    ADD(12, 10);
    ADD(10, 14);
    ADD(14,  9);
    ADD( 9, 13);
    ADD(13, 11);
    ADD(11, 15);

    out[ 0] = tab[0];
    out[16] = tab[1];
    out[ 8] = tab[2];
    out[24] = tab[3];
    out[ 4] = tab[4];
    out[20] = tab[5];
    out[12] = tab[6];
    out[28] = tab[7];
    out[ 2] = tab[8];
    out[18] = tab[9];
    out[10] = tab[10];
    out[26] = tab[11];
    out[ 6] = tab[12];
    out[22] = tab[13];
    out[14] = tab[14];
    out[30] = tab[15];
715

716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743
    ADD(24, 28);
    ADD(28, 26);
    ADD(26, 30);
    ADD(30, 25);
    ADD(25, 29);
    ADD(29, 27);
    ADD(27, 31);

    out[ 1] = tab[16] + tab[24];
    out[17] = tab[17] + tab[25];
    out[ 9] = tab[18] + tab[26];
    out[25] = tab[19] + tab[27];
    out[ 5] = tab[20] + tab[28];
    out[21] = tab[21] + tab[29];
    out[13] = tab[22] + tab[30];
    out[29] = tab[23] + tab[31];
    out[ 3] = tab[24] + tab[20];
    out[19] = tab[25] + tab[21];
    out[11] = tab[26] + tab[22];
    out[27] = tab[27] + tab[23];
    out[ 7] = tab[28] + tab[18];
    out[23] = tab[29] + tab[19];
    out[15] = tab[30] + tab[17];
    out[31] = tab[31];
}

#if FRAC_BITS <= 15

744
static inline int round_sample(int *sum)
745 746
{
    int sum1;
747 748
    sum1 = (*sum) >> OUT_SHIFT;
    *sum &= (1<<OUT_SHIFT)-1;
749 750 751 752
    if (sum1 < OUT_MIN)
        sum1 = OUT_MIN;
    else if (sum1 > OUT_MAX)
        sum1 = OUT_MAX;
753
    return sum1;
754 755
}

Luca Barbato's avatar
Luca Barbato committed
756 757
/* signed 16x16 -> 32 multiply add accumulate */
#define MACS(rt, ra, rb) MAC16(rt, ra, rb)
Siarhei Siamashka's avatar
Siarhei Siamashka committed
758

Luca Barbato's avatar
Luca Barbato committed
759 760
/* signed 16x16 -> 32 multiply */
#define MULS(ra, rb) MUL16(ra, rb)
761

762 763
#else

764
static inline int round_sample(int64_t *sum)
765 766
{
    int sum1;
767 768
    sum1 = (int)((*sum) >> OUT_SHIFT);
    *sum &= (1<<OUT_SHIFT)-1;
769 770 771 772
    if (sum1 < OUT_MIN)
        sum1 = OUT_MIN;
    else if (sum1 > OUT_MAX)
        sum1 = OUT_MAX;
773
    return sum1;
774 775
}

776
#   define MULS(ra, rb) MUL64(ra, rb)
777 778 779
#endif

#define SUM8(sum, op, w, p) \
780
{                                               \
781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817
    sum op MULS((w)[0 * 64], p[0 * 64]);\
    sum op MULS((w)[1 * 64], p[1 * 64]);\
    sum op MULS((w)[2 * 64], p[2 * 64]);\
    sum op MULS((w)[3 * 64], p[3 * 64]);\
    sum op MULS((w)[4 * 64], p[4 * 64]);\
    sum op MULS((w)[5 * 64], p[5 * 64]);\
    sum op MULS((w)[6 * 64], p[6 * 64]);\
    sum op MULS((w)[7 * 64], p[7 * 64]);\
}

#define SUM8P2(sum1, op1, sum2, op2, w1, w2, p) \
{                                               \
    int tmp;\
    tmp = p[0 * 64];\
    sum1 op1 MULS((w1)[0 * 64], tmp);\
    sum2 op2 MULS((w2)[0 * 64], tmp);\
    tmp = p[1 * 64];\
    sum1 op1 MULS((w1)[1 * 64], tmp);\
    sum2 op2 MULS((w2)[1 * 64], tmp);\
    tmp = p[2 * 64];\
    sum1 op1 MULS((w1)[2 * 64], tmp);\
    sum2 op2 MULS((w2)[2 * 64], tmp);\
    tmp = p[3 * 64];\
    sum1 op1 MULS((w1)[3 * 64], tmp);\
    sum2 op2 MULS((w2)[3 * 64], tmp);\
    tmp = p[4 * 64];\
    sum1 op1 MULS((w1)[4 * 64], tmp);\
    sum2 op2 MULS((w2)[4 * 64], tmp);\
    tmp = p[5 * 64];\
    sum1 op1 MULS((w1)[5 * 64], tmp);\
    sum2 op2 MULS((w2)[5 * 64], tmp);\
    tmp = p[6 * 64];\
    sum1 op1 MULS((w1)[6 * 64], tmp);\
    sum2 op2 MULS((w2)[6 * 64], tmp);\
    tmp = p[7 * 64];\
    sum1 op1 MULS((w1)[7 * 64], tmp);\
    sum2 op2 MULS((w2)[7 * 64], tmp);\
818 819
}

820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835
void ff_mpa_synth_init(MPA_INT *window)
{
    int i;

    /* max = 18760, max sum over all 16 coefs : 44736 */
    for(i=0;i<257;i++) {
        int v;
        v = mpa_enwindow[i];
#if WFRAC_BITS < 16
        v = (v + (1 << (16 - WFRAC_BITS - 1))) >> (16 - WFRAC_BITS);
#endif
        window[i] = v;
        if ((i & 63) != 0)
            v = -v;
        if (i != 0)
            window[512 - i] = v;
836
    }
837
}
838 839 840 841

/* 32 sub band synthesis filter. Input: 32 sub band samples, Output:
   32 samples. */
/* XXX: optimize by avoiding ring buffer usage */
842
void ff_mpa_synth_filter(MPA_INT *synth_buf_ptr, int *synth_buf_offset,
843
                         MPA_INT *window, int *dither_state,
844
                         OUT_INT *samples, int incr,
845
                         int32_t sb_samples[SBLIMIT])
846
{
847
    int32_t tmp[32];
848
    register MPA_INT *synth_buf;
Alex Beregszaszi's avatar
Alex Beregszaszi committed
849
    register const MPA_INT *w, *w2, *p;
850
    int j, offset, v;
851
    OUT_INT *samples2;
852
#if FRAC_BITS <= 15
853
    int sum, sum2;
854
#else
855
    int64_t sum, sum2;
856
#endif
857

858
    dct32(tmp, sb_samples);
859

860 861
    offset = *synth_buf_offset;
    synth_buf = synth_buf_ptr + offset;
862 863 864 865

    for(j=0;j<32;j++) {
        v = tmp[j];
#if FRAC_BITS <= 15
866 867
        /* NOTE: can cause a loss in precision if very high amplitude
           sound */
868 869 870 871 872 873 874 875 876 877
        if (v > 32767)
            v = 32767;
        else if (v < -32768)
            v = -32768;
#endif
        synth_buf[j] = v;
    }
    /* copy to avoid wrap */
    memcpy(synth_buf + 512, synth_buf, 32 * sizeof(MPA_INT));

878
    samples2 = samples + 31 * incr;
879
    w = window;
880 881
    w2 = window + 31;

882
    sum = *dither_state;
883 884 885 886
    p = synth_buf + 16;
    SUM8(sum, +=, w, p);
    p = synth_buf + 48;
    SUM8(sum, -=, w + 32, p);
887
    *samples = round_sample(&sum);
888
    samples += incr;
889 890
    w++;

891 892 893 894 895 896 897 898 899
    /* we calculate two samples at the same time to avoid one memory
       access per two sample */
    for(j=1;j<16;j++) {
        sum2 = 0;
        p = synth_buf + 16 + j;
        SUM8P2(sum, +=, sum2, -=, w, w2, p);
        p = synth_buf + 48 - j;
        SUM8P2(sum, -=, sum2, -=, w + 32, w2 + 32, p);

900
        *samples = round_sample(&sum);
901
        samples += incr;
902 903
        sum += sum2;
        *samples2 = round_sample(&sum);
904
        samples2 -= incr;
905
        w++;
906
        w2--;
907
    }
908

909 910
    p = synth_buf + 32;
    SUM8(sum, -=, w + 32, p);
911
    *samples = round_sample(&sum);
912
    *dither_state= sum;
913

914
    offset = (offset - 32) & 511;
915
    *synth_buf_offset = offset;
916 917
}

Michael Niedermayer's avatar
Michael Niedermayer committed
918 919 920 921 922 923 924 925 926 927 928 929 930 931
#define C3 FIXHR(0.86602540378443864676/2)

/* 0.5 / cos(pi*(2*i+1)/36) */
static const int icos36[9] = {
    FIXR(0.50190991877167369479),
    FIXR(0.51763809020504152469), //0
    FIXR(0.55168895948124587824),
    FIXR(0.61038729438072803416),
    FIXR(0.70710678118654752439), //1
    FIXR(0.87172339781054900991),
    FIXR(1.18310079157624925896),
    FIXR(1.93185165257813657349), //2
    FIXR(5.73685662283492756461),
};
932

933 934 935 936 937 938 939 940 941 942 943 944 945
/* 0.5 / cos(pi*(2*i+1)/36) */
static const int icos36h[9] = {
    FIXHR(0.50190991877167369479/2),
    FIXHR(0.51763809020504152469/2), //0
    FIXHR(0.55168895948124587824/2),
    FIXHR(0.61038729438072803416/2),
    FIXHR(0.70710678118654752439/2), //1
    FIXHR(0.87172339781054900991/2),
    FIXHR(1.18310079157624925896/4),
    FIXHR(1.93185165257813657349/4), //2
//    FIXHR(5.73685662283492756461),
};

946 947 948 949
/* 12 points IMDCT. We compute it "by hand" by factorizing obvious
   cases. */
static void imdct12(int *out, int *in)
{
Michael Niedermayer's avatar
Michael Niedermayer committed
950
    int in0, in1, in2, in3, in4, in5, t1, t2;
951 952 953 954 955 956 957

    in0= in[0*3];
    in1= in[1*3] + in[0*3];
    in2= in[2*3] + in[1*3];
    in3= in[3*3] + in[2*3];
    in4= in[4*3] + in[3*3];
    in5= in[5*3] + in[4*3];
Michael Niedermayer's avatar
Michael Niedermayer committed
958 959 960 961
    in5 += in3;
    in3 += in1;

    in2= MULH(2*in2, C3);
962
    in3= MULH(4*in3, C3);
963

Michael Niedermayer's avatar
Michael Niedermayer committed
964
    t1 = in0 - in4;
965
    t2 = MULH(2*(in1 - in5), icos36h[4]);
Michael Niedermayer's avatar
Michael Niedermayer committed
966

967
    out[ 7]=
Michael Niedermayer's avatar
Michael Niedermayer committed
968 969 970 971 972 973
    out[10]= t1 + t2;
    out[ 1]=
    out[ 4]= t1 - t2;

    in0 += in4>>1;
    in4 = in0 + in2;
974 975
    in5 += 2*in1;
    in1 = MULH(in5 + in3, icos36h[1]);
976
    out[ 8]=
977
    out[ 9]= in4 + in1;
Michael Niedermayer's avatar
Michael Niedermayer committed
978
    out[ 2]=
979
    out[ 3]= in4 - in1;
980

Michael Niedermayer's avatar
Michael Niedermayer committed
981
    in0 -= in2;
982
    in5 = MULH(2*(in5 - in3), icos36h[7]);
Michael Niedermayer's avatar
Michael Niedermayer committed
983
    out[ 0]=
984
    out[ 5]= in0 - in5;
Michael Niedermayer's avatar
Michael Niedermayer committed
985
    out[ 6]=
986
    out[11]= in0 + in5;
987 988 989
}

/* cos(pi*i/18) */
990 991 992 993 994 995 996 997 998
#define C1 FIXHR(0.98480775301220805936/2)
#define C2 FIXHR(0.93969262078590838405/2)
#define C3 FIXHR(0.86602540378443864676/2)
#define C4 FIXHR(0.76604444311897803520/2)
#define C5 FIXHR(0.64278760968653932632/2)
#define C6 FIXHR(0.5/2)
#define C7 FIXHR(0.34202014332566873304/2)
#define C8 FIXHR(0.17364817766693034885/2)

999 1000

/* using Lee like decomposition followed by hand coded 9 points DCT */
1001
static void imdct36(int *out, int *buf, int *in, int *win)
1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013
{
    int i, j, t0, t1, t2, t3, s0, s1, s2, s3;
    int tmp[18], *tmp1, *in1;

    for(i=17;i>=1;i--)
        in[i] += in[i-1];
    for(i=17;i>=3;i-=2)
        in[i] += in[i-2];

    for(j=0;j<2;j++) {
        tmp1 = tmp + j;
        in1 = in + j;
1014 1015 1016 1017
#if 0
//more accurate but slower
        int64_t t0, t1, t2, t3;
        t2 = in1[2*4] + in1[2*8] - in1[2*2];
1018

1019 1020 1021 1022 1023 1024 1025 1026
        t3 = (in1[2*0] + (int64_t)(in1[2*6]>>1))<<32;
        t1 = in1[2*0] - in1[2*6];
        tmp1[ 6] = t1 - (t2>>1);
        tmp1[16] = t1 + t2;

        t0 = MUL64(2*(in1[2*2] + in1[2*4]),    C2);
        t1 = MUL64(   in1[2*4] - in1[2*8] , -2*C8);
        t2 = MUL64(2*(in1[2*2] + in1[2*8]),   -C4);
1027

1028 1029 1030
        tmp1[10] = (t3 - t0 - t2) >> 32;
        tmp1[ 2] = (t3 + t0 + t1) >> 32;
        tmp1[14] = (t3 + t2 - t1) >> 32;
1031

1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043
        tmp1[ 4] = MULH(2*(in1[2*5] + in1[2*7] - in1[2*1]), -C3);
        t2 = MUL64(2*(in1[2*1] + in1[2*5]),    C1);
        t3 = MUL64(   in1[2*5] - in1[2*7] , -2*C7);
        t0 = MUL64(2*in1[2*3], C3);

        t1 = MUL64(2*(in1[2*1] + in1[2*7]),   -C5);

        tmp1[ 0] = (t2 + t3 + t0) >> 32;
        tmp1[12] = (t2 + t1 - t0) >> 32;
        tmp1[ 8] = (t3 - t1 - t0) >> 32;
#else
        t2 = in1[2*4] + in1[2*8] - in1[2*2];
1044

1045 1046 1047 1048 1049 1050 1051 1052
        t3 = in1[2*0] + (in1[2*6]>>1);
        t1 = in1[2*0] - in1[2*6];
        tmp1[ 6] = t1 - (t2>>1);
        tmp1[16] = t1 + t2;

        t0 = MULH(2*(in1[2*2] + in1[2*4]),    C2);
        t1 = MULH(   in1[2*4] - in1[2*8] , -2*C8);
        t2 = MULH(2*(in1[2*2] + in1[2*8]),   -C4);
1053

1054 1055 1056
        tmp1[10] = t3 - t0 - t2;
        tmp1[ 2] = t3 + t0 + t1;
        tmp1[14] = t3 + t2 - t1;
1057

1058 1059 1060 1061
        tmp1[ 4] = MULH(2*(in1[2*5] + in1[2*7] - in1[2*1]), -C3);
        t2 = MULH(2*(in1[2*1] + in1[2*5]),    C1);
        t3 = MULH(   in1[2*5] - in1[2*7] , -2*C7);
        t0 = MULH(2*in1[2*3], C3);
1062

1063 1064 1065 1066 1067 1068
        t1 = MULH(2*(in1[2*1] + in1[2*7]),   -C5);

        tmp1[ 0] = t2 + t3 + t0;
        tmp1[12] = t2 + t1 - t0;
        tmp1[ 8] = t3 - t1 - t0;
#endif
1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079
    }

    i = 0;
    for(j=0;j<4;j++) {
        t0 = tmp[i];
        t1 = tmp[i + 2];
        s0 = t1 + t0;
        s2 = t1 - t0;

        t2 = tmp[i + 1];
        t3 = tmp[i + 3];
1080
        s1 = MULH(2*(t3 + t2), icos36h[j]);
1081
        s3 = MULL(t3 - t2, icos36[8 - j]);
1082

1083 1084
        t0 = s0 + s1;
        t1 = s0 - s1;
Michael Niedermayer's avatar
Michael Niedermayer committed
1085
        out[(9 + j)*SBLIMIT] =  MULH(t1, win[9 + j]) + buf[9 + j];
1086 1087 1088
        out[(8 - j)*SBLIMIT] =  MULH(t1, win[8 - j]) + buf[8 - j];
        buf[9 + j] = MULH(t0, win[18 + 9 + j]);
        buf[8 - j] = MULH(t0, win[18 + 8 - j]);
1089

1090 1091
        t0 = s2 + s3;
        t1 = s2 - s3;
Michael Niedermayer's avatar
Michael Niedermayer committed
1092
        out[(9 + 8 - j)*SBLIMIT] =  MULH(t1, win[9 + 8 - j]) + buf[9 + 8 - j];
1093 1094 1095
        out[(        j)*SBLIMIT] =  MULH(t1, win[        j]) + buf[        j];
        buf[9 + 8 - j] = MULH(t0, win[18 + 9 + 8 - j]);
        buf[      + j] = MULH(t0, win[18         + j]);
1096 1097 1098 1099
        i += 4;
    }

    s0 = tmp[16];
1100
    s1 = MULH(2*tmp[17], icos36h[4]);
1101 1102
    t0 = s0 + s1;
    t1 = s0 - s1;
Michael Niedermayer's avatar
Michael Niedermayer committed
1103
    out[(9 + 4)*SBLIMIT] =  MULH(t1, win[9 + 4]) + buf[9 + 4];
1104 1105 1106
    out[(8 - 4)*SBLIMIT] =  MULH(t1, win[8 - 4]) + buf[8 - 4];
    buf[9 + 4] = MULH(t0, win[18 + 9 + 4]);
    buf[8 - 4] = MULH(t0, win[18 + 8 - 4]);
1107 1108
}

Fabrice Bellard's avatar
Fabrice Bellard committed
1109
/* header decoding. MUST check the header before because no
1110 1111
   consistency check is done there. Return 1 if free format found and
   that the frame size must be computed externally */
1112
static int decode_header(MPADecodeContext *s, uint32_t header)
Fabrice Bellard's avatar
Fabrice Bellard committed
1113
{
1114 1115
    int sample_rate, frame_size, mpeg25, padding;
    int sample_rate_index, bitrate_index;
Fabrice Bellard's avatar
Fabrice Bellard committed
1116
    if (header & (1<<20)) {
1117 1118
        s->lsf = (header & (1<<19)) ? 0 : 1;
        mpeg25 = 0;
Fabrice Bellard's avatar
Fabrice Bellard committed
1119
    } else {
1120 1121
        s->lsf = 1;
        mpeg25 = 1;
Fabrice Bellard's avatar
Fabrice Bellard committed
1122
    }
1123

Fabrice Bellard's avatar
Fabrice Bellard committed
1124 1125
    s->layer = 4 - ((header >> 17) & 3);
    /* extract frequency */
1126 1127 1128 1129 1130
    sample_rate_index = (header >> 10) & 3;
    sample_rate = mpa_freq_tab[sample_rate_index] >> (s->lsf + mpeg25);
    sample_rate_index += 3 * (s->lsf + mpeg25);
    s->sample_rate_index = sample_rate_index;
    s->error_protection = ((header >> 16) & 1) ^ 1;
1131
    s->sample_rate = sample_rate;
Fabrice Bellard's avatar
Fabrice Bellard committed
1132

1133 1134 1135 1136 1137 1138 1139 1140
    bitrate_index = (header >> 12) & 0xf;
    padding = (header >> 9) & 1;
    //extension = (header >> 8) & 1;
    s->mode = (header >> 6) & 3;
    s->mode_ext = (header >> 4) & 3;
    //copyright = (header >> 3) & 1;
    //original = (header >> 2) & 1;
    //emphasis = header & 3;
Fabrice Bellard's avatar
Fabrice Bellard committed
1141

1142 1143 1144 1145
    if (s->mode == MPA_MONO)
        s->nb_channels = 1;
    else
        s->nb_channels = 2;
1146

1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167
    if (bitrate_index != 0) {
        frame_size = mpa_bitrate_tab[s->lsf][s->layer - 1][bitrate_index];
        s->bit_rate = frame_size * 1000;
        switch(s->layer) {
        case 1:
            frame_size = (frame_size * 12000) / sample_rate;
            frame_size = (frame_size + padding) * 4;
            break;
        case 2:
            frame_size = (frame_size * 144000) / sample_rate;
            frame_size += padding;
            break;
        default:
        case 3:
            frame_size = (frame_size * 144000) / (sample_rate << s->lsf);
            frame_size += padding;
            break;
        }
        s->frame_size = frame_size;
    } else {
        /* if no frame size computed, signal it */
1168
        return 1;
Fabrice Bellard's avatar
Fabrice Bellard committed
1169
    }
1170

1171
#if defined(DEBUG)
1172
    dprintf(s->avctx, "layer%d, %d Hz, %d kbits/s, ",
1173 1174 1175 1176
           s->layer, s->sample_rate, s->bit_rate);
    if (s->nb_channels == 2) {
        if (s->layer == 3) {
            if (s->mode_ext & MODE_EXT_MS_STEREO)
1177
                dprintf(s->avctx, "ms-");
1178
            if (s->mode_ext & MODE_EXT_I_STEREO)
1179
                dprintf(s->avctx, "i-");
1180
        }
1181
        dprintf(s->avctx, "stereo");
1182
    } else {
1183
        dprintf(s->avctx, "mono");
1184
    }
1185
    dprintf(s->avctx, "\n");
Fabrice Bellard's avatar
Fabrice Bellard committed
1186
#endif
1187
    return 0;
Fabrice Bellard's avatar
Fabrice Bellard committed
1188 1189
}

1190
/* useful helper to get mpeg audio stream infos. Return -1 if error in
1191
   header, otherwise the coded frame size in bytes */
1192
int mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate)
1193 1194
{
    MPADecodeContext s1, *s = &s1;
1195
    s1.avctx = avctx;
1196

1197
    if (ff_mpa_check_header(head) != 0)
1198 1199 1200 1201 1202 1203 1204 1205
        return -1;

    if (decode_header(s, head) != 0) {
        return -1;
    }

    switch(s->layer) {
    case 1:
1206
        avctx->frame_size = 384;
1207 1208
        break;
    case 2:
1209
        avctx->frame_size = 1152;
1210 1211 1212 1213
        break;
    default:
    case 3:
        if (s->lsf)
1214
            avctx->frame_size = 576;
1215
        else
1216
            avctx->frame_size = 1152;
1217 1218 1219
        break;
    }

1220
    *sample_rate = s->sample_rate;
1221 1222 1223 1224
    avctx->channels = s->nb_channels;
    avctx->bit_rate = s->bit_rate;
    avctx->sub_id = s->layer;
    return s->frame_size;
1225 1226
}

1227 1228
/* return the number of decoded frames */
static int mp_decode_layer1(MPADecodeContext *s)
Fabrice Bellard's avatar
Fabrice Bellard committed
1229
{
1230
    int bound, i, v, n, ch, j, mant;
1231 1232
    uint8_t allocation[MPA_MAX_CHANNELS][SBLIMIT];
    uint8_t scale_factors[MPA_MAX_CHANNELS][SBLIMIT];
1233

1234
    if (s->mode == MPA_JSTEREO)
1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261
        bound = (s->mode_ext + 1) * 4;
    else
        bound = SBLIMIT;

    /* allocation bits */
    for(i=0;i<bound;i++) {
        for(ch=0;ch<s->nb_channels;ch++) {
            allocation[ch][i] = get_bits(&s->gb, 4);
        }
    }
    for(i=bound;i<SBLIMIT;i++) {
        allocation[0][i] = get_bits(&s->gb, 4);
    }

    /* scale factors */
    for(i=0;i<bound;i++) {
        for(ch=0;ch<s->nb_channels;ch++) {
            if (allocation[ch][i])
                scale_factors[ch][i] = get_bits(&s->gb, 6);
        }
    }
    for(i=bound;i<SBLIMIT;i++) {
        if (allocation[0][i]) {
            scale_factors[0][i] = get_bits(&s->gb, 6);
            scale_factors[1][i] = get_bits(&s->gb, 6);
        }
    }
1262

1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297
    /* compute samples */
    for(j=0;j<12;j++) {
        for(i=0;i<bound;i++) {
            for(ch=0;ch<s->nb_channels;ch++) {
                n = allocation[ch][i];
                if (n) {
                    mant = get_bits(&s->gb, n + 1);
                    v = l1_unscale(n, mant, scale_factors[ch][i]);
                } else {
                    v = 0;
                }
                s->sb_samples[ch][j][i] = v;
            }
        }
        for(i=bound;i<SBLIMIT;i++) {
            n = allocation[0][i];
            if (n) {
                mant = get_bits(&s->gb, n + 1);
                v = l1_unscale(n, mant, scale_factors[0][i]);
                s->sb_samples[0][j][i] = v;
                v = l1_unscale(n, mant, scale_factors[1][i]);
                s->sb_samples[1][j][i] = v;
            } else {
                s->sb_samples[0][j][i] = 0;
                s->sb_samples[1][j][i] = 0;
            }
        }
    }
    return 12;
}

/* bitrate is in kb/s */
int l2_select_table(int bitrate, int nb_channels, int freq, int lsf)
{
    int ch_bitrate, table;
1298

1299 1300 1301
    ch_bitrate = bitrate / nb_channels;
    if (!lsf) {
        if ((freq == 48000 && ch_bitrate >= 56) ||
1302
            (ch_bitrate >= 56 && ch_bitrate <= 80))
1303
            table = 0;
1304
        else if (freq != 48000 && ch_bitrate >= 96)
1305
            table = 1;
1306
        else if (freq != 32000 && ch_bitrate <= 48)
1307
            table = 2;
1308
        else
1309 1310 1311 1312 1313 1314
            table = 3;
    } else {
        table = 4;
    }
    return table;
}
Fabrice Bellard's avatar
Fabrice Bellard committed
1315

1316 1317 1318 1319 1320 1321 1322 1323 1324
static int mp_decode_layer2(MPADecodeContext *s)
{
    int sblimit; /* number of used subbands */
    const unsigned char *alloc_table;
    int table, bit_alloc_bits, i, j, ch, bound, v;
    unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT];
    unsigned char scale_code[MPA_MAX_CHANNELS][SBLIMIT];
    unsigned char scale_factors[MPA_MAX_CHANNELS][SBLIMIT][3], *sf;
    int scale, qindex, bits, steps, k, l, m, b;
Fabrice Bellard's avatar
Fabrice Bellard committed
1325

1326
    /* select decoding table */
1327
    table = l2_select_table(s->bit_rate / 1000, s->nb_channels,
1328 1329 1330 1331
                            s->sample_rate, s->lsf);
    sblimit = sblimit_table[table];
    alloc_table = alloc_tables[table];

1332
    if (s->mode == MPA_JSTEREO)
1333 1334 1335 1336
        bound = (s->mode_ext + 1) * 4;
    else
        bound = sblimit;

1337
    dprintf(s->avctx, "bound=%d sblimit=%d\n", bound, sblimit);
1338 1339 1340 1341

    /* sanity check */
    if( bound > sblimit ) bound = sblimit;

1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356
    /* parse bit allocation */
    j = 0;
    for(i=0;i<bound;i++) {
        bit_alloc_bits = alloc_table[j];
        for(ch=0;ch<s->nb_channels;ch++) {
            bit_alloc[ch][i] = get_bits(&s->gb, bit_alloc_bits);
        }
        j += 1 << bit_alloc_bits;
    }
    for(i=bound;i<sblimit;i++) {
        bit_alloc_bits = alloc_table[j];
        v = get_bits(&s->gb, bit_alloc_bits);
        bit_alloc[0][i] = v;
        bit_alloc[1][i] = v;
        j += 1 << bit_alloc_bits;
Fabrice Bellard's avatar
Fabrice Bellard committed
1357
    }
1358 1359 1360 1361 1362

#ifdef DEBUG
    {
        for(ch=0;ch<s->nb_channels;ch++) {
            for(i=0;i<sblimit;i++)
1363 1364
                dprintf(s->avctx, " %d", bit_alloc[ch][i]);
            dprintf(s->avctx, "\n");
1365 1366 1367 1368 1369 1370 1371
        }
    }
#endif

    /* scale codes */
    for(i=0;i<sblimit;i++) {
        for(ch=0;ch<s->nb_channels;ch++) {
1372
            if (bit_alloc[ch][i])
1373 1374 1375
                scale_code[ch][i] = get_bits(&s->gb, 2);
        }
    }
1376

1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413
    /* scale factors */
    for(i=0;i<sblimit;i++) {
        for(ch=0;ch<s->nb_channels;ch++) {
            if (bit_alloc[ch][i]) {
                sf = scale_factors[ch][i];
                switch(scale_code[ch][i]) {
                default:
                case 0:
                    sf[0] = get_bits(&s->gb, 6);
                    sf[1] = get_bits(&s->gb, 6);
                    sf[2] = get_bits(&s->gb, 6);
                    break;
                case 2:
                    sf[0] = get_bits(&s->gb, 6);
                    sf[1] = sf[0];
                    sf[2] = sf[0];
                    break;
                case 1:
                    sf[0] = get_bits(&s->gb, 6);
                    sf[2] = get_bits(&s->gb, 6);
                    sf[1] = sf[0];
                    break;
                case 3:
                    sf[0] = get_bits(&s->gb, 6);
                    sf[2] = get_bits(&s->gb, 6);
                    sf[1] = sf[2];
                    break;
                }
            }
        }
    }

#ifdef DEBUG
    for(ch=0;ch<s->nb_channels;ch++) {
        for(i=0;i<sblimit;i++) {
            if (bit_alloc[ch][i]) {
                sf = scale_factors[ch][i];
1414
                dprintf(s->avctx, " %d %d %d", sf[0], sf[1], sf[2]);
1415
            } else {
1416
                dprintf(s->avctx, " -");
1417 1418
            }
        }
1419
        dprintf(s->avctx, "\n");
1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438
    }
#endif

    /* samples */
    for(k=0;k<3;k++) {
        for(l=0;l<12;l+=3) {
            j = 0;
            for(i=0;i<bound;i++) {
                bit_alloc_bits = alloc_table[j];
                for(ch=0;ch<s->nb_channels;ch++) {
                    b = bit_alloc[ch][i];
                    if (b) {
                        scale = scale_factors[ch][i][k];
                        qindex = alloc_table[j+b];
                        bits = quant_bits[qindex];
                        if (bits < 0) {
                            /* 3 values at the same time */
                            v = get_bits(&s->gb, -bits);
                            steps = quant_steps[qindex];
1439
                            s->sb_samples[ch][k * 12 + l + 0][i] =
1440 1441
                                l2_unscale_group(steps, v % steps, scale);
                            v = v / steps;
1442
                            s->sb_samples[ch][k * 12 + l + 1][i] =
1443 1444
                                l2_unscale_group(steps, v % steps, scale);
                            v = v / steps;
1445
                            s->sb_samples[ch][k * 12 + l + 2][i] =
1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460
                                l2_unscale_group(steps, v, scale);
                        } else {
                            for(m=0;m<3;m++) {
                                v = get_bits(&s->gb, bits);
                                v = l1_unscale(bits - 1, v, scale);
                                s->sb_samples[ch][k * 12 + l + m][i] = v;
                            }
                        }
                    } else {
                        s->sb_samples[ch][k * 12 + l + 0][i] = 0;
                        s->sb_samples[ch][k * 12 + l + 1][i] = 0;
                        s->sb_samples[ch][k * 12 + l + 2][i] = 0;
                    }
                }
                /* next subband in alloc table */
1461
                j += 1 << bit_alloc_bits;
1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478
            }
            /* XXX: find a way to avoid this duplication of code */
            for(i=bound;i<sblimit;i++) {
                bit_alloc_bits = alloc_table[j];
                b = bit_alloc[0][i];
                if (b) {
                    int mant, scale0, scale1;
                    scale0 = scale_factors[0][i][k];
                    scale1 = scale_factors[1][i][k];
                    qindex = alloc_table[j+b];
                    bits = quant_bits[qindex];
                    if (bits < 0) {
                        /* 3 values at the same time */
                        v = get_bits(&s->gb, -bits);
                        steps = quant_steps[qindex];
                        mant = v % steps;
                        v = v / steps;
1479
                        s->sb_samples[0][k * 12 + l + 0][i] =
1480
                            l2_unscale_group(steps, mant, scale0);
1481
                        s->sb_samples[1][k * 12 + l + 0][i] =
1482 1483 1484
                            l2_unscale_group(steps, mant, scale1);
                        mant = v % steps;
                        v = v / steps;
1485
                        s->sb_samples[0][k * 12 + l + 1][i] =
1486
                            l2_unscale_group(steps, mant, scale0);
1487
                        s->sb_samples[1][k * 12 + l + 1][i] =
1488
                            l2_unscale_group(steps, mant, scale1);
1489
                        s->sb_samples[0][k * 12 + l + 2][i] =
1490
                            l2_unscale_group(steps, v, scale0);
1491
                        s->sb_samples[1][k * 12 + l + 2][i] =
1492 1493 1494 1495
                            l2_unscale_group(steps, v, scale1);
                    } else {
                        for(m=0;m<3;m++) {
                            mant = get_bits(&s->gb, bits);
1496
                            s->sb_samples[0][k * 12 + l + m][i] =
1497
                                l1_unscale(bits - 1, mant, scale0);
1498
                            s->sb_samples[1][k * 12 + l + m][i] =
1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510
                                l1_unscale(bits - 1, mant, scale1);
                        }
                    }
                } else {
                    s->sb_samples[0][k * 12 + l + 0][i] = 0;
                    s->sb_samples[0][k * 12 + l + 1][i] = 0;
                    s->sb_samples[0][k * 12 + l + 2][i] = 0;
                    s->sb_samples[1][k * 12 + l + 0][i] = 0;
                    s->sb_samples[1][k * 12 + l + 1][i] = 0;
                    s->sb_samples[1][k * 12 + l + 2][i] = 0;
                }
                /* next subband in alloc table */
1511
                j += 1 << bit_alloc_bits;
1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523
            }
            /* fill remaining samples to zero */
            for(i=sblimit;i<SBLIMIT;i++) {
                for(ch=0;ch<s->nb_channels;ch++) {
                    s->sb_samples[ch][k * 12 + l + 0][i] = 0;
                    s->sb_samples[ch][k * 12 + l + 1][i] = 0;
                    s->sb_samples[ch][k * 12 + l + 2][i] = 0;
                }
            }
        }
    }
    return 3 * 12;
Fabrice Bellard's avatar
Fabrice Bellard committed
1524 1525
}

1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545
static inline void lsf_sf_expand(int *slen,
                                 int sf, int n1, int n2, int n3)
{
    if (n3) {
        slen[3] = sf % n3;
        sf /= n3;
    } else {
        slen[3] = 0;
    }
    if (n2) {
        slen[2] = sf % n2;
        sf /= n2;
    } else {
        slen[2] = 0;
    }
    slen[1] = sf % n1;
    sf /= n1;
    slen[0] = sf;
}

1546
static void exponents_from_scale_factors(MPADecodeContext *s,
1547
                                         GranuleDef *g,
1548
                                         int16_t *exponents)
1549
{
1550
    const uint8_t *bstab, *pretab;
1551
    int len, i, j, k, l, v0, shift, gain, gains[3];
1552
    int16_t *exp_ptr;
1553 1554 1555 1556 1557 1558 1559 1560

    exp_ptr = exponents;
    gain = g->global_gain - 210;
    shift = g->scalefac_scale + 1;

    bstab = band_size_long[s->sample_rate_index];
    pretab = mpa_pretab[g->preflag];
    for(i=0;i<g->long_end;i++) {
1561
        v0 = gain - ((g->scale_factors[i] + pretab[i]) << shift) + 400;
1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575
        len = bstab[i];
        for(j=len;j>0;j--)
            *exp_ptr++ = v0;
    }

    if (g->short_start < 13) {
        bstab = band_size_short[s->sample_rate_index];
        gains[0] = gain - (g->subblock_gain[0] << 3);
        gains[1] = gain - (g->subblock_gain[1] << 3);
        gains[2] = gain - (g->subblock_gain[2] << 3);
        k = g->long_end;
        for(i=g->short_start;i<13;i++) {
            len = bstab[i];
            for(l=0;l<3;l++) {
1576
                v0 = gains[l] - (g->scale_factors[k++] << shift) + 400;
1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592
                for(j=len;j>0;j--)
                *exp_ptr++ = v0;
            }
        }
    }
}

/* handle n = 0 too */
static inline int get_bitsz(GetBitContext *s, int n)
{
    if (n == 0)
        return 0;
    else
        return get_bits(s, n);
}

1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605

static void switch_buffer(MPADecodeContext *s, int *pos, int *end_pos, int *end_pos2){
    if(s->in_gb.buffer && *pos >= s->gb.size_in_bits){
        s->gb= s->in_gb;
        s->in_gb.buffer=NULL;
        assert((get_bits_count(&s->gb) & 7) == 0);
        skip_bits_long(&s->gb, *pos - *end_pos);
        *end_pos2=
        *end_pos= *end_pos2 + get_bits_count(&s->gb) - *pos;
        *pos= get_bits_count(&s->gb);
    }
}

1606
static int huffman_decode(MPADecodeContext *s, GranuleDef *g,
1607
                          int16_t *exponents, int end_pos2)
1608 1609
{
    int s_index;
1610
    int i;
1611
    int last_pos, bits_left;
1612
    VLC *vlc;
1613
    int end_pos= FFMIN(end_pos2, s->gb.size_in_bits);
1614 1615 1616 1617

    /* low frequencies (called big values) */
    s_index = 0;
    for(i=0;i<3;i++) {
1618
        int j, k, l, linbits;
1619 1620 1621 1622 1623 1624 1625 1626 1627
        j = g->region_size[i];
        if (j == 0)
            continue;
        /* select vlc table */
        k = g->table_select[i];
        l = mpa_huff_data[k][0];
        linbits = mpa_huff_data[k][1];
        vlc = &huff_vlc[l];

1628
        if(!l){
1629
            memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid)*2*j);
1630 1631 1632 1633
            s_index += 2*j;
            continue;
        }

1634 1635
        /* read huffcode and compute each couple */
        for(;j>0;j--) {
1636
            int exponent, x, y, v;
1637 1638 1639 1640
            int pos= get_bits_count(&s->gb);

            if (pos >= end_pos){
//                av_log(NULL, AV_LOG_ERROR, "pos: %d %d %d %d\n", pos, end_pos, end_pos2, s_index);
1641
                switch_buffer(s, &pos, &end_pos, &end_pos2);
1642 1643 1644 1645
//                av_log(NULL, AV_LOG_ERROR, "new pos: %d %d\n", pos, end_pos);
                if(pos >= end_pos)
                    break;
            }
1646
            y = get_vlc2(&s->gb, vlc->table, 7, 3);
1647 1648 1649 1650 1651 1652 1653 1654

            if(!y){
                g->sb_hybrid[s_index  ] =
                g->sb_hybrid[s_index+1] = 0;
                s_index += 2;
                continue;
            }

1655
            exponent= exponents[s_index];
1656

1657
            dprintf(s->avctx, "region=%d n=%d x=%d y=%d exp=%d\n",
1658
                    i, g->region_size[i] - j, x, y, exponent);
Michael Niedermayer's avatar
Michael Niedermayer committed
1659 1660 1661
            if(y&16){
                x = y >> 5;
                y = y & 0x0f;
1662
                if (x < 15){
1663 1664
                    v = expval_table[ exponent ][ x ];
//                      v = expval_table[ (exponent&3) ][ x ] >> FFMIN(0 - (exponent>>2), 31);
1665 1666
                }else{
                    x += get_bitsz(&s->gb, linbits);
1667
                    v = l3_unscale(x, exponent);
1668
                }
1669 1670
                if (get_bits1(&s->gb))
                    v = -v;
Michael Niedermayer's avatar
Michael Niedermayer committed
1671
                g->sb_hybrid[s_index] = v;
1672
                if (y < 15){
1673
                    v = expval_table[ exponent ][ y ];
1674 1675
                }else{
                    y += get_bitsz(&s->gb, linbits);
1676
                    v = l3_unscale(y, exponent);
1677
                }
1678 1679
                if (get_bits1(&s->gb))
                    v = -v;
Michael Niedermayer's avatar
Michael Niedermayer committed
1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693
                g->sb_hybrid[s_index+1] = v;
            }else{
                x = y >> 5;
                y = y & 0x0f;
                x += y;
                if (x < 15){
                    v = expval_table[ exponent ][ x ];
                }else{
                    x += get_bitsz(&s->gb, linbits);
                    v = l3_unscale(x, exponent);
                }
                if (get_bits1(&s->gb))
                    v = -v;
                g->sb_hybrid[s_index+!!y] = v;
1694
                g->sb_hybrid[s_index+ !y] = 0;
1695
            }
Michael Niedermayer's avatar
Michael Niedermayer committed
1696
            s_index+=2;
1697 1698
        }
    }
1699

1700 1701
    /* high frequencies */
    vlc = &huff_quad_vlc[g->count1table_select];
1702
    last_pos=0;
1703
    while (s_index <= 572) {
1704
        int pos, code;
1705 1706
        pos = get_bits_count(&s->gb);
        if (pos >= end_pos) {
1707 1708 1709 1710 1711 1712
            if (pos > end_pos2 && last_pos){
                /* some encoders generate an incorrect size for this
                   part. We must go back into the data */
                s_index -= 4;
                skip_bits_long(&s->gb, last_pos - pos);
                av_log(NULL, AV_LOG_INFO, "overread, skip %d enddists: %d %d\n", last_pos - pos, end_pos-pos, end_pos2-pos);
1713 1714
                if(s->error_resilience >= FF_ER_COMPLIANT)
                    s_index=0;
1715 1716
                break;
            }
1717
//                av_log(NULL, AV_LOG_ERROR, "pos2: %d %d %d %d\n", pos, end_pos, end_pos2, s_index);
1718
            switch_buffer(s, &pos, &end_pos, &end_pos2);
1719 1720 1721
//                av_log(NULL, AV_LOG_ERROR, "new pos2: %d %d %d\n", pos, end_pos, s_index);
            if(pos >= end_pos)
                break;
1722
        }
1723
        last_pos= pos;
1724

1725
        code = get_vlc2(&s->gb, vlc->table, vlc->bits, 1);
1726
        dprintf(s->avctx, "t=%d code=%d\n", g->count1table_select, code);
1727 1728 1729 1730 1731 1732
        g->sb_hybrid[s_index+0]=
        g->sb_hybrid[s_index+1]=
        g->sb_hybrid[s_index+2]=
        g->sb_hybrid[s_index+3]= 0;
        while(code){
            const static int idxtab[16]={3,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0};
1733
            int v;
1734 1735
            int pos= s_index+idxtab[code];
            code ^= 8>>idxtab[code];
1736 1737
            v = exp_table[ exponents[pos] ];
//            v = exp_table[ (exponents[pos]&3) ] >> FFMIN(0 - (exponents[pos]>>2), 31);
1738 1739 1740
            if(get_bits1(&s->gb))
                v = -v;
            g->sb_hybrid[pos] = v;
1741
        }
1742
        s_index+=4;
1743
    }
1744
    /* skip extension bits */
1745
    bits_left = end_pos2 - get_bits_count(&s->gb);
1746
//av_log(NULL, AV_LOG_ERROR, "left:%d buf:%p\n", bits_left, s->in_gb.buffer);
1747
    if (bits_left < 0/* || bits_left > 500*/) {
1748
        av_log(NULL, AV_LOG_ERROR, "bits_left=%d\n", bits_left);
1749 1750 1751 1752
        s_index=0;
    }else if(bits_left > 0 && s->error_resilience >= FF_ER_AGGRESSIVE){
        av_log(NULL, AV_LOG_ERROR, "bits_left=%d\n", bits_left);
        s_index=0;
1753
    }
1754
    memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid)*(576 - s_index));
1755 1756
    skip_bits_long(&s->gb, bits_left);

1757
    i= get_bits_count(&s->gb);
1758
    switch_buffer(s, &i, &end_pos, &end_pos2);
1759

Fabrice Bellard's avatar
Fabrice Bellard committed
1760 1761 1762
    return 0;
}

1763 1764 1765 1766 1767
/* Reorder short blocks from bitstream order to interleaved order. It
   would be faster to do it in parsing, but the code would be far more
   complicated */
static void reorder_block(MPADecodeContext *s, GranuleDef *g)
{
1768
    int i, j, len;
1769 1770
    int32_t *ptr, *dst, *ptr1;
    int32_t tmp[576];
1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783

    if (g->block_type != 2)
        return;

    if (g->switch_point) {
        if (s->sample_rate_index != 8) {
            ptr = g->sb_hybrid + 36;
        } else {
            ptr = g->sb_hybrid + 48;
        }
    } else {
        ptr = g->sb_hybrid;
    }
1784

1785 1786 1787
    for(i=g->short_start;i<13;i++) {
        len = band_size_short[s->sample_rate_index][i];
        ptr1 = ptr;
1788 1789 1790 1791 1792 1793
        dst = tmp;
        for(j=len;j>0;j--) {
            *dst++ = ptr[0*len];
            *dst++ = ptr[1*len];
            *dst++ = ptr[2*len];
            ptr++;
1794
        }
1795 1796
        ptr+=2*len;
        memcpy(ptr1, tmp, len * 3 * sizeof(*ptr1));
1797 1798 1799 1800 1801 1802 1803 1804 1805
    }
}

#define ISQRT2 FIXR(0.70710678118654752440)

static void compute_stereo(MPADecodeContext *s,
                           GranuleDef *g0, GranuleDef *g1)
{
    int i, j, k, l;
1806
    int32_t v1, v2;
1807
    int sf_max, tmp0, tmp1, sf, len, non_zero_found;
1808 1809
    int32_t (*is_tab)[16];
    int32_t *tab0, *tab1;
1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820
    int non_zero_found_short[3];

    /* intensity stereo */
    if (s->mode_ext & MODE_EXT_I_STEREO) {
        if (!s->lsf) {
            is_tab = is_table;
            sf_max = 7;
        } else {
            is_tab = is_table_lsf[g1->scalefac_compress & 1];
            sf_max = 16;
        }
1821

1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871
        tab0 = g0->sb_hybrid + 576;
        tab1 = g1->sb_hybrid + 576;

        non_zero_found_short[0] = 0;
        non_zero_found_short[1] = 0;
        non_zero_found_short[2] = 0;
        k = (13 - g1->short_start) * 3 + g1->long_end - 3;
        for(i = 12;i >= g1->short_start;i--) {
            /* for last band, use previous scale factor */
            if (i != 11)
                k -= 3;
            len = band_size_short[s->sample_rate_index][i];
            for(l=2;l>=0;l--) {
                tab0 -= len;
                tab1 -= len;
                if (!non_zero_found_short[l]) {
                    /* test if non zero band. if so, stop doing i-stereo */
                    for(j=0;j<len;j++) {
                        if (tab1[j] != 0) {
                            non_zero_found_short[l] = 1;
                            goto found1;
                        }
                    }
                    sf = g1->scale_factors[k + l];
                    if (sf >= sf_max)
                        goto found1;

                    v1 = is_tab[0][sf];
                    v2 = is_tab[1][sf];
                    for(j=0;j<len;j++) {
                        tmp0 = tab0[j];
                        tab0[j] = MULL(tmp0, v1);
                        tab1[j] = MULL(tmp0, v2);
                    }
                } else {
                found1:
                    if (s->mode_ext & MODE_EXT_MS_STEREO) {
                        /* lower part of the spectrum : do ms stereo
                           if enabled */
                        for(j=0;j<len;j++) {
                            tmp0 = tab0[j];
                            tmp1 = tab1[j];
                            tab0[j] = MULL(tmp0 + tmp1, ISQRT2);
                            tab1[j] = MULL(tmp0 - tmp1, ISQRT2);
                        }
                    }
                }
            }
        }

1872 1873
        non_zero_found = non_zero_found_short[0] |
            non_zero_found_short[1] |
1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928
            non_zero_found_short[2];

        for(i = g1->long_end - 1;i >= 0;i--) {
            len = band_size_long[s->sample_rate_index][i];
            tab0 -= len;
            tab1 -= len;
            /* test if non zero band. if so, stop doing i-stereo */
            if (!non_zero_found) {
                for(j=0;j<len;j++) {
                    if (tab1[j] != 0) {
                        non_zero_found = 1;
                        goto found2;
                    }
                }
                /* for last band, use previous scale factor */
                k = (i == 21) ? 20 : i;
                sf = g1->scale_factors[k];
                if (sf >= sf_max)
                    goto found2;
                v1 = is_tab[0][sf];
                v2 = is_tab[1][sf];
                for(j=0;j<len;j++) {
                    tmp0 = tab0[j];
                    tab0[j] = MULL(tmp0, v1);
                    tab1[j] = MULL(tmp0, v2);
                }
            } else {
            found2:
                if (s->mode_ext & MODE_EXT_MS_STEREO) {
                    /* lower part of the spectrum : do ms stereo
                       if enabled */
                    for(j=0;j<len;j++) {
                        tmp0 = tab0[j];
                        tmp1 = tab1[j];
                        tab0[j] = MULL(tmp0 + tmp1, ISQRT2);
                        tab1[j] = MULL(tmp0 - tmp1, ISQRT2);
                    }
                }
            }
        }
    } else if (s->mode_ext & MODE_EXT_MS_STEREO) {
        /* ms stereo ONLY */
        /* NOTE: the 1/sqrt(2) normalization factor is included in the
           global gain */
        tab0 = g0->sb_hybrid;
        tab1 = g1->sb_hybrid;
        for(i=0;i<576;i++) {
            tmp0 = tab0[i];
            tmp1 = tab1[i];
            tab0[i] = tmp0 + tmp1;
            tab1[i] = tmp0 - tmp1;
        }
    }
}

1929
static void compute_antialias_integer(MPADecodeContext *s,
1930 1931
                              GranuleDef *g)
{
Michael Niedermayer's avatar
Michael Niedermayer committed
1932 1933
    int32_t *ptr, *csa;
    int n, i;
1934 1935 1936 1937 1938 1939 1940 1941 1942 1943

    /* we antialias only "long" bands */
    if (g->block_type == 2) {
        if (!g->switch_point)
            return;
        /* XXX: check this for 8000Hz case */
        n = 1;
    } else {
        n = SBLIMIT - 1;
    }
1944

1945 1946
    ptr = g->sb_hybrid + 18;
    for(i = n;i > 0;i--) {
Michael Niedermayer's avatar
Michael Niedermayer committed
1947 1948 1949
        int tmp0, tmp1, tmp2;
        csa = &csa_table[0][0];
#define INT_AA(j) \
1950 1951
            tmp0 = ptr[-1-j];\
            tmp1 = ptr[   j];\
Michael Niedermayer's avatar
Michael Niedermayer committed
1952
            tmp2= MULH(tmp0 + tmp1, csa[0+4*j]);\
1953 1954
            ptr[-1-j] = 4*(tmp2 - MULH(tmp1, csa[2+4*j]));\
            ptr[   j] = 4*(tmp2 + MULH(tmp0, csa[3+4*j]));
Michael Niedermayer's avatar
Michael Niedermayer committed
1955 1956 1957 1958 1959 1960 1961 1962 1963

        INT_AA(0)
        INT_AA(1)
        INT_AA(2)
        INT_AA(3)
        INT_AA(4)
        INT_AA(5)
        INT_AA(6)
        INT_AA(7)
1964 1965

        ptr += 18;
1966 1967 1968 1969 1970 1971
    }
}

static void compute_antialias_float(MPADecodeContext *s,
                              GranuleDef *g)
{
Michael Niedermayer's avatar
Michael Niedermayer committed
1972 1973
    int32_t *ptr;
    int n, i;
1974 1975 1976 1977 1978 1979 1980 1981 1982 1983

    /* we antialias only "long" bands */
    if (g->block_type == 2) {
        if (!g->switch_point)
            return;
        /* XXX: check this for 8000Hz case */
        n = 1;
    } else {
        n = SBLIMIT - 1;
    }
1984

1985 1986
    ptr = g->sb_hybrid + 18;
    for(i = n;i > 0;i--) {
Michael Niedermayer's avatar
Michael Niedermayer committed
1987
        float tmp0, tmp1;
1988
        float *csa = &csa_table_float[0][0];
Michael Niedermayer's avatar
Michael Niedermayer committed
1989 1990 1991 1992 1993
#define FLOAT_AA(j)\
        tmp0= ptr[-1-j];\
        tmp1= ptr[   j];\
        ptr[-1-j] = lrintf(tmp0 * csa[0+4*j] - tmp1 * csa[1+4*j]);\
        ptr[   j] = lrintf(tmp0 * csa[1+4*j] + tmp1 * csa[0+4*j]);
1994

Michael Niedermayer's avatar
Michael Niedermayer committed
1995 1996 1997 1998 1999 2000 2001 2002 2003
        FLOAT_AA(0)
        FLOAT_AA(1)
        FLOAT_AA(2)
        FLOAT_AA(3)
        FLOAT_AA(4)
        FLOAT_AA(5)
        FLOAT_AA(6)
        FLOAT_AA(7)

2004
        ptr += 18;
2005 2006 2007 2008
    }
}

static void compute_imdct(MPADecodeContext *s,
2009
                          GranuleDef *g,
2010 2011
                          int32_t *sb_samples,
                          int32_t *mdct_buf)
2012
{
Michael Niedermayer's avatar
Michael Niedermayer committed
2013
    int32_t *ptr, *win, *win1, *buf, *out_ptr, *ptr1;
2014
    int32_t out2[12];
Michael Niedermayer's avatar
Michael Niedermayer committed
2015
    int i, j, mdct_long_end, v, sblimit;
2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049

    /* find last non zero block */
    ptr = g->sb_hybrid + 576;
    ptr1 = g->sb_hybrid + 2 * 18;
    while (ptr >= ptr1) {
        ptr -= 6;
        v = ptr[0] | ptr[1] | ptr[2] | ptr[3] | ptr[4] | ptr[5];
        if (v != 0)
            break;
    }
    sblimit = ((ptr - g->sb_hybrid) / 18) + 1;

    if (g->block_type == 2) {
        /* XXX: check for 8000 Hz */
        if (g->switch_point)
            mdct_long_end = 2;
        else
            mdct_long_end = 0;
    } else {
        mdct_long_end = sblimit;
    }

    buf = mdct_buf;
    ptr = g->sb_hybrid;
    for(j=0;j<mdct_long_end;j++) {
        /* apply window & overlap with previous buffer */
        out_ptr = sb_samples + j;
        /* select window */
        if (g->switch_point && j < 2)
            win1 = mdct_win[0];
        else
            win1 = mdct_win[g->block_type];
        /* select frequency inversion */
        win = win1 + ((4 * 36) & -(j & 1));
2050 2051
        imdct36(out_ptr, buf, ptr, win);
        out_ptr += 18*SBLIMIT;
2052 2053 2054 2055 2056 2057 2058
        ptr += 18;
        buf += 18;
    }
    for(j=mdct_long_end;j<sblimit;j++) {
        /* select frequency inversion */
        win = mdct_win[2] + ((4 * 36) & -(j & 1));
        out_ptr = sb_samples + j;
2059

Michael Niedermayer's avatar
Michael Niedermayer committed
2060 2061 2062 2063 2064 2065 2066 2067
        for(i=0; i<6; i++){
            *out_ptr = buf[i];
            out_ptr += SBLIMIT;
        }
        imdct12(out2, ptr + 0);
        for(i=0;i<6;i++) {
            *out_ptr = MULH(out2[i], win[i]) + buf[i + 6*1];
            buf[i + 6*2] = MULH(out2[i + 6], win[i + 6]);
2068 2069
            out_ptr += SBLIMIT;
        }
Michael Niedermayer's avatar
Michael Niedermayer committed
2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081
        imdct12(out2, ptr + 1);
        for(i=0;i<6;i++) {
            *out_ptr = MULH(out2[i], win[i]) + buf[i + 6*2];
            buf[i + 6*0] = MULH(out2[i + 6], win[i + 6]);
            out_ptr += SBLIMIT;
        }
        imdct12(out2, ptr + 2);
        for(i=0;i<6;i++) {
            buf[i + 6*0] = MULH(out2[i], win[i]) + buf[i + 6*0];
            buf[i + 6*1] = MULH(out2[i + 6], win[i + 6]);
            buf[i + 6*2] = 0;
        }
2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097
        ptr += 18;
        buf += 18;
    }
    /* zero bands */
    for(j=sblimit;j<SBLIMIT;j++) {
        /* overlap */
        out_ptr = sb_samples + j;
        for(i=0;i<18;i++) {
            *out_ptr = buf[i];
            buf[i] = 0;
            out_ptr += SBLIMIT;
        }
        buf += 18;
    }
}

2098
#if defined(DEBUG)
2099
void sample_dump(int fnum, int32_t *tab, int n)
2100 2101 2102
{
    static FILE *files[16], *f;
    char buf[512];
2103
    int i;
2104
    int32_t v;
2105

2106 2107
    f = files[fnum];
    if (!f) {
2108 2109
        snprintf(buf, sizeof(buf), "/tmp/out%d.%s.pcm",
                fnum,
2110 2111 2112 2113 2114 2115
#ifdef USE_HIGHPRECISION
                "hp"
#else
                "lp"
#endif
                );
2116 2117 2118 2119 2120
        f = fopen(buf, "w");
        if (!f)
            return;
        files[fnum] = f;
    }
2121

2122 2123
    if (fnum == 0) {
        static int pos = 0;
2124
        av_log(NULL, AV_LOG_DEBUG, "pos=%d\n", pos);
2125
        for(i=0;i<n;i++) {
2126
            av_log(NULL, AV_LOG_DEBUG, " %0.4f", (double)tab[i] / FRAC_ONE);
2127
            if ((i % 18) == 17)
2128
                av_log(NULL, AV_LOG_DEBUG, "\n");
2129 2130 2131
        }
        pos += n;
    }
2132 2133 2134
    for(i=0;i<n;i++) {
        /* normalize to 23 frac bits */
        v = tab[i] << (23 - FRAC_BITS);
2135
        fwrite(&v, 1, sizeof(int32_t), f);
2136
    }
2137 2138 2139 2140 2141 2142 2143 2144
}
#endif


/* main layer3 decoding function */
static int mp_decode_layer3(MPADecodeContext *s)
{
    int nb_granules, main_data_begin, private_bits;
2145
    int gr, ch, blocksplit_flag, i, j, k, n, bits_pos;
2146
    GranuleDef granules[2][2], *g;
2147
    int16_t exponents[576];
2148 2149 2150 2151

    /* read side info */
    if (s->lsf) {
        main_data_begin = get_bits(&s->gb, 8);
Michael Niedermayer's avatar
Michael Niedermayer committed
2152
        private_bits = get_bits(&s->gb, s->nb_channels);
2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165
        nb_granules = 1;
    } else {
        main_data_begin = get_bits(&s->gb, 9);
        if (s->nb_channels == 2)
            private_bits = get_bits(&s->gb, 3);
        else
            private_bits = get_bits(&s->gb, 5);
        nb_granules = 2;
        for(ch=0;ch<s->nb_channels;ch++) {
            granules[ch][0].scfsi = 0; /* all scale factors are transmitted */
            granules[ch][1].scfsi = get_bits(&s->gb, 4);
        }
    }
2166

2167 2168
    for(gr=0;gr<nb_granules;gr++) {
        for(ch=0;ch<s->nb_channels;ch++) {
2169
            dprintf(s->avctx, "gr=%d ch=%d: side_info\n", gr, ch);
2170 2171 2172
            g = &granules[ch][gr];
            g->part2_3_length = get_bits(&s->gb, 12);
            g->big_values = get_bits(&s->gb, 9);
2173
            if(g->big_values > 288){
2174
                av_log(s->avctx, AV_LOG_ERROR, "big_values too big\n");
2175 2176 2177
                return -1;
            }

2178 2179 2180
            g->global_gain = get_bits(&s->gb, 8);
            /* if MS stereo only is selected, we precompute the
               1/sqrt(2) renormalization factor */
2181
            if ((s->mode_ext & (MODE_EXT_MS_STEREO | MODE_EXT_I_STEREO)) ==
2182 2183 2184 2185 2186 2187 2188 2189 2190
                MODE_EXT_MS_STEREO)
                g->global_gain -= 2;
            if (s->lsf)
                g->scalefac_compress = get_bits(&s->gb, 9);
            else
                g->scalefac_compress = get_bits(&s->gb, 4);
            blocksplit_flag = get_bits(&s->gb, 1);
            if (blocksplit_flag) {
                g->block_type = get_bits(&s->gb, 2);
2191 2192
                if (g->block_type == 0){
                    av_log(NULL, AV_LOG_ERROR, "invalid block type\n");
2193
                    return -1;
2194
                }
2195 2196 2197
                g->switch_point = get_bits(&s->gb, 1);
                for(i=0;i<2;i++)
                    g->table_select[i] = get_bits(&s->gb, 5);
2198
                for(i=0;i<3;i++)
2199 2200 2201 2202 2203
                    g->subblock_gain[i] = get_bits(&s->gb, 3);
                /* compute huffman coded region sizes */
                if (g->block_type == 2)
                    g->region_size[0] = (36 / 2);
                else {
2204
                    if (s->sample_rate_index <= 2)
2205
                        g->region_size[0] = (36 / 2);
2206
                    else if (s->sample_rate_index != 8)
2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220
                        g->region_size[0] = (54 / 2);
                    else
                        g->region_size[0] = (108 / 2);
                }
                g->region_size[1] = (576 / 2);
            } else {
                int region_address1, region_address2, l;
                g->block_type = 0;
                g->switch_point = 0;
                for(i=0;i<3;i++)
                    g->table_select[i] = get_bits(&s->gb, 5);
                /* compute huffman coded region sizes */
                region_address1 = get_bits(&s->gb, 4);
                region_address2 = get_bits(&s->gb, 3);
2221
                dprintf(s->avctx, "region1=%d region2=%d\n",
2222
                        region_address1, region_address2);
2223
                g->region_size[0] =
2224 2225 2226 2227 2228
                    band_index_long[s->sample_rate_index][region_address1 + 1] >> 1;
                l = region_address1 + region_address2 + 2;
                /* should not overflow */
                if (l > 22)
                    l = 22;
2229
                g->region_size[1] =
2230 2231 2232 2233 2234 2235 2236
                    band_index_long[s->sample_rate_index][l] >> 1;
            }
            /* convert region offsets to region sizes and truncate
               size to big_values */
            g->region_size[2] = (576 / 2);
            j = 0;
            for(i=0;i<3;i++) {
Michael Niedermayer's avatar
Michael Niedermayer committed
2237
                k = FFMIN(g->region_size[i], g->big_values);
2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253
                g->region_size[i] = k - j;
                j = k;
            }

            /* compute band indexes */
            if (g->block_type == 2) {
                if (g->switch_point) {
                    /* if switched mode, we handle the 36 first samples as
                       long blocks.  For 8000Hz, we handle the 48 first
                       exponents as long blocks (XXX: check this!) */
                    if (s->sample_rate_index <= 2)
                        g->long_end = 8;
                    else if (s->sample_rate_index != 8)
                        g->long_end = 6;
                    else
                        g->long_end = 4; /* 8000 Hz */
2254

Michael Niedermayer's avatar
Michael Niedermayer committed
2255
                    g->short_start = 2 + (s->sample_rate_index != 8);
2256 2257 2258 2259 2260 2261 2262 2263
                } else {
                    g->long_end = 0;
                    g->short_start = 0;
                }
            } else {
                g->short_start = 13;
                g->long_end = 22;
            }
2264

2265 2266 2267 2268 2269
            g->preflag = 0;
            if (!s->lsf)
                g->preflag = get_bits(&s->gb, 1);
            g->scalefac_scale = get_bits(&s->gb, 1);
            g->count1table_select = get_bits(&s->gb, 1);
2270
            dprintf(s->avctx, "block_type=%d switch_point=%d\n",
2271 2272 2273 2274
                    g->block_type, g->switch_point);
        }
    }

Roberto Togni's avatar
Roberto Togni committed
2275
  if (!s->adu_mode) {
2276
    const uint8_t *ptr = s->gb.buffer + (get_bits_count(&s->gb)>>3);
2277
    assert((get_bits_count(&s->gb) & 7) == 0);
2278
    /* now we get bits from the main_data_begin offset */
2279
    dprintf(s->avctx, "seekback: %d\n", main_data_begin);
2280 2281 2282 2283
//av_log(NULL, AV_LOG_ERROR, "backstep:%d, lastbuf:%d\n", main_data_begin, s->last_buf_size);

    memcpy(s->last_buf + s->last_buf_size, ptr, EXTRABYTES);
    s->in_gb= s->gb;
2284 2285
        init_get_bits(&s->gb, s->last_buf, s->last_buf_size*8);
        skip_bits_long(&s->gb, 8*(s->last_buf_size - main_data_begin));
Roberto Togni's avatar
Roberto Togni committed
2286
  }
2287 2288 2289 2290

    for(gr=0;gr<nb_granules;gr++) {
        for(ch=0;ch<s->nb_channels;ch++) {
            g = &granules[ch][gr];
2291
            if(get_bits_count(&s->gb)<0){
Diego Biurrun's avatar
Diego Biurrun committed
2292
                av_log(NULL, AV_LOG_ERROR, "mdb:%d, lastbuf:%d skipping granule %d\n",
2293 2294 2295 2296 2297 2298 2299 2300 2301 2302
                                            main_data_begin, s->last_buf_size, gr);
                skip_bits_long(&s->gb, g->part2_3_length);
                memset(g->sb_hybrid, 0, sizeof(g->sb_hybrid));
                if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->in_gb.buffer){
                    skip_bits_long(&s->in_gb, get_bits_count(&s->gb) - s->gb.size_in_bits);
                    s->gb= s->in_gb;
                    s->in_gb.buffer=NULL;
                }
                continue;
            }
2303

2304
            bits_pos = get_bits_count(&s->gb);
2305

2306
            if (!s->lsf) {
2307
                uint8_t *sc;
2308 2309 2310 2311 2312
                int slen, slen1, slen2;

                /* MPEG1 scale factors */
                slen1 = slen_table[0][g->scalefac_compress];
                slen2 = slen_table[1][g->scalefac_compress];
2313
                dprintf(s->avctx, "slen1=%d slen2=%d\n", slen1, slen2);
2314 2315 2316
                if (g->block_type == 2) {
                    n = g->switch_point ? 17 : 18;
                    j = 0;
2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332
                    if(slen1){
                        for(i=0;i<n;i++)
                            g->scale_factors[j++] = get_bits(&s->gb, slen1);
                    }else{
                        for(i=0;i<n;i++)
                            g->scale_factors[j++] = 0;
                    }
                    if(slen2){
                        for(i=0;i<18;i++)
                            g->scale_factors[j++] = get_bits(&s->gb, slen2);
                        for(i=0;i<3;i++)
                            g->scale_factors[j++] = 0;
                    }else{
                        for(i=0;i<21;i++)
                            g->scale_factors[j++] = 0;
                    }
2333 2334 2335 2336 2337 2338 2339
                } else {
                    sc = granules[ch][0].scale_factors;
                    j = 0;
                    for(k=0;k<4;k++) {
                        n = (k == 0 ? 6 : 5);
                        if ((g->scfsi & (0x8 >> k)) == 0) {
                            slen = (k < 2) ? slen1 : slen2;
2340 2341 2342 2343 2344 2345 2346
                            if(slen){
                                for(i=0;i<n;i++)
                                    g->scale_factors[j++] = get_bits(&s->gb, slen);
                            }else{
                                for(i=0;i<n;i++)
                                    g->scale_factors[j++] = 0;
                            }
2347 2348 2349 2350 2351 2352 2353 2354 2355 2356
                        } else {
                            /* simply copy from last granule */
                            for(i=0;i<n;i++) {
                                g->scale_factors[j] = sc[j];
                                j++;
                            }
                        }
                    }
                    g->scale_factors[j++] = 0;
                }
2357
#if defined(DEBUG)
2358
                {
2359
                    dprintf(s->avctx, "scfsi=%x gr=%d ch=%d scale_factors:\n",
2360 2361
                           g->scfsi, gr, ch);
                    for(i=0;i<j;i++)
2362 2363
                        dprintf(s->avctx, " %d", g->scale_factors[i]);
                    dprintf(s->avctx, "\n");
2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407
                }
#endif
            } else {
                int tindex, tindex2, slen[4], sl, sf;

                /* LSF scale factors */
                if (g->block_type == 2) {
                    tindex = g->switch_point ? 2 : 1;
                } else {
                    tindex = 0;
                }
                sf = g->scalefac_compress;
                if ((s->mode_ext & MODE_EXT_I_STEREO) && ch == 1) {
                    /* intensity stereo case */
                    sf >>= 1;
                    if (sf < 180) {
                        lsf_sf_expand(slen, sf, 6, 6, 0);
                        tindex2 = 3;
                    } else if (sf < 244) {
                        lsf_sf_expand(slen, sf - 180, 4, 4, 0);
                        tindex2 = 4;
                    } else {
                        lsf_sf_expand(slen, sf - 244, 3, 0, 0);
                        tindex2 = 5;
                    }
                } else {
                    /* normal case */
                    if (sf < 400) {
                        lsf_sf_expand(slen, sf, 5, 4, 4);
                        tindex2 = 0;
                    } else if (sf < 500) {
                        lsf_sf_expand(slen, sf - 400, 5, 4, 0);
                        tindex2 = 1;
                    } else {
                        lsf_sf_expand(slen, sf - 500, 3, 0, 0);
                        tindex2 = 2;
                        g->preflag = 1;
                    }
                }

                j = 0;
                for(k=0;k<4;k++) {
                    n = lsf_nsf_table[tindex2][tindex][k];
                    sl = slen[k];
Michael Niedermayer's avatar
Michael Niedermayer committed
2408
                    if(sl){
2409 2410 2411 2412 2413 2414
                        for(i=0;i<n;i++)
                            g->scale_factors[j++] = get_bits(&s->gb, sl);
                    }else{
                        for(i=0;i<n;i++)
                            g->scale_factors[j++] = 0;
                    }
2415 2416 2417 2418
                }
                /* XXX: should compute exact size */
                for(;j<40;j++)
                    g->scale_factors[j] = 0;
2419
#if defined(DEBUG)
2420
                {
2421
                    dprintf(s->avctx, "gr=%d ch=%d scale_factors:\n",
2422 2423
                           gr, ch);
                    for(i=0;i<40;i++)
2424 2425
                        dprintf(s->avctx, " %d", g->scale_factors[i]);
                    dprintf(s->avctx, "\n");
2426 2427 2428 2429 2430 2431 2432
                }
#endif
            }

            exponents_from_scale_factors(s, g, exponents);

            /* read Huffman coded residue */
2433
            huffman_decode(s, g, exponents, bits_pos + g->part2_3_length);
2434 2435
#if defined(DEBUG)
            sample_dump(0, g->sb_hybrid, 576);
2436 2437 2438 2439 2440 2441 2442 2443 2444 2445
#endif
        } /* ch */

        if (s->nb_channels == 2)
            compute_stereo(s, &granules[0][gr], &granules[1][gr]);

        for(ch=0;ch<s->nb_channels;ch++) {
            g = &granules[ch][gr];

            reorder_block(s, g);
2446
#if defined(DEBUG)
2447 2448
            sample_dump(0, g->sb_hybrid, 576);
#endif
2449
            s->compute_antialias(s, g);
2450
#if defined(DEBUG)
2451 2452
            sample_dump(1, g->sb_hybrid, 576);
#endif
2453
            compute_imdct(s, g, &s->sb_samples[ch][18 * gr][0], s->mdct_buf[ch]);
2454
#if defined(DEBUG)
2455 2456 2457 2458
            sample_dump(2, &s->sb_samples[ch][18 * gr][0], 576);
#endif
        }
    } /* gr */
2459 2460
    if(get_bits_count(&s->gb)<0)
        skip_bits_long(&s->gb, -get_bits_count(&s->gb));
2461 2462 2463
    return nb_granules * 18;
}

2464
static int mp_decode_frame(MPADecodeContext *s,
2465
                           OUT_INT *samples, const uint8_t *buf, int buf_size)
2466 2467
{
    int i, nb_frames, ch;
2468
    OUT_INT *samples_ptr;
2469

2470
    init_get_bits(&s->gb, buf + HEADER_SIZE, (buf_size - HEADER_SIZE)*8);
2471

2472 2473 2474 2475
    /* skip error protection field */
    if (s->error_protection)
        get_bits(&s->gb, 16);

2476
    dprintf(s->avctx, "frame %d:\n", s->frame_count);
2477 2478 2479 2480 2481 2482 2483 2484 2485 2486
    switch(s->layer) {
    case 1:
        nb_frames = mp_decode_layer1(s);
        break;
    case 2:
        nb_frames = mp_decode_layer2(s);
        break;
    case 3:
    default:
        nb_frames = mp_decode_layer3(s);
2487

2488 2489 2490 2491
        s->last_buf_size=0;
        if(s->in_gb.buffer){
            align_get_bits(&s->gb);
            i= (s->gb.size_in_bits - get_bits_count(&s->gb))>>3;
2492
            if(i >= 0 && i <= BACKSTEP_SIZE){
2493 2494
                memmove(s->last_buf, s->gb.buffer + (get_bits_count(&s->gb)>>3), i);
                s->last_buf_size=i;
2495 2496
            }else
                av_log(NULL, AV_LOG_ERROR, "invalid old backstep %d\n", i);
2497
            s->gb= s->in_gb;
2498
            s->in_gb.buffer= NULL;
2499 2500
        }

2501 2502
        align_get_bits(&s->gb);
        assert((get_bits_count(&s->gb) & 7) == 0);
2503 2504
        i= (s->gb.size_in_bits - get_bits_count(&s->gb))>>3;

2505 2506 2507 2508
        if(i<0 || i > BACKSTEP_SIZE || nb_frames<0){
            av_log(NULL, AV_LOG_ERROR, "invalid new backstep %d\n", i);
            i= FFMIN(BACKSTEP_SIZE, buf_size - HEADER_SIZE);
        }
2509
        assert(i <= buf_size - HEADER_SIZE && i>= 0);
2510
        memcpy(s->last_buf + s->last_buf_size, s->gb.buffer + buf_size - HEADER_SIZE - i, i);
2511
        s->last_buf_size += i;
2512

2513 2514 2515 2516 2517 2518
        break;
    }
#if defined(DEBUG)
    for(i=0;i<nb_frames;i++) {
        for(ch=0;ch<s->nb_channels;ch++) {
            int j;
2519
            dprintf(s->avctx, "%d-%d:", i, ch);
2520
            for(j=0;j<SBLIMIT;j++)
2521 2522
                dprintf(s->avctx, " %0.6f", (double)s->sb_samples[ch][i][j] / FRAC_ONE);
            dprintf(s->avctx, "\n");
2523 2524 2525 2526 2527 2528 2529
        }
    }
#endif
    /* apply the synthesis filter */
    for(ch=0;ch<s->nb_channels;ch++) {
        samples_ptr = samples + ch;
        for(i=0;i<nb_frames;i++) {
2530
            ff_mpa_synth_filter(s->synth_buf[ch], &(s->synth_buf_offset[ch]),
2531 2532
                         window, &s->dither_state,
                         samples_ptr, s->nb_channels,
2533 2534 2535 2536 2537
                         s->sb_samples[ch][i]);
            samples_ptr += 32 * s->nb_channels;
        }
    }
#ifdef DEBUG
2538
    s->frame_count++;
2539
#endif
2540
    return nb_frames * 32 * sizeof(OUT_INT) * s->nb_channels;
2541 2542
}

Fabrice Bellard's avatar
Fabrice Bellard committed
2543
static int decode_frame(AVCodecContext * avctx,
2544 2545
                        void *data, int *data_size,
                        uint8_t * buf, int buf_size)
Fabrice Bellard's avatar
Fabrice Bellard committed
2546 2547
{
    MPADecodeContext *s = avctx->priv_data;
2548
    uint32_t header;
2549
    int out_size;
2550
    OUT_INT *out_samples = data;
Fabrice Bellard's avatar
Fabrice Bellard committed
2551

2552 2553 2554 2555 2556 2557 2558 2559
retry:
    if(buf_size < HEADER_SIZE)
        return -1;

    header = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
    if(ff_mpa_check_header(header) < 0){
        buf++;
//        buf_size--;
Diego Biurrun's avatar
Diego Biurrun committed
2560
        av_log(avctx, AV_LOG_ERROR, "Header missing skipping one byte.\n");
2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587
        goto retry;
    }

    if (decode_header(s, header) == 1) {
        /* free format: prepare to compute frame size */
        s->frame_size = -1;
        return -1;
    }
    /* update codec info */
    avctx->channels = s->nb_channels;
    avctx->bit_rate = s->bit_rate;
    avctx->sub_id = s->layer;
    switch(s->layer) {
    case 1:
        avctx->frame_size = 384;
        break;
    case 2:
        avctx->frame_size = 1152;
        break;
    case 3:
        if (s->lsf)
            avctx->frame_size = 576;
        else
            avctx->frame_size = 1152;
        break;
    }

2588
    if(s->frame_size<=0 || s->frame_size > buf_size){
2589 2590
        av_log(avctx, AV_LOG_ERROR, "incomplete frame\n");
        return -1;
2591 2592
    }else if(s->frame_size < buf_size){
        av_log(avctx, AV_LOG_ERROR, "incorrect frame size\n");
Fabrice Bellard's avatar
Fabrice Bellard committed
2593
    }
2594 2595

    out_size = mp_decode_frame(s, out_samples, buf, buf_size);
2596
    if(out_size>=0){
2597
        *data_size = out_size;
2598 2599 2600
        avctx->sample_rate = s->sample_rate;
        //FIXME maybe move the other codec info stuff from above here too
    }else
Diego Biurrun's avatar
Diego Biurrun committed
2601
        av_log(avctx, AV_LOG_DEBUG, "Error while decoding MPEG audio frame.\n"); //FIXME return -1 / but also return the number of bytes consumed
2602 2603
    s->frame_size = 0;
    return buf_size;
Fabrice Bellard's avatar
Fabrice Bellard committed
2604 2605
}

2606 2607 2608 2609 2610
static void flush(AVCodecContext *avctx){
    MPADecodeContext *s = avctx->priv_data;
    s->last_buf_size= 0;
}

2611
#ifdef CONFIG_MP3ADU_DECODER
Roberto Togni's avatar
Roberto Togni committed
2612
static int decode_frame_adu(AVCodecContext * avctx,
2613 2614
                        void *data, int *data_size,
                        uint8_t * buf, int buf_size)
Roberto Togni's avatar
Roberto Togni committed
2615 2616 2617 2618
{
    MPADecodeContext *s = avctx->priv_data;
    uint32_t header;
    int len, out_size;
2619
    OUT_INT *out_samples = data;
Roberto Togni's avatar
Roberto Togni committed
2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633

    len = buf_size;

    // Discard too short frames
    if (buf_size < HEADER_SIZE) {
        *data_size = 0;
        return buf_size;
    }


    if (len > MPA_MAX_CODED_FRAME_SIZE)
        len = MPA_MAX_CODED_FRAME_SIZE;

    // Get header and restore sync word
2634
    header = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3] | 0xffe00000;
Roberto Togni's avatar
Roberto Togni committed
2635

2636
    if (ff_mpa_check_header(header) < 0) { // Bad header, discard frame
Roberto Togni's avatar
Roberto Togni committed
2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650
        *data_size = 0;
        return buf_size;
    }

    decode_header(s, header);
    /* update codec info */
    avctx->sample_rate = s->sample_rate;
    avctx->channels = s->nb_channels;
    avctx->bit_rate = s->bit_rate;
    avctx->sub_id = s->layer;

    avctx->frame_size=s->frame_size = len;

    if (avctx->parse_only) {
2651
        out_size = buf_size;
Roberto Togni's avatar
Roberto Togni committed
2652
    } else {
2653
        out_size = mp_decode_frame(s, out_samples, buf, buf_size);
Roberto Togni's avatar
Roberto Togni committed
2654 2655 2656 2657 2658
    }

    *data_size = out_size;
    return buf_size;
}
2659
#endif /* CONFIG_MP3ADU_DECODER */
Roberto Togni's avatar
Roberto Togni committed
2660

2661
#ifdef CONFIG_MP3ON4_DECODER
2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717
/* Next 3 arrays are indexed by channel config number (passed via codecdata) */
static int mp3Frames[16] = {0,1,1,2,3,3,4,5,2};   /* number of mp3 decoder instances */
static int mp3Channels[16] = {0,1,2,3,4,5,6,8,4}; /* total output channels */
/* offsets into output buffer, assume output order is FL FR BL BR C LFE */
static int chan_offset[9][5] = {
    {0},
    {0},            // C
    {0},            // FLR
    {2,0},          // C FLR
    {2,0,3},        // C FLR BS
    {4,0,2},        // C FLR BLRS
    {4,0,2,5},      // C FLR BLRS LFE
    {4,0,2,6,5},    // C FLR BLRS BLR LFE
    {0,2}           // FLR BLRS
};


static int decode_init_mp3on4(AVCodecContext * avctx)
{
    MP3On4DecodeContext *s = avctx->priv_data;
    int i;

    if ((avctx->extradata_size < 2) || (avctx->extradata == NULL)) {
        av_log(avctx, AV_LOG_ERROR, "Codec extradata missing or too short.\n");
        return -1;
    }

    s->chan_cfg = (((unsigned char *)avctx->extradata)[1] >> 3) & 0x0f;
    s->frames = mp3Frames[s->chan_cfg];
    if(!s->frames) {
        av_log(avctx, AV_LOG_ERROR, "Invalid channel config number.\n");
        return -1;
    }
    avctx->channels = mp3Channels[s->chan_cfg];

    /* Init the first mp3 decoder in standard way, so that all tables get builded
     * We replace avctx->priv_data with the context of the first decoder so that
     * decode_init() does not have to be changed.
     * Other decoders will be inited here copying data from the first context
     */
    // Allocate zeroed memory for the first decoder context
    s->mp3decctx[0] = av_mallocz(sizeof(MPADecodeContext));
    // Put decoder context in place to make init_decode() happy
    avctx->priv_data = s->mp3decctx[0];
    decode_init(avctx);
    // Restore mp3on4 context pointer
    avctx->priv_data = s;
    s->mp3decctx[0]->adu_mode = 1; // Set adu mode

    /* Create a separate codec/context for each frame (first is already ok).
     * Each frame is 1 or 2 channels - up to 5 frames allowed
     */
    for (i = 1; i < s->frames; i++) {
        s->mp3decctx[i] = av_mallocz(sizeof(MPADecodeContext));
        s->mp3decctx[i]->compute_antialias = s->mp3decctx[0]->compute_antialias;
        s->mp3decctx[i]->adu_mode = 1;
2718
        s->mp3decctx[i]->avctx = avctx;
2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738
    }

    return 0;
}


static int decode_close_mp3on4(AVCodecContext * avctx)
{
    MP3On4DecodeContext *s = avctx->priv_data;
    int i;

    for (i = 0; i < s->frames; i++)
        if (s->mp3decctx[i])
            av_free(s->mp3decctx[i]);

    return 0;
}


static int decode_frame_mp3on4(AVCodecContext * avctx,
2739 2740
                        void *data, int *data_size,
                        uint8_t * buf, int buf_size)
2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778
{
    MP3On4DecodeContext *s = avctx->priv_data;
    MPADecodeContext *m;
    int len, out_size = 0;
    uint32_t header;
    OUT_INT *out_samples = data;
    OUT_INT decoded_buf[MPA_FRAME_SIZE * MPA_MAX_CHANNELS];
    OUT_INT *outptr, *bp;
    int fsize;
    unsigned char *start2 = buf, *start;
    int fr, i, j, n;
    int off = avctx->channels;
    int *coff = chan_offset[s->chan_cfg];

    len = buf_size;

    // Discard too short frames
    if (buf_size < HEADER_SIZE) {
        *data_size = 0;
        return buf_size;
    }

    // If only one decoder interleave is not needed
    outptr = s->frames == 1 ? out_samples : decoded_buf;

    for (fr = 0; fr < s->frames; fr++) {
        start = start2;
        fsize = (start[0] << 4) | (start[1] >> 4);
        start2 += fsize;
        if (fsize > len)
            fsize = len;
        len -= fsize;
        if (fsize > MPA_MAX_CODED_FRAME_SIZE)
            fsize = MPA_MAX_CODED_FRAME_SIZE;
        m = s->mp3decctx[fr];
        assert (m != NULL);

        // Get header
2779
        header = (start[0] << 24) | (start[1] << 16) | (start[2] << 8) | start[3] | 0xfff00000;
2780 2781 2782 2783 2784 2785 2786

        if (ff_mpa_check_header(header) < 0) { // Bad header, discard block
            *data_size = 0;
            return buf_size;
        }

        decode_header(m, header);
2787
        mp_decode_frame(m, decoded_buf, start, fsize);
2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818

        n = MPA_FRAME_SIZE * m->nb_channels;
        out_size += n * sizeof(OUT_INT);
        if(s->frames > 1) {
            /* interleave output data */
            bp = out_samples + coff[fr];
            if(m->nb_channels == 1) {
                for(j = 0; j < n; j++) {
                    *bp = decoded_buf[j];
                    bp += off;
                }
            } else {
                for(j = 0; j < n; j++) {
                    bp[0] = decoded_buf[j++];
                    bp[1] = decoded_buf[j];
                    bp += off;
                }
            }
        }
    }

    /* update codec info */
    avctx->sample_rate = s->mp3decctx[0]->sample_rate;
    avctx->frame_size= buf_size;
    avctx->bit_rate = 0;
    for (i = 0; i < s->frames; i++)
        avctx->bit_rate += s->mp3decctx[i]->bit_rate;

    *data_size = out_size;
    return buf_size;
}
2819
#endif /* CONFIG_MP3ON4_DECODER */
2820

2821
#ifdef CONFIG_MP2_DECODER
2822
AVCodec mp2_decoder =
Fabrice Bellard's avatar
Fabrice Bellard committed
2823
{
2824
    "mp2",
Fabrice Bellard's avatar
Fabrice Bellard committed
2825 2826 2827 2828 2829 2830 2831
    CODEC_TYPE_AUDIO,
    CODEC_ID_MP2,
    sizeof(MPADecodeContext),
    decode_init,
    NULL,
    NULL,
    decode_frame,
2832
    CODEC_CAP_PARSE_ONLY,
Fabrice Bellard's avatar
Fabrice Bellard committed
2833
};
2834 2835
#endif
#ifdef CONFIG_MP3_DECODER
2836 2837 2838 2839
AVCodec mp3_decoder =
{
    "mp3",
    CODEC_TYPE_AUDIO,
2840
    CODEC_ID_MP3,
2841 2842 2843 2844 2845
    sizeof(MPADecodeContext),
    decode_init,
    NULL,
    NULL,
    decode_frame,
2846
    CODEC_CAP_PARSE_ONLY,
2847
    .flush= flush,
2848
};
2849 2850
#endif
#ifdef CONFIG_MP3ADU_DECODER
Roberto Togni's avatar
Roberto Togni committed
2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861
AVCodec mp3adu_decoder =
{
    "mp3adu",
    CODEC_TYPE_AUDIO,
    CODEC_ID_MP3ADU,
    sizeof(MPADecodeContext),
    decode_init,
    NULL,
    NULL,
    decode_frame_adu,
    CODEC_CAP_PARSE_ONLY,
2862
    .flush= flush,
Roberto Togni's avatar
Roberto Togni committed
2863
};
2864 2865
#endif
#ifdef CONFIG_MP3ON4_DECODER
2866 2867 2868 2869 2870 2871 2872 2873 2874 2875
AVCodec mp3on4_decoder =
{
    "mp3on4",
    CODEC_TYPE_AUDIO,
    CODEC_ID_MP3ON4,
    sizeof(MP3On4DecodeContext),
    decode_init_mp3on4,
    NULL,
    decode_close_mp3on4,
    decode_frame_mp3on4,
2876
    .flush= flush,
2877
};
2878
#endif