yading@10: /* yading@10: * MPEG Audio decoder yading@10: * Copyright (c) 2001, 2002 Fabrice Bellard yading@10: * yading@10: * This file is part of FFmpeg. yading@10: * yading@10: * FFmpeg is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * FFmpeg is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with FFmpeg; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: yading@10: /** yading@10: * @file yading@10: * MPEG Audio decoder yading@10: */ yading@10: yading@10: #include "libavutil/avassert.h" yading@10: #include "libavutil/channel_layout.h" yading@10: #include "libavutil/float_dsp.h" yading@10: #include "libavutil/libm.h" yading@10: #include "avcodec.h" yading@10: #include "get_bits.h" yading@10: #include "internal.h" yading@10: #include "mathops.h" yading@10: #include "mpegaudiodsp.h" yading@10: yading@10: /* yading@10: * TODO: yading@10: * - test lsf / mpeg25 extensively. yading@10: */ yading@10: yading@10: #include "mpegaudio.h" yading@10: #include "mpegaudiodecheader.h" yading@10: yading@10: #define BACKSTEP_SIZE 512 yading@10: #define EXTRABYTES 24 yading@10: #define LAST_BUF_SIZE 2 * BACKSTEP_SIZE + EXTRABYTES yading@10: yading@10: /* layer 3 "granule" */ yading@10: typedef struct GranuleDef { yading@10: uint8_t scfsi; yading@10: int part2_3_length; yading@10: int big_values; yading@10: int global_gain; yading@10: int scalefac_compress; yading@10: uint8_t block_type; yading@10: uint8_t switch_point; yading@10: int table_select[3]; yading@10: int subblock_gain[3]; yading@10: uint8_t scalefac_scale; yading@10: uint8_t count1table_select; yading@10: int region_size[3]; /* number of huffman codes in each region */ yading@10: int preflag; yading@10: int short_start, long_end; /* long/short band indexes */ yading@10: uint8_t scale_factors[40]; yading@10: DECLARE_ALIGNED(16, INTFLOAT, sb_hybrid)[SBLIMIT * 18]; /* 576 samples */ yading@10: } GranuleDef; yading@10: yading@10: typedef struct MPADecodeContext { yading@10: MPA_DECODE_HEADER yading@10: uint8_t last_buf[LAST_BUF_SIZE]; yading@10: int last_buf_size; yading@10: /* next header (used in free format parsing) */ yading@10: uint32_t free_format_next_header; yading@10: GetBitContext gb; yading@10: GetBitContext in_gb; yading@10: DECLARE_ALIGNED(32, MPA_INT, synth_buf)[MPA_MAX_CHANNELS][512 * 2]; yading@10: int synth_buf_offset[MPA_MAX_CHANNELS]; yading@10: DECLARE_ALIGNED(32, INTFLOAT, sb_samples)[MPA_MAX_CHANNELS][36][SBLIMIT]; yading@10: INTFLOAT mdct_buf[MPA_MAX_CHANNELS][SBLIMIT * 18]; /* previous samples, for layer 3 MDCT */ yading@10: GranuleDef granules[2][2]; /* Used in Layer 3 */ yading@10: int adu_mode; ///< 0 for standard mp3, 1 for adu formatted mp3 yading@10: int dither_state; yading@10: int err_recognition; yading@10: AVCodecContext* avctx; yading@10: MPADSPContext mpadsp; yading@10: AVFloatDSPContext fdsp; yading@10: AVFrame *frame; yading@10: } MPADecodeContext; yading@10: yading@10: #if CONFIG_FLOAT yading@10: # define SHR(a,b) ((a)*(1.0f/(1<<(b)))) yading@10: # define FIXR_OLD(a) ((int)((a) * FRAC_ONE + 0.5)) yading@10: # define FIXR(x) ((float)(x)) yading@10: # define FIXHR(x) ((float)(x)) yading@10: # define MULH3(x, y, s) ((s)*(y)*(x)) yading@10: # define MULLx(x, y, s) ((y)*(x)) yading@10: # define RENAME(a) a ## _float yading@10: # define OUT_FMT AV_SAMPLE_FMT_FLT yading@10: # define OUT_FMT_P AV_SAMPLE_FMT_FLTP yading@10: #else yading@10: # define SHR(a,b) ((a)>>(b)) yading@10: /* WARNING: only correct for positive numbers */ yading@10: # define FIXR_OLD(a) ((int)((a) * FRAC_ONE + 0.5)) yading@10: # define FIXR(a) ((int)((a) * FRAC_ONE + 0.5)) yading@10: # define FIXHR(a) ((int)((a) * (1LL<<32) + 0.5)) yading@10: # define MULH3(x, y, s) MULH((s)*(x), y) yading@10: # define MULLx(x, y, s) MULL(x,y,s) yading@10: # define RENAME(a) a ## _fixed yading@10: # define OUT_FMT AV_SAMPLE_FMT_S16 yading@10: # define OUT_FMT_P AV_SAMPLE_FMT_S16P yading@10: #endif yading@10: yading@10: /****************/ yading@10: yading@10: #define HEADER_SIZE 4 yading@10: yading@10: #include "mpegaudiodata.h" yading@10: #include "mpegaudiodectab.h" yading@10: yading@10: /* vlc structure for decoding layer 3 huffman tables */ yading@10: static VLC huff_vlc[16]; yading@10: static VLC_TYPE huff_vlc_tables[ yading@10: 0 + 128 + 128 + 128 + 130 + 128 + 154 + 166 + yading@10: 142 + 204 + 190 + 170 + 542 + 460 + 662 + 414 yading@10: ][2]; yading@10: static const int huff_vlc_tables_sizes[16] = { yading@10: 0, 128, 128, 128, 130, 128, 154, 166, yading@10: 142, 204, 190, 170, 542, 460, 662, 414 yading@10: }; yading@10: static VLC huff_quad_vlc[2]; yading@10: static VLC_TYPE huff_quad_vlc_tables[128+16][2]; yading@10: static const int huff_quad_vlc_tables_sizes[2] = { 128, 16 }; yading@10: /* computed from band_size_long */ yading@10: static uint16_t band_index_long[9][23]; yading@10: #include "mpegaudio_tablegen.h" yading@10: /* intensity stereo coef table */ yading@10: static INTFLOAT is_table[2][16]; yading@10: static INTFLOAT is_table_lsf[2][2][16]; yading@10: static INTFLOAT csa_table[8][4]; yading@10: yading@10: static int16_t division_tab3[1<<6 ]; yading@10: static int16_t division_tab5[1<<8 ]; yading@10: static int16_t division_tab9[1<<11]; yading@10: yading@10: static int16_t * const division_tabs[4] = { yading@10: division_tab3, division_tab5, NULL, division_tab9 yading@10: }; yading@10: yading@10: /* lower 2 bits: modulo 3, higher bits: shift */ yading@10: static uint16_t scale_factor_modshift[64]; yading@10: /* [i][j]: 2^(-j/3) * FRAC_ONE * 2^(i+2) / (2^(i+2) - 1) */ yading@10: static int32_t scale_factor_mult[15][3]; yading@10: /* mult table for layer 2 group quantization */ yading@10: yading@10: #define SCALE_GEN(v) \ yading@10: { FIXR_OLD(1.0 * (v)), FIXR_OLD(0.7937005259 * (v)), FIXR_OLD(0.6299605249 * (v)) } yading@10: yading@10: static const int32_t scale_factor_mult2[3][3] = { yading@10: SCALE_GEN(4.0 / 3.0), /* 3 steps */ yading@10: SCALE_GEN(4.0 / 5.0), /* 5 steps */ yading@10: SCALE_GEN(4.0 / 9.0), /* 9 steps */ yading@10: }; yading@10: yading@10: /** yading@10: * Convert region offsets to region sizes and truncate yading@10: * size to big_values. yading@10: */ yading@10: static void ff_region_offset2size(GranuleDef *g) yading@10: { yading@10: int i, k, j = 0; yading@10: g->region_size[2] = 576 / 2; yading@10: for (i = 0; i < 3; i++) { yading@10: k = FFMIN(g->region_size[i], g->big_values); yading@10: g->region_size[i] = k - j; yading@10: j = k; yading@10: } yading@10: } yading@10: yading@10: static void ff_init_short_region(MPADecodeContext *s, GranuleDef *g) yading@10: { yading@10: if (g->block_type == 2) { yading@10: if (s->sample_rate_index != 8) yading@10: g->region_size[0] = (36 / 2); yading@10: else yading@10: g->region_size[0] = (72 / 2); yading@10: } else { yading@10: if (s->sample_rate_index <= 2) yading@10: g->region_size[0] = (36 / 2); yading@10: else if (s->sample_rate_index != 8) yading@10: g->region_size[0] = (54 / 2); yading@10: else yading@10: g->region_size[0] = (108 / 2); yading@10: } yading@10: g->region_size[1] = (576 / 2); yading@10: } yading@10: yading@10: static void ff_init_long_region(MPADecodeContext *s, GranuleDef *g, int ra1, int ra2) yading@10: { yading@10: int l; yading@10: g->region_size[0] = band_index_long[s->sample_rate_index][ra1 + 1] >> 1; yading@10: /* should not overflow */ yading@10: l = FFMIN(ra1 + ra2 + 2, 22); yading@10: g->region_size[1] = band_index_long[s->sample_rate_index][ l] >> 1; yading@10: } yading@10: yading@10: static void ff_compute_band_indexes(MPADecodeContext *s, GranuleDef *g) yading@10: { yading@10: if (g->block_type == 2) { yading@10: if (g->switch_point) { yading@10: if(s->sample_rate_index == 8) yading@10: avpriv_request_sample(s->avctx, "switch point in 8khz"); yading@10: /* if switched mode, we handle the 36 first samples as yading@10: long blocks. For 8000Hz, we handle the 72 first yading@10: exponents as long blocks */ yading@10: if (s->sample_rate_index <= 2) yading@10: g->long_end = 8; yading@10: else yading@10: g->long_end = 6; yading@10: yading@10: g->short_start = 3; yading@10: } else { yading@10: g->long_end = 0; yading@10: g->short_start = 0; yading@10: } yading@10: } else { yading@10: g->short_start = 13; yading@10: g->long_end = 22; yading@10: } yading@10: } yading@10: yading@10: /* layer 1 unscaling */ yading@10: /* n = number of bits of the mantissa minus 1 */ yading@10: static inline int l1_unscale(int n, int mant, int scale_factor) yading@10: { yading@10: int shift, mod; yading@10: int64_t val; yading@10: yading@10: shift = scale_factor_modshift[scale_factor]; yading@10: mod = shift & 3; yading@10: shift >>= 2; yading@10: val = MUL64(mant + (-1 << n) + 1, scale_factor_mult[n-1][mod]); yading@10: shift += n; yading@10: /* NOTE: at this point, 1 <= shift >= 21 + 15 */ yading@10: return (int)((val + (1LL << (shift - 1))) >> shift); yading@10: } yading@10: yading@10: static inline int l2_unscale_group(int steps, int mant, int scale_factor) yading@10: { yading@10: int shift, mod, val; yading@10: yading@10: shift = scale_factor_modshift[scale_factor]; yading@10: mod = shift & 3; yading@10: shift >>= 2; yading@10: yading@10: val = (mant - (steps >> 1)) * scale_factor_mult2[steps >> 2][mod]; yading@10: /* NOTE: at this point, 0 <= shift <= 21 */ yading@10: if (shift > 0) yading@10: val = (val + (1 << (shift - 1))) >> shift; yading@10: return val; yading@10: } yading@10: yading@10: /* compute value^(4/3) * 2^(exponent/4). It normalized to FRAC_BITS */ yading@10: static inline int l3_unscale(int value, int exponent) yading@10: { yading@10: unsigned int m; yading@10: int e; yading@10: yading@10: e = table_4_3_exp [4 * value + (exponent & 3)]; yading@10: m = table_4_3_value[4 * value + (exponent & 3)]; yading@10: e -= exponent >> 2; yading@10: #ifdef DEBUG yading@10: if(e < 1) yading@10: av_log(NULL, AV_LOG_WARNING, "l3_unscale: e is %d\n", e); yading@10: #endif yading@10: if (e > 31) yading@10: return 0; yading@10: m = (m + (1 << (e - 1))) >> e; yading@10: yading@10: return m; yading@10: } yading@10: yading@10: static av_cold void decode_init_static(void) yading@10: { yading@10: int i, j, k; yading@10: int offset; yading@10: yading@10: /* scale factors table for layer 1/2 */ yading@10: for (i = 0; i < 64; i++) { yading@10: int shift, mod; yading@10: /* 1.0 (i = 3) is normalized to 2 ^ FRAC_BITS */ yading@10: shift = i / 3; yading@10: mod = i % 3; yading@10: scale_factor_modshift[i] = mod | (shift << 2); yading@10: } yading@10: yading@10: /* scale factor multiply for layer 1 */ yading@10: for (i = 0; i < 15; i++) { yading@10: int n, norm; yading@10: n = i + 2; yading@10: norm = ((INT64_C(1) << n) * FRAC_ONE) / ((1 << n) - 1); yading@10: scale_factor_mult[i][0] = MULLx(norm, FIXR(1.0 * 2.0), FRAC_BITS); yading@10: scale_factor_mult[i][1] = MULLx(norm, FIXR(0.7937005259 * 2.0), FRAC_BITS); yading@10: scale_factor_mult[i][2] = MULLx(norm, FIXR(0.6299605249 * 2.0), FRAC_BITS); yading@10: av_dlog(NULL, "%d: norm=%x s=%x %x %x\n", i, norm, yading@10: scale_factor_mult[i][0], yading@10: scale_factor_mult[i][1], yading@10: scale_factor_mult[i][2]); yading@10: } yading@10: yading@10: RENAME(ff_mpa_synth_init)(RENAME(ff_mpa_synth_window)); yading@10: yading@10: /* huffman decode tables */ yading@10: offset = 0; yading@10: for (i = 1; i < 16; i++) { yading@10: const HuffTable *h = &mpa_huff_tables[i]; yading@10: int xsize, x, y; yading@10: uint8_t tmp_bits [512] = { 0 }; yading@10: uint16_t tmp_codes[512] = { 0 }; yading@10: yading@10: xsize = h->xsize; yading@10: yading@10: j = 0; yading@10: for (x = 0; x < xsize; x++) { yading@10: for (y = 0; y < xsize; y++) { yading@10: tmp_bits [(x << 5) | y | ((x&&y)<<4)]= h->bits [j ]; yading@10: tmp_codes[(x << 5) | y | ((x&&y)<<4)]= h->codes[j++]; yading@10: } yading@10: } yading@10: yading@10: /* XXX: fail test */ yading@10: huff_vlc[i].table = huff_vlc_tables+offset; yading@10: huff_vlc[i].table_allocated = huff_vlc_tables_sizes[i]; yading@10: init_vlc(&huff_vlc[i], 7, 512, yading@10: tmp_bits, 1, 1, tmp_codes, 2, 2, yading@10: INIT_VLC_USE_NEW_STATIC); yading@10: offset += huff_vlc_tables_sizes[i]; yading@10: } yading@10: av_assert0(offset == FF_ARRAY_ELEMS(huff_vlc_tables)); yading@10: yading@10: offset = 0; yading@10: for (i = 0; i < 2; i++) { yading@10: huff_quad_vlc[i].table = huff_quad_vlc_tables+offset; yading@10: huff_quad_vlc[i].table_allocated = huff_quad_vlc_tables_sizes[i]; yading@10: init_vlc(&huff_quad_vlc[i], i == 0 ? 7 : 4, 16, yading@10: mpa_quad_bits[i], 1, 1, mpa_quad_codes[i], 1, 1, yading@10: INIT_VLC_USE_NEW_STATIC); yading@10: offset += huff_quad_vlc_tables_sizes[i]; yading@10: } yading@10: av_assert0(offset == FF_ARRAY_ELEMS(huff_quad_vlc_tables)); yading@10: yading@10: for (i = 0; i < 9; i++) { yading@10: k = 0; yading@10: for (j = 0; j < 22; j++) { yading@10: band_index_long[i][j] = k; yading@10: k += band_size_long[i][j]; yading@10: } yading@10: band_index_long[i][22] = k; yading@10: } yading@10: yading@10: /* compute n ^ (4/3) and store it in mantissa/exp format */ yading@10: yading@10: mpegaudio_tableinit(); yading@10: yading@10: for (i = 0; i < 4; i++) { yading@10: if (ff_mpa_quant_bits[i] < 0) { yading@10: for (j = 0; j < (1 << (-ff_mpa_quant_bits[i]+1)); j++) { yading@10: int val1, val2, val3, steps; yading@10: int val = j; yading@10: steps = ff_mpa_quant_steps[i]; yading@10: val1 = val % steps; yading@10: val /= steps; yading@10: val2 = val % steps; yading@10: val3 = val / steps; yading@10: division_tabs[i][j] = val1 + (val2 << 4) + (val3 << 8); yading@10: } yading@10: } yading@10: } yading@10: yading@10: yading@10: for (i = 0; i < 7; i++) { yading@10: float f; yading@10: INTFLOAT v; yading@10: if (i != 6) { yading@10: f = tan((double)i * M_PI / 12.0); yading@10: v = FIXR(f / (1.0 + f)); yading@10: } else { yading@10: v = FIXR(1.0); yading@10: } yading@10: is_table[0][ i] = v; yading@10: is_table[1][6 - i] = v; yading@10: } yading@10: /* invalid values */ yading@10: for (i = 7; i < 16; i++) yading@10: is_table[0][i] = is_table[1][i] = 0.0; yading@10: yading@10: for (i = 0; i < 16; i++) { yading@10: double f; yading@10: int e, k; yading@10: yading@10: for (j = 0; j < 2; j++) { yading@10: e = -(j + 1) * ((i + 1) >> 1); yading@10: f = exp2(e / 4.0); yading@10: k = i & 1; yading@10: is_table_lsf[j][k ^ 1][i] = FIXR(f); yading@10: is_table_lsf[j][k ][i] = FIXR(1.0); yading@10: av_dlog(NULL, "is_table_lsf %d %d: %f %f\n", yading@10: i, j, (float) is_table_lsf[j][0][i], yading@10: (float) is_table_lsf[j][1][i]); yading@10: } yading@10: } yading@10: yading@10: for (i = 0; i < 8; i++) { yading@10: float ci, cs, ca; yading@10: ci = ci_table[i]; yading@10: cs = 1.0 / sqrt(1.0 + ci * ci); yading@10: ca = cs * ci; yading@10: #if !CONFIG_FLOAT yading@10: csa_table[i][0] = FIXHR(cs/4); yading@10: csa_table[i][1] = FIXHR(ca/4); yading@10: csa_table[i][2] = FIXHR(ca/4) + FIXHR(cs/4); yading@10: csa_table[i][3] = FIXHR(ca/4) - FIXHR(cs/4); yading@10: #else yading@10: csa_table[i][0] = cs; yading@10: csa_table[i][1] = ca; yading@10: csa_table[i][2] = ca + cs; yading@10: csa_table[i][3] = ca - cs; yading@10: #endif yading@10: } yading@10: } yading@10: yading@10: static av_cold int decode_init(AVCodecContext * avctx) yading@10: { yading@10: static int initialized_tables = 0; yading@10: MPADecodeContext *s = avctx->priv_data; yading@10: yading@10: if (!initialized_tables) { yading@10: decode_init_static(); yading@10: initialized_tables = 1; yading@10: } yading@10: yading@10: s->avctx = avctx; yading@10: yading@10: avpriv_float_dsp_init(&s->fdsp, avctx->flags & CODEC_FLAG_BITEXACT); yading@10: ff_mpadsp_init(&s->mpadsp); yading@10: yading@10: if (avctx->request_sample_fmt == OUT_FMT && yading@10: avctx->codec_id != AV_CODEC_ID_MP3ON4) yading@10: avctx->sample_fmt = OUT_FMT; yading@10: else yading@10: avctx->sample_fmt = OUT_FMT_P; yading@10: s->err_recognition = avctx->err_recognition; yading@10: yading@10: if (avctx->codec_id == AV_CODEC_ID_MP3ADU) yading@10: s->adu_mode = 1; yading@10: yading@10: return 0; yading@10: } yading@10: yading@10: #define C3 FIXHR(0.86602540378443864676/2) yading@10: #define C4 FIXHR(0.70710678118654752439/2) //0.5 / cos(pi*(9)/36) yading@10: #define C5 FIXHR(0.51763809020504152469/2) //0.5 / cos(pi*(5)/36) yading@10: #define C6 FIXHR(1.93185165257813657349/4) //0.5 / cos(pi*(15)/36) yading@10: yading@10: /* 12 points IMDCT. We compute it "by hand" by factorizing obvious yading@10: cases. */ yading@10: static void imdct12(INTFLOAT *out, INTFLOAT *in) yading@10: { yading@10: INTFLOAT in0, in1, in2, in3, in4, in5, t1, t2; yading@10: yading@10: in0 = in[0*3]; yading@10: in1 = in[1*3] + in[0*3]; yading@10: in2 = in[2*3] + in[1*3]; yading@10: in3 = in[3*3] + in[2*3]; yading@10: in4 = in[4*3] + in[3*3]; yading@10: in5 = in[5*3] + in[4*3]; yading@10: in5 += in3; yading@10: in3 += in1; yading@10: yading@10: in2 = MULH3(in2, C3, 2); yading@10: in3 = MULH3(in3, C3, 4); yading@10: yading@10: t1 = in0 - in4; yading@10: t2 = MULH3(in1 - in5, C4, 2); yading@10: yading@10: out[ 7] = yading@10: out[10] = t1 + t2; yading@10: out[ 1] = yading@10: out[ 4] = t1 - t2; yading@10: yading@10: in0 += SHR(in4, 1); yading@10: in4 = in0 + in2; yading@10: in5 += 2*in1; yading@10: in1 = MULH3(in5 + in3, C5, 1); yading@10: out[ 8] = yading@10: out[ 9] = in4 + in1; yading@10: out[ 2] = yading@10: out[ 3] = in4 - in1; yading@10: yading@10: in0 -= in2; yading@10: in5 = MULH3(in5 - in3, C6, 2); yading@10: out[ 0] = yading@10: out[ 5] = in0 - in5; yading@10: out[ 6] = yading@10: out[11] = in0 + in5; yading@10: } yading@10: yading@10: /* return the number of decoded frames */ yading@10: static int mp_decode_layer1(MPADecodeContext *s) yading@10: { yading@10: int bound, i, v, n, ch, j, mant; yading@10: uint8_t allocation[MPA_MAX_CHANNELS][SBLIMIT]; yading@10: uint8_t scale_factors[MPA_MAX_CHANNELS][SBLIMIT]; yading@10: yading@10: if (s->mode == MPA_JSTEREO) yading@10: bound = (s->mode_ext + 1) * 4; yading@10: else yading@10: bound = SBLIMIT; yading@10: yading@10: /* allocation bits */ yading@10: for (i = 0; i < bound; i++) { yading@10: for (ch = 0; ch < s->nb_channels; ch++) { yading@10: allocation[ch][i] = get_bits(&s->gb, 4); yading@10: } yading@10: } yading@10: for (i = bound; i < SBLIMIT; i++) yading@10: allocation[0][i] = get_bits(&s->gb, 4); yading@10: yading@10: /* scale factors */ yading@10: for (i = 0; i < bound; i++) { yading@10: for (ch = 0; ch < s->nb_channels; ch++) { yading@10: if (allocation[ch][i]) yading@10: scale_factors[ch][i] = get_bits(&s->gb, 6); yading@10: } yading@10: } yading@10: for (i = bound; i < SBLIMIT; i++) { yading@10: if (allocation[0][i]) { yading@10: scale_factors[0][i] = get_bits(&s->gb, 6); yading@10: scale_factors[1][i] = get_bits(&s->gb, 6); yading@10: } yading@10: } yading@10: yading@10: /* compute samples */ yading@10: for (j = 0; j < 12; j++) { yading@10: for (i = 0; i < bound; i++) { yading@10: for (ch = 0; ch < s->nb_channels; ch++) { yading@10: n = allocation[ch][i]; yading@10: if (n) { yading@10: mant = get_bits(&s->gb, n + 1); yading@10: v = l1_unscale(n, mant, scale_factors[ch][i]); yading@10: } else { yading@10: v = 0; yading@10: } yading@10: s->sb_samples[ch][j][i] = v; yading@10: } yading@10: } yading@10: for (i = bound; i < SBLIMIT; i++) { yading@10: n = allocation[0][i]; yading@10: if (n) { yading@10: mant = get_bits(&s->gb, n + 1); yading@10: v = l1_unscale(n, mant, scale_factors[0][i]); yading@10: s->sb_samples[0][j][i] = v; yading@10: v = l1_unscale(n, mant, scale_factors[1][i]); yading@10: s->sb_samples[1][j][i] = v; yading@10: } else { yading@10: s->sb_samples[0][j][i] = 0; yading@10: s->sb_samples[1][j][i] = 0; yading@10: } yading@10: } yading@10: } yading@10: return 12; yading@10: } yading@10: yading@10: static int mp_decode_layer2(MPADecodeContext *s) yading@10: { yading@10: int sblimit; /* number of used subbands */ yading@10: const unsigned char *alloc_table; yading@10: int table, bit_alloc_bits, i, j, ch, bound, v; yading@10: unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT]; yading@10: unsigned char scale_code[MPA_MAX_CHANNELS][SBLIMIT]; yading@10: unsigned char scale_factors[MPA_MAX_CHANNELS][SBLIMIT][3], *sf; yading@10: int scale, qindex, bits, steps, k, l, m, b; yading@10: yading@10: /* select decoding table */ yading@10: table = ff_mpa_l2_select_table(s->bit_rate / 1000, s->nb_channels, yading@10: s->sample_rate, s->lsf); yading@10: sblimit = ff_mpa_sblimit_table[table]; yading@10: alloc_table = ff_mpa_alloc_tables[table]; yading@10: yading@10: if (s->mode == MPA_JSTEREO) yading@10: bound = (s->mode_ext + 1) * 4; yading@10: else yading@10: bound = sblimit; yading@10: yading@10: av_dlog(s->avctx, "bound=%d sblimit=%d\n", bound, sblimit); yading@10: yading@10: /* sanity check */ yading@10: if (bound > sblimit) yading@10: bound = sblimit; yading@10: yading@10: /* parse bit allocation */ yading@10: j = 0; yading@10: for (i = 0; i < bound; i++) { yading@10: bit_alloc_bits = alloc_table[j]; yading@10: for (ch = 0; ch < s->nb_channels; ch++) yading@10: bit_alloc[ch][i] = get_bits(&s->gb, bit_alloc_bits); yading@10: j += 1 << bit_alloc_bits; yading@10: } yading@10: for (i = bound; i < sblimit; i++) { yading@10: bit_alloc_bits = alloc_table[j]; yading@10: v = get_bits(&s->gb, bit_alloc_bits); yading@10: bit_alloc[0][i] = v; yading@10: bit_alloc[1][i] = v; yading@10: j += 1 << bit_alloc_bits; yading@10: } yading@10: yading@10: /* scale codes */ yading@10: for (i = 0; i < sblimit; i++) { yading@10: for (ch = 0; ch < s->nb_channels; ch++) { yading@10: if (bit_alloc[ch][i]) yading@10: scale_code[ch][i] = get_bits(&s->gb, 2); yading@10: } yading@10: } yading@10: yading@10: /* scale factors */ yading@10: for (i = 0; i < sblimit; i++) { yading@10: for (ch = 0; ch < s->nb_channels; ch++) { yading@10: if (bit_alloc[ch][i]) { yading@10: sf = scale_factors[ch][i]; yading@10: switch (scale_code[ch][i]) { yading@10: default: yading@10: case 0: yading@10: sf[0] = get_bits(&s->gb, 6); yading@10: sf[1] = get_bits(&s->gb, 6); yading@10: sf[2] = get_bits(&s->gb, 6); yading@10: break; yading@10: case 2: yading@10: sf[0] = get_bits(&s->gb, 6); yading@10: sf[1] = sf[0]; yading@10: sf[2] = sf[0]; yading@10: break; yading@10: case 1: yading@10: sf[0] = get_bits(&s->gb, 6); yading@10: sf[2] = get_bits(&s->gb, 6); yading@10: sf[1] = sf[0]; yading@10: break; yading@10: case 3: yading@10: sf[0] = get_bits(&s->gb, 6); yading@10: sf[2] = get_bits(&s->gb, 6); yading@10: sf[1] = sf[2]; yading@10: break; yading@10: } yading@10: } yading@10: } yading@10: } yading@10: yading@10: /* samples */ yading@10: for (k = 0; k < 3; k++) { yading@10: for (l = 0; l < 12; l += 3) { yading@10: j = 0; yading@10: for (i = 0; i < bound; i++) { yading@10: bit_alloc_bits = alloc_table[j]; yading@10: for (ch = 0; ch < s->nb_channels; ch++) { yading@10: b = bit_alloc[ch][i]; yading@10: if (b) { yading@10: scale = scale_factors[ch][i][k]; yading@10: qindex = alloc_table[j+b]; yading@10: bits = ff_mpa_quant_bits[qindex]; yading@10: if (bits < 0) { yading@10: int v2; yading@10: /* 3 values at the same time */ yading@10: v = get_bits(&s->gb, -bits); yading@10: v2 = division_tabs[qindex][v]; yading@10: steps = ff_mpa_quant_steps[qindex]; yading@10: yading@10: s->sb_samples[ch][k * 12 + l + 0][i] = yading@10: l2_unscale_group(steps, v2 & 15, scale); yading@10: s->sb_samples[ch][k * 12 + l + 1][i] = yading@10: l2_unscale_group(steps, (v2 >> 4) & 15, scale); yading@10: s->sb_samples[ch][k * 12 + l + 2][i] = yading@10: l2_unscale_group(steps, v2 >> 8 , scale); yading@10: } else { yading@10: for (m = 0; m < 3; m++) { yading@10: v = get_bits(&s->gb, bits); yading@10: v = l1_unscale(bits - 1, v, scale); yading@10: s->sb_samples[ch][k * 12 + l + m][i] = v; yading@10: } yading@10: } yading@10: } else { yading@10: s->sb_samples[ch][k * 12 + l + 0][i] = 0; yading@10: s->sb_samples[ch][k * 12 + l + 1][i] = 0; yading@10: s->sb_samples[ch][k * 12 + l + 2][i] = 0; yading@10: } yading@10: } yading@10: /* next subband in alloc table */ yading@10: j += 1 << bit_alloc_bits; yading@10: } yading@10: /* XXX: find a way to avoid this duplication of code */ yading@10: for (i = bound; i < sblimit; i++) { yading@10: bit_alloc_bits = alloc_table[j]; yading@10: b = bit_alloc[0][i]; yading@10: if (b) { yading@10: int mant, scale0, scale1; yading@10: scale0 = scale_factors[0][i][k]; yading@10: scale1 = scale_factors[1][i][k]; yading@10: qindex = alloc_table[j+b]; yading@10: bits = ff_mpa_quant_bits[qindex]; yading@10: if (bits < 0) { yading@10: /* 3 values at the same time */ yading@10: v = get_bits(&s->gb, -bits); yading@10: steps = ff_mpa_quant_steps[qindex]; yading@10: mant = v % steps; yading@10: v = v / steps; yading@10: s->sb_samples[0][k * 12 + l + 0][i] = yading@10: l2_unscale_group(steps, mant, scale0); yading@10: s->sb_samples[1][k * 12 + l + 0][i] = yading@10: l2_unscale_group(steps, mant, scale1); yading@10: mant = v % steps; yading@10: v = v / steps; yading@10: s->sb_samples[0][k * 12 + l + 1][i] = yading@10: l2_unscale_group(steps, mant, scale0); yading@10: s->sb_samples[1][k * 12 + l + 1][i] = yading@10: l2_unscale_group(steps, mant, scale1); yading@10: s->sb_samples[0][k * 12 + l + 2][i] = yading@10: l2_unscale_group(steps, v, scale0); yading@10: s->sb_samples[1][k * 12 + l + 2][i] = yading@10: l2_unscale_group(steps, v, scale1); yading@10: } else { yading@10: for (m = 0; m < 3; m++) { yading@10: mant = get_bits(&s->gb, bits); yading@10: s->sb_samples[0][k * 12 + l + m][i] = yading@10: l1_unscale(bits - 1, mant, scale0); yading@10: s->sb_samples[1][k * 12 + l + m][i] = yading@10: l1_unscale(bits - 1, mant, scale1); yading@10: } yading@10: } yading@10: } else { yading@10: s->sb_samples[0][k * 12 + l + 0][i] = 0; yading@10: s->sb_samples[0][k * 12 + l + 1][i] = 0; yading@10: s->sb_samples[0][k * 12 + l + 2][i] = 0; yading@10: s->sb_samples[1][k * 12 + l + 0][i] = 0; yading@10: s->sb_samples[1][k * 12 + l + 1][i] = 0; yading@10: s->sb_samples[1][k * 12 + l + 2][i] = 0; yading@10: } yading@10: /* next subband in alloc table */ yading@10: j += 1 << bit_alloc_bits; yading@10: } yading@10: /* fill remaining samples to zero */ yading@10: for (i = sblimit; i < SBLIMIT; i++) { yading@10: for (ch = 0; ch < s->nb_channels; ch++) { yading@10: s->sb_samples[ch][k * 12 + l + 0][i] = 0; yading@10: s->sb_samples[ch][k * 12 + l + 1][i] = 0; yading@10: s->sb_samples[ch][k * 12 + l + 2][i] = 0; yading@10: } yading@10: } yading@10: } yading@10: } yading@10: return 3 * 12; yading@10: } yading@10: yading@10: #define SPLIT(dst,sf,n) \ yading@10: if (n == 3) { \ yading@10: int m = (sf * 171) >> 9; \ yading@10: dst = sf - 3 * m; \ yading@10: sf = m; \ yading@10: } else if (n == 4) { \ yading@10: dst = sf & 3; \ yading@10: sf >>= 2; \ yading@10: } else if (n == 5) { \ yading@10: int m = (sf * 205) >> 10; \ yading@10: dst = sf - 5 * m; \ yading@10: sf = m; \ yading@10: } else if (n == 6) { \ yading@10: int m = (sf * 171) >> 10; \ yading@10: dst = sf - 6 * m; \ yading@10: sf = m; \ yading@10: } else { \ yading@10: dst = 0; \ yading@10: } yading@10: yading@10: static av_always_inline void lsf_sf_expand(int *slen, int sf, int n1, int n2, yading@10: int n3) yading@10: { yading@10: SPLIT(slen[3], sf, n3) yading@10: SPLIT(slen[2], sf, n2) yading@10: SPLIT(slen[1], sf, n1) yading@10: slen[0] = sf; yading@10: } yading@10: yading@10: static void exponents_from_scale_factors(MPADecodeContext *s, GranuleDef *g, yading@10: int16_t *exponents) yading@10: { yading@10: const uint8_t *bstab, *pretab; yading@10: int len, i, j, k, l, v0, shift, gain, gains[3]; yading@10: int16_t *exp_ptr; yading@10: yading@10: exp_ptr = exponents; yading@10: gain = g->global_gain - 210; yading@10: shift = g->scalefac_scale + 1; yading@10: yading@10: bstab = band_size_long[s->sample_rate_index]; yading@10: pretab = mpa_pretab[g->preflag]; yading@10: for (i = 0; i < g->long_end; i++) { yading@10: v0 = gain - ((g->scale_factors[i] + pretab[i]) << shift) + 400; yading@10: len = bstab[i]; yading@10: for (j = len; j > 0; j--) yading@10: *exp_ptr++ = v0; yading@10: } yading@10: yading@10: if (g->short_start < 13) { yading@10: bstab = band_size_short[s->sample_rate_index]; yading@10: gains[0] = gain - (g->subblock_gain[0] << 3); yading@10: gains[1] = gain - (g->subblock_gain[1] << 3); yading@10: gains[2] = gain - (g->subblock_gain[2] << 3); yading@10: k = g->long_end; yading@10: for (i = g->short_start; i < 13; i++) { yading@10: len = bstab[i]; yading@10: for (l = 0; l < 3; l++) { yading@10: v0 = gains[l] - (g->scale_factors[k++] << shift) + 400; yading@10: for (j = len; j > 0; j--) yading@10: *exp_ptr++ = v0; yading@10: } yading@10: } yading@10: } yading@10: } yading@10: yading@10: /* handle n = 0 too */ yading@10: static inline int get_bitsz(GetBitContext *s, int n) yading@10: { yading@10: return n ? get_bits(s, n) : 0; yading@10: } yading@10: yading@10: yading@10: static void switch_buffer(MPADecodeContext *s, int *pos, int *end_pos, yading@10: int *end_pos2) yading@10: { yading@10: if (s->in_gb.buffer && *pos >= s->gb.size_in_bits) { yading@10: s->gb = s->in_gb; yading@10: s->in_gb.buffer = NULL; yading@10: av_assert2((get_bits_count(&s->gb) & 7) == 0); yading@10: skip_bits_long(&s->gb, *pos - *end_pos); yading@10: *end_pos2 = yading@10: *end_pos = *end_pos2 + get_bits_count(&s->gb) - *pos; yading@10: *pos = get_bits_count(&s->gb); yading@10: } yading@10: } yading@10: yading@10: /* Following is a optimized code for yading@10: INTFLOAT v = *src yading@10: if(get_bits1(&s->gb)) yading@10: v = -v; yading@10: *dst = v; yading@10: */ yading@10: #if CONFIG_FLOAT yading@10: #define READ_FLIP_SIGN(dst,src) \ yading@10: v = AV_RN32A(src) ^ (get_bits1(&s->gb) << 31); \ yading@10: AV_WN32A(dst, v); yading@10: #else yading@10: #define READ_FLIP_SIGN(dst,src) \ yading@10: v = -get_bits1(&s->gb); \ yading@10: *(dst) = (*(src) ^ v) - v; yading@10: #endif yading@10: yading@10: static int huffman_decode(MPADecodeContext *s, GranuleDef *g, yading@10: int16_t *exponents, int end_pos2) yading@10: { yading@10: int s_index; yading@10: int i; yading@10: int last_pos, bits_left; yading@10: VLC *vlc; yading@10: int end_pos = FFMIN(end_pos2, s->gb.size_in_bits); yading@10: yading@10: /* low frequencies (called big values) */ yading@10: s_index = 0; yading@10: for (i = 0; i < 3; i++) { yading@10: int j, k, l, linbits; yading@10: j = g->region_size[i]; yading@10: if (j == 0) yading@10: continue; yading@10: /* select vlc table */ yading@10: k = g->table_select[i]; yading@10: l = mpa_huff_data[k][0]; yading@10: linbits = mpa_huff_data[k][1]; yading@10: vlc = &huff_vlc[l]; yading@10: yading@10: if (!l) { yading@10: memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid) * 2 * j); yading@10: s_index += 2 * j; yading@10: continue; yading@10: } yading@10: yading@10: /* read huffcode and compute each couple */ yading@10: for (; j > 0; j--) { yading@10: int exponent, x, y; yading@10: int v; yading@10: int pos = get_bits_count(&s->gb); yading@10: yading@10: if (pos >= end_pos){ yading@10: switch_buffer(s, &pos, &end_pos, &end_pos2); yading@10: if (pos >= end_pos) yading@10: break; yading@10: } yading@10: y = get_vlc2(&s->gb, vlc->table, 7, 3); yading@10: yading@10: if (!y) { yading@10: g->sb_hybrid[s_index ] = yading@10: g->sb_hybrid[s_index+1] = 0; yading@10: s_index += 2; yading@10: continue; yading@10: } yading@10: yading@10: exponent= exponents[s_index]; yading@10: yading@10: av_dlog(s->avctx, "region=%d n=%d x=%d y=%d exp=%d\n", yading@10: i, g->region_size[i] - j, x, y, exponent); yading@10: if (y & 16) { yading@10: x = y >> 5; yading@10: y = y & 0x0f; yading@10: if (x < 15) { yading@10: READ_FLIP_SIGN(g->sb_hybrid + s_index, RENAME(expval_table)[exponent] + x) yading@10: } else { yading@10: x += get_bitsz(&s->gb, linbits); yading@10: v = l3_unscale(x, exponent); yading@10: if (get_bits1(&s->gb)) yading@10: v = -v; yading@10: g->sb_hybrid[s_index] = v; yading@10: } yading@10: if (y < 15) { yading@10: READ_FLIP_SIGN(g->sb_hybrid + s_index + 1, RENAME(expval_table)[exponent] + y) yading@10: } else { yading@10: y += get_bitsz(&s->gb, linbits); yading@10: v = l3_unscale(y, exponent); yading@10: if (get_bits1(&s->gb)) yading@10: v = -v; yading@10: g->sb_hybrid[s_index+1] = v; yading@10: } yading@10: } else { yading@10: x = y >> 5; yading@10: y = y & 0x0f; yading@10: x += y; yading@10: if (x < 15) { yading@10: READ_FLIP_SIGN(g->sb_hybrid + s_index + !!y, RENAME(expval_table)[exponent] + x) yading@10: } else { yading@10: x += get_bitsz(&s->gb, linbits); yading@10: v = l3_unscale(x, exponent); yading@10: if (get_bits1(&s->gb)) yading@10: v = -v; yading@10: g->sb_hybrid[s_index+!!y] = v; yading@10: } yading@10: g->sb_hybrid[s_index + !y] = 0; yading@10: } yading@10: s_index += 2; yading@10: } yading@10: } yading@10: yading@10: /* high frequencies */ yading@10: vlc = &huff_quad_vlc[g->count1table_select]; yading@10: last_pos = 0; yading@10: while (s_index <= 572) { yading@10: int pos, code; yading@10: pos = get_bits_count(&s->gb); yading@10: if (pos >= end_pos) { yading@10: if (pos > end_pos2 && last_pos) { yading@10: /* some encoders generate an incorrect size for this yading@10: part. We must go back into the data */ yading@10: s_index -= 4; yading@10: skip_bits_long(&s->gb, last_pos - pos); yading@10: av_log(s->avctx, AV_LOG_INFO, "overread, skip %d enddists: %d %d\n", last_pos - pos, end_pos-pos, end_pos2-pos); yading@10: if(s->err_recognition & (AV_EF_BITSTREAM|AV_EF_COMPLIANT)) yading@10: s_index=0; yading@10: break; yading@10: } yading@10: switch_buffer(s, &pos, &end_pos, &end_pos2); yading@10: if (pos >= end_pos) yading@10: break; yading@10: } yading@10: last_pos = pos; yading@10: yading@10: code = get_vlc2(&s->gb, vlc->table, vlc->bits, 1); yading@10: av_dlog(s->avctx, "t=%d code=%d\n", g->count1table_select, code); yading@10: g->sb_hybrid[s_index+0] = yading@10: g->sb_hybrid[s_index+1] = yading@10: g->sb_hybrid[s_index+2] = yading@10: g->sb_hybrid[s_index+3] = 0; yading@10: while (code) { yading@10: static const int idxtab[16] = { 3,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0 }; yading@10: int v; yading@10: int pos = s_index + idxtab[code]; yading@10: code ^= 8 >> idxtab[code]; yading@10: READ_FLIP_SIGN(g->sb_hybrid + pos, RENAME(exp_table)+exponents[pos]) yading@10: } yading@10: s_index += 4; yading@10: } yading@10: /* skip extension bits */ yading@10: bits_left = end_pos2 - get_bits_count(&s->gb); yading@10: if (bits_left < 0 && (s->err_recognition & (AV_EF_BUFFER|AV_EF_COMPLIANT))) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "bits_left=%d\n", bits_left); yading@10: s_index=0; yading@10: } else if (bits_left > 0 && (s->err_recognition & (AV_EF_BUFFER|AV_EF_AGGRESSIVE))) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "bits_left=%d\n", bits_left); yading@10: s_index = 0; yading@10: } yading@10: memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid) * (576 - s_index)); yading@10: skip_bits_long(&s->gb, bits_left); yading@10: yading@10: i = get_bits_count(&s->gb); yading@10: switch_buffer(s, &i, &end_pos, &end_pos2); yading@10: yading@10: return 0; yading@10: } yading@10: yading@10: /* Reorder short blocks from bitstream order to interleaved order. It yading@10: would be faster to do it in parsing, but the code would be far more yading@10: complicated */ yading@10: static void reorder_block(MPADecodeContext *s, GranuleDef *g) yading@10: { yading@10: int i, j, len; yading@10: INTFLOAT *ptr, *dst, *ptr1; yading@10: INTFLOAT tmp[576]; yading@10: yading@10: if (g->block_type != 2) yading@10: return; yading@10: yading@10: if (g->switch_point) { yading@10: if (s->sample_rate_index != 8) yading@10: ptr = g->sb_hybrid + 36; yading@10: else yading@10: ptr = g->sb_hybrid + 72; yading@10: } else { yading@10: ptr = g->sb_hybrid; yading@10: } yading@10: yading@10: for (i = g->short_start; i < 13; i++) { yading@10: len = band_size_short[s->sample_rate_index][i]; yading@10: ptr1 = ptr; yading@10: dst = tmp; yading@10: for (j = len; j > 0; j--) { yading@10: *dst++ = ptr[0*len]; yading@10: *dst++ = ptr[1*len]; yading@10: *dst++ = ptr[2*len]; yading@10: ptr++; yading@10: } yading@10: ptr += 2 * len; yading@10: memcpy(ptr1, tmp, len * 3 * sizeof(*ptr1)); yading@10: } yading@10: } yading@10: yading@10: #define ISQRT2 FIXR(0.70710678118654752440) yading@10: yading@10: static void compute_stereo(MPADecodeContext *s, GranuleDef *g0, GranuleDef *g1) yading@10: { yading@10: int i, j, k, l; yading@10: int sf_max, sf, len, non_zero_found; yading@10: INTFLOAT (*is_tab)[16], *tab0, *tab1, tmp0, tmp1, v1, v2; yading@10: int non_zero_found_short[3]; yading@10: yading@10: /* intensity stereo */ yading@10: if (s->mode_ext & MODE_EXT_I_STEREO) { yading@10: if (!s->lsf) { yading@10: is_tab = is_table; yading@10: sf_max = 7; yading@10: } else { yading@10: is_tab = is_table_lsf[g1->scalefac_compress & 1]; yading@10: sf_max = 16; yading@10: } yading@10: yading@10: tab0 = g0->sb_hybrid + 576; yading@10: tab1 = g1->sb_hybrid + 576; yading@10: yading@10: non_zero_found_short[0] = 0; yading@10: non_zero_found_short[1] = 0; yading@10: non_zero_found_short[2] = 0; yading@10: k = (13 - g1->short_start) * 3 + g1->long_end - 3; yading@10: for (i = 12; i >= g1->short_start; i--) { yading@10: /* for last band, use previous scale factor */ yading@10: if (i != 11) yading@10: k -= 3; yading@10: len = band_size_short[s->sample_rate_index][i]; yading@10: for (l = 2; l >= 0; l--) { yading@10: tab0 -= len; yading@10: tab1 -= len; yading@10: if (!non_zero_found_short[l]) { yading@10: /* test if non zero band. if so, stop doing i-stereo */ yading@10: for (j = 0; j < len; j++) { yading@10: if (tab1[j] != 0) { yading@10: non_zero_found_short[l] = 1; yading@10: goto found1; yading@10: } yading@10: } yading@10: sf = g1->scale_factors[k + l]; yading@10: if (sf >= sf_max) yading@10: goto found1; yading@10: yading@10: v1 = is_tab[0][sf]; yading@10: v2 = is_tab[1][sf]; yading@10: for (j = 0; j < len; j++) { yading@10: tmp0 = tab0[j]; yading@10: tab0[j] = MULLx(tmp0, v1, FRAC_BITS); yading@10: tab1[j] = MULLx(tmp0, v2, FRAC_BITS); yading@10: } yading@10: } else { yading@10: found1: yading@10: if (s->mode_ext & MODE_EXT_MS_STEREO) { yading@10: /* lower part of the spectrum : do ms stereo yading@10: if enabled */ yading@10: for (j = 0; j < len; j++) { yading@10: tmp0 = tab0[j]; yading@10: tmp1 = tab1[j]; yading@10: tab0[j] = MULLx(tmp0 + tmp1, ISQRT2, FRAC_BITS); yading@10: tab1[j] = MULLx(tmp0 - tmp1, ISQRT2, FRAC_BITS); yading@10: } yading@10: } yading@10: } yading@10: } yading@10: } yading@10: yading@10: non_zero_found = non_zero_found_short[0] | yading@10: non_zero_found_short[1] | yading@10: non_zero_found_short[2]; yading@10: yading@10: for (i = g1->long_end - 1;i >= 0;i--) { yading@10: len = band_size_long[s->sample_rate_index][i]; yading@10: tab0 -= len; yading@10: tab1 -= len; yading@10: /* test if non zero band. if so, stop doing i-stereo */ yading@10: if (!non_zero_found) { yading@10: for (j = 0; j < len; j++) { yading@10: if (tab1[j] != 0) { yading@10: non_zero_found = 1; yading@10: goto found2; yading@10: } yading@10: } yading@10: /* for last band, use previous scale factor */ yading@10: k = (i == 21) ? 20 : i; yading@10: sf = g1->scale_factors[k]; yading@10: if (sf >= sf_max) yading@10: goto found2; yading@10: v1 = is_tab[0][sf]; yading@10: v2 = is_tab[1][sf]; yading@10: for (j = 0; j < len; j++) { yading@10: tmp0 = tab0[j]; yading@10: tab0[j] = MULLx(tmp0, v1, FRAC_BITS); yading@10: tab1[j] = MULLx(tmp0, v2, FRAC_BITS); yading@10: } yading@10: } else { yading@10: found2: yading@10: if (s->mode_ext & MODE_EXT_MS_STEREO) { yading@10: /* lower part of the spectrum : do ms stereo yading@10: if enabled */ yading@10: for (j = 0; j < len; j++) { yading@10: tmp0 = tab0[j]; yading@10: tmp1 = tab1[j]; yading@10: tab0[j] = MULLx(tmp0 + tmp1, ISQRT2, FRAC_BITS); yading@10: tab1[j] = MULLx(tmp0 - tmp1, ISQRT2, FRAC_BITS); yading@10: } yading@10: } yading@10: } yading@10: } yading@10: } else if (s->mode_ext & MODE_EXT_MS_STEREO) { yading@10: /* ms stereo ONLY */ yading@10: /* NOTE: the 1/sqrt(2) normalization factor is included in the yading@10: global gain */ yading@10: #if CONFIG_FLOAT yading@10: s->fdsp.butterflies_float(g0->sb_hybrid, g1->sb_hybrid, 576); yading@10: #else yading@10: tab0 = g0->sb_hybrid; yading@10: tab1 = g1->sb_hybrid; yading@10: for (i = 0; i < 576; i++) { yading@10: tmp0 = tab0[i]; yading@10: tmp1 = tab1[i]; yading@10: tab0[i] = tmp0 + tmp1; yading@10: tab1[i] = tmp0 - tmp1; yading@10: } yading@10: #endif yading@10: } yading@10: } yading@10: yading@10: #if CONFIG_FLOAT yading@10: #if HAVE_MIPSFPU yading@10: # include "mips/compute_antialias_float.h" yading@10: #endif /* HAVE_MIPSFPU */ yading@10: #else yading@10: #if HAVE_MIPSDSPR1 yading@10: # include "mips/compute_antialias_fixed.h" yading@10: #endif /* HAVE_MIPSDSPR1 */ yading@10: #endif /* CONFIG_FLOAT */ yading@10: yading@10: #ifndef compute_antialias yading@10: #if CONFIG_FLOAT yading@10: #define AA(j) do { \ yading@10: float tmp0 = ptr[-1-j]; \ yading@10: float tmp1 = ptr[ j]; \ yading@10: ptr[-1-j] = tmp0 * csa_table[j][0] - tmp1 * csa_table[j][1]; \ yading@10: ptr[ j] = tmp0 * csa_table[j][1] + tmp1 * csa_table[j][0]; \ yading@10: } while (0) yading@10: #else yading@10: #define AA(j) do { \ yading@10: int tmp0 = ptr[-1-j]; \ yading@10: int tmp1 = ptr[ j]; \ yading@10: int tmp2 = MULH(tmp0 + tmp1, csa_table[j][0]); \ yading@10: ptr[-1-j] = 4 * (tmp2 - MULH(tmp1, csa_table[j][2])); \ yading@10: ptr[ j] = 4 * (tmp2 + MULH(tmp0, csa_table[j][3])); \ yading@10: } while (0) yading@10: #endif yading@10: yading@10: static void compute_antialias(MPADecodeContext *s, GranuleDef *g) yading@10: { yading@10: INTFLOAT *ptr; yading@10: int n, i; yading@10: yading@10: /* we antialias only "long" bands */ yading@10: if (g->block_type == 2) { yading@10: if (!g->switch_point) yading@10: return; yading@10: /* XXX: check this for 8000Hz case */ yading@10: n = 1; yading@10: } else { yading@10: n = SBLIMIT - 1; yading@10: } yading@10: yading@10: ptr = g->sb_hybrid + 18; yading@10: for (i = n; i > 0; i--) { yading@10: AA(0); yading@10: AA(1); yading@10: AA(2); yading@10: AA(3); yading@10: AA(4); yading@10: AA(5); yading@10: AA(6); yading@10: AA(7); yading@10: yading@10: ptr += 18; yading@10: } yading@10: } yading@10: #endif /* compute_antialias */ yading@10: yading@10: static void compute_imdct(MPADecodeContext *s, GranuleDef *g, yading@10: INTFLOAT *sb_samples, INTFLOAT *mdct_buf) yading@10: { yading@10: INTFLOAT *win, *out_ptr, *ptr, *buf, *ptr1; yading@10: INTFLOAT out2[12]; yading@10: int i, j, mdct_long_end, sblimit; yading@10: yading@10: /* find last non zero block */ yading@10: ptr = g->sb_hybrid + 576; yading@10: ptr1 = g->sb_hybrid + 2 * 18; yading@10: while (ptr >= ptr1) { yading@10: int32_t *p; yading@10: ptr -= 6; yading@10: p = (int32_t*)ptr; yading@10: if (p[0] | p[1] | p[2] | p[3] | p[4] | p[5]) yading@10: break; yading@10: } yading@10: sblimit = ((ptr - g->sb_hybrid) / 18) + 1; yading@10: yading@10: if (g->block_type == 2) { yading@10: /* XXX: check for 8000 Hz */ yading@10: if (g->switch_point) yading@10: mdct_long_end = 2; yading@10: else yading@10: mdct_long_end = 0; yading@10: } else { yading@10: mdct_long_end = sblimit; yading@10: } yading@10: yading@10: s->mpadsp.RENAME(imdct36_blocks)(sb_samples, mdct_buf, g->sb_hybrid, yading@10: mdct_long_end, g->switch_point, yading@10: g->block_type); yading@10: yading@10: buf = mdct_buf + 4*18*(mdct_long_end >> 2) + (mdct_long_end & 3); yading@10: ptr = g->sb_hybrid + 18 * mdct_long_end; yading@10: yading@10: for (j = mdct_long_end; j < sblimit; j++) { yading@10: /* select frequency inversion */ yading@10: win = RENAME(ff_mdct_win)[2 + (4 & -(j & 1))]; yading@10: out_ptr = sb_samples + j; yading@10: yading@10: for (i = 0; i < 6; i++) { yading@10: *out_ptr = buf[4*i]; yading@10: out_ptr += SBLIMIT; yading@10: } yading@10: imdct12(out2, ptr + 0); yading@10: for (i = 0; i < 6; i++) { yading@10: *out_ptr = MULH3(out2[i ], win[i ], 1) + buf[4*(i + 6*1)]; yading@10: buf[4*(i + 6*2)] = MULH3(out2[i + 6], win[i + 6], 1); yading@10: out_ptr += SBLIMIT; yading@10: } yading@10: imdct12(out2, ptr + 1); yading@10: for (i = 0; i < 6; i++) { yading@10: *out_ptr = MULH3(out2[i ], win[i ], 1) + buf[4*(i + 6*2)]; yading@10: buf[4*(i + 6*0)] = MULH3(out2[i + 6], win[i + 6], 1); yading@10: out_ptr += SBLIMIT; yading@10: } yading@10: imdct12(out2, ptr + 2); yading@10: for (i = 0; i < 6; i++) { yading@10: buf[4*(i + 6*0)] = MULH3(out2[i ], win[i ], 1) + buf[4*(i + 6*0)]; yading@10: buf[4*(i + 6*1)] = MULH3(out2[i + 6], win[i + 6], 1); yading@10: buf[4*(i + 6*2)] = 0; yading@10: } yading@10: ptr += 18; yading@10: buf += (j&3) != 3 ? 1 : (4*18-3); yading@10: } yading@10: /* zero bands */ yading@10: for (j = sblimit; j < SBLIMIT; j++) { yading@10: /* overlap */ yading@10: out_ptr = sb_samples + j; yading@10: for (i = 0; i < 18; i++) { yading@10: *out_ptr = buf[4*i]; yading@10: buf[4*i] = 0; yading@10: out_ptr += SBLIMIT; yading@10: } yading@10: buf += (j&3) != 3 ? 1 : (4*18-3); yading@10: } yading@10: } yading@10: yading@10: /* main layer3 decoding function */ yading@10: static int mp_decode_layer3(MPADecodeContext *s) yading@10: { yading@10: int nb_granules, main_data_begin; yading@10: int gr, ch, blocksplit_flag, i, j, k, n, bits_pos; yading@10: GranuleDef *g; yading@10: int16_t exponents[576]; //FIXME try INTFLOAT yading@10: yading@10: /* read side info */ yading@10: if (s->lsf) { yading@10: main_data_begin = get_bits(&s->gb, 8); yading@10: skip_bits(&s->gb, s->nb_channels); yading@10: nb_granules = 1; yading@10: } else { yading@10: main_data_begin = get_bits(&s->gb, 9); yading@10: if (s->nb_channels == 2) yading@10: skip_bits(&s->gb, 3); yading@10: else yading@10: skip_bits(&s->gb, 5); yading@10: nb_granules = 2; yading@10: for (ch = 0; ch < s->nb_channels; ch++) { yading@10: s->granules[ch][0].scfsi = 0;/* all scale factors are transmitted */ yading@10: s->granules[ch][1].scfsi = get_bits(&s->gb, 4); yading@10: } yading@10: } yading@10: yading@10: for (gr = 0; gr < nb_granules; gr++) { yading@10: for (ch = 0; ch < s->nb_channels; ch++) { yading@10: av_dlog(s->avctx, "gr=%d ch=%d: side_info\n", gr, ch); yading@10: g = &s->granules[ch][gr]; yading@10: g->part2_3_length = get_bits(&s->gb, 12); yading@10: g->big_values = get_bits(&s->gb, 9); yading@10: if (g->big_values > 288) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "big_values too big\n"); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: yading@10: g->global_gain = get_bits(&s->gb, 8); yading@10: /* if MS stereo only is selected, we precompute the yading@10: 1/sqrt(2) renormalization factor */ yading@10: if ((s->mode_ext & (MODE_EXT_MS_STEREO | MODE_EXT_I_STEREO)) == yading@10: MODE_EXT_MS_STEREO) yading@10: g->global_gain -= 2; yading@10: if (s->lsf) yading@10: g->scalefac_compress = get_bits(&s->gb, 9); yading@10: else yading@10: g->scalefac_compress = get_bits(&s->gb, 4); yading@10: blocksplit_flag = get_bits1(&s->gb); yading@10: if (blocksplit_flag) { yading@10: g->block_type = get_bits(&s->gb, 2); yading@10: if (g->block_type == 0) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "invalid block type\n"); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: g->switch_point = get_bits1(&s->gb); yading@10: for (i = 0; i < 2; i++) yading@10: g->table_select[i] = get_bits(&s->gb, 5); yading@10: for (i = 0; i < 3; i++) yading@10: g->subblock_gain[i] = get_bits(&s->gb, 3); yading@10: ff_init_short_region(s, g); yading@10: } else { yading@10: int region_address1, region_address2; yading@10: g->block_type = 0; yading@10: g->switch_point = 0; yading@10: for (i = 0; i < 3; i++) yading@10: g->table_select[i] = get_bits(&s->gb, 5); yading@10: /* compute huffman coded region sizes */ yading@10: region_address1 = get_bits(&s->gb, 4); yading@10: region_address2 = get_bits(&s->gb, 3); yading@10: av_dlog(s->avctx, "region1=%d region2=%d\n", yading@10: region_address1, region_address2); yading@10: ff_init_long_region(s, g, region_address1, region_address2); yading@10: } yading@10: ff_region_offset2size(g); yading@10: ff_compute_band_indexes(s, g); yading@10: yading@10: g->preflag = 0; yading@10: if (!s->lsf) yading@10: g->preflag = get_bits1(&s->gb); yading@10: g->scalefac_scale = get_bits1(&s->gb); yading@10: g->count1table_select = get_bits1(&s->gb); yading@10: av_dlog(s->avctx, "block_type=%d switch_point=%d\n", yading@10: g->block_type, g->switch_point); yading@10: } yading@10: } yading@10: yading@10: if (!s->adu_mode) { yading@10: int skip; yading@10: const uint8_t *ptr = s->gb.buffer + (get_bits_count(&s->gb)>>3); yading@10: int extrasize = av_clip(get_bits_left(&s->gb) >> 3, 0, EXTRABYTES); yading@10: av_assert1((get_bits_count(&s->gb) & 7) == 0); yading@10: /* now we get bits from the main_data_begin offset */ yading@10: av_dlog(s->avctx, "seekback:%d, lastbuf:%d\n", yading@10: main_data_begin, s->last_buf_size); yading@10: yading@10: memcpy(s->last_buf + s->last_buf_size, ptr, extrasize); yading@10: s->in_gb = s->gb; yading@10: init_get_bits(&s->gb, s->last_buf, s->last_buf_size*8); yading@10: #if !UNCHECKED_BITSTREAM_READER yading@10: s->gb.size_in_bits_plus8 += FFMAX(extrasize, LAST_BUF_SIZE - s->last_buf_size) * 8; yading@10: #endif yading@10: s->last_buf_size <<= 3; yading@10: for (gr = 0; gr < nb_granules && (s->last_buf_size >> 3) < main_data_begin; gr++) { yading@10: for (ch = 0; ch < s->nb_channels; ch++) { yading@10: g = &s->granules[ch][gr]; yading@10: s->last_buf_size += g->part2_3_length; yading@10: memset(g->sb_hybrid, 0, sizeof(g->sb_hybrid)); yading@10: compute_imdct(s, g, &s->sb_samples[ch][18 * gr][0], s->mdct_buf[ch]); yading@10: } yading@10: } yading@10: skip = s->last_buf_size - 8 * main_data_begin; yading@10: if (skip >= s->gb.size_in_bits && s->in_gb.buffer) { yading@10: skip_bits_long(&s->in_gb, skip - s->gb.size_in_bits); yading@10: s->gb = s->in_gb; yading@10: s->in_gb.buffer = NULL; yading@10: } else { yading@10: skip_bits_long(&s->gb, skip); yading@10: } yading@10: } else { yading@10: gr = 0; yading@10: } yading@10: yading@10: for (; gr < nb_granules; gr++) { yading@10: for (ch = 0; ch < s->nb_channels; ch++) { yading@10: g = &s->granules[ch][gr]; yading@10: bits_pos = get_bits_count(&s->gb); yading@10: yading@10: if (!s->lsf) { yading@10: uint8_t *sc; yading@10: int slen, slen1, slen2; yading@10: yading@10: /* MPEG1 scale factors */ yading@10: slen1 = slen_table[0][g->scalefac_compress]; yading@10: slen2 = slen_table[1][g->scalefac_compress]; yading@10: av_dlog(s->avctx, "slen1=%d slen2=%d\n", slen1, slen2); yading@10: if (g->block_type == 2) { yading@10: n = g->switch_point ? 17 : 18; yading@10: j = 0; yading@10: if (slen1) { yading@10: for (i = 0; i < n; i++) yading@10: g->scale_factors[j++] = get_bits(&s->gb, slen1); yading@10: } else { yading@10: for (i = 0; i < n; i++) yading@10: g->scale_factors[j++] = 0; yading@10: } yading@10: if (slen2) { yading@10: for (i = 0; i < 18; i++) yading@10: g->scale_factors[j++] = get_bits(&s->gb, slen2); yading@10: for (i = 0; i < 3; i++) yading@10: g->scale_factors[j++] = 0; yading@10: } else { yading@10: for (i = 0; i < 21; i++) yading@10: g->scale_factors[j++] = 0; yading@10: } yading@10: } else { yading@10: sc = s->granules[ch][0].scale_factors; yading@10: j = 0; yading@10: for (k = 0; k < 4; k++) { yading@10: n = k == 0 ? 6 : 5; yading@10: if ((g->scfsi & (0x8 >> k)) == 0) { yading@10: slen = (k < 2) ? slen1 : slen2; yading@10: if (slen) { yading@10: for (i = 0; i < n; i++) yading@10: g->scale_factors[j++] = get_bits(&s->gb, slen); yading@10: } else { yading@10: for (i = 0; i < n; i++) yading@10: g->scale_factors[j++] = 0; yading@10: } yading@10: } else { yading@10: /* simply copy from last granule */ yading@10: for (i = 0; i < n; i++) { yading@10: g->scale_factors[j] = sc[j]; yading@10: j++; yading@10: } yading@10: } yading@10: } yading@10: g->scale_factors[j++] = 0; yading@10: } yading@10: } else { yading@10: int tindex, tindex2, slen[4], sl, sf; yading@10: yading@10: /* LSF scale factors */ yading@10: if (g->block_type == 2) yading@10: tindex = g->switch_point ? 2 : 1; yading@10: else yading@10: tindex = 0; yading@10: yading@10: sf = g->scalefac_compress; yading@10: if ((s->mode_ext & MODE_EXT_I_STEREO) && ch == 1) { yading@10: /* intensity stereo case */ yading@10: sf >>= 1; yading@10: if (sf < 180) { yading@10: lsf_sf_expand(slen, sf, 6, 6, 0); yading@10: tindex2 = 3; yading@10: } else if (sf < 244) { yading@10: lsf_sf_expand(slen, sf - 180, 4, 4, 0); yading@10: tindex2 = 4; yading@10: } else { yading@10: lsf_sf_expand(slen, sf - 244, 3, 0, 0); yading@10: tindex2 = 5; yading@10: } yading@10: } else { yading@10: /* normal case */ yading@10: if (sf < 400) { yading@10: lsf_sf_expand(slen, sf, 5, 4, 4); yading@10: tindex2 = 0; yading@10: } else if (sf < 500) { yading@10: lsf_sf_expand(slen, sf - 400, 5, 4, 0); yading@10: tindex2 = 1; yading@10: } else { yading@10: lsf_sf_expand(slen, sf - 500, 3, 0, 0); yading@10: tindex2 = 2; yading@10: g->preflag = 1; yading@10: } yading@10: } yading@10: yading@10: j = 0; yading@10: for (k = 0; k < 4; k++) { yading@10: n = lsf_nsf_table[tindex2][tindex][k]; yading@10: sl = slen[k]; yading@10: if (sl) { yading@10: for (i = 0; i < n; i++) yading@10: g->scale_factors[j++] = get_bits(&s->gb, sl); yading@10: } else { yading@10: for (i = 0; i < n; i++) yading@10: g->scale_factors[j++] = 0; yading@10: } yading@10: } yading@10: /* XXX: should compute exact size */ yading@10: for (; j < 40; j++) yading@10: g->scale_factors[j] = 0; yading@10: } yading@10: yading@10: exponents_from_scale_factors(s, g, exponents); yading@10: yading@10: /* read Huffman coded residue */ yading@10: huffman_decode(s, g, exponents, bits_pos + g->part2_3_length); yading@10: } /* ch */ yading@10: yading@10: if (s->mode == MPA_JSTEREO) yading@10: compute_stereo(s, &s->granules[0][gr], &s->granules[1][gr]); yading@10: yading@10: for (ch = 0; ch < s->nb_channels; ch++) { yading@10: g = &s->granules[ch][gr]; yading@10: yading@10: reorder_block(s, g); yading@10: compute_antialias(s, g); yading@10: compute_imdct(s, g, &s->sb_samples[ch][18 * gr][0], s->mdct_buf[ch]); yading@10: } yading@10: } /* gr */ yading@10: if (get_bits_count(&s->gb) < 0) yading@10: skip_bits_long(&s->gb, -get_bits_count(&s->gb)); yading@10: return nb_granules * 18; yading@10: } yading@10: yading@10: static int mp_decode_frame(MPADecodeContext *s, OUT_INT **samples, yading@10: const uint8_t *buf, int buf_size) yading@10: { yading@10: int i, nb_frames, ch, ret; yading@10: OUT_INT *samples_ptr; yading@10: yading@10: init_get_bits(&s->gb, buf + HEADER_SIZE, (buf_size - HEADER_SIZE) * 8); yading@10: yading@10: /* skip error protection field */ yading@10: if (s->error_protection) yading@10: skip_bits(&s->gb, 16); yading@10: yading@10: switch(s->layer) { yading@10: case 1: yading@10: s->avctx->frame_size = 384; yading@10: nb_frames = mp_decode_layer1(s); yading@10: break; yading@10: case 2: yading@10: s->avctx->frame_size = 1152; yading@10: nb_frames = mp_decode_layer2(s); yading@10: break; yading@10: case 3: yading@10: s->avctx->frame_size = s->lsf ? 576 : 1152; yading@10: default: yading@10: nb_frames = mp_decode_layer3(s); yading@10: yading@10: s->last_buf_size=0; yading@10: if (s->in_gb.buffer) { yading@10: align_get_bits(&s->gb); yading@10: i = get_bits_left(&s->gb)>>3; yading@10: if (i >= 0 && i <= BACKSTEP_SIZE) { yading@10: memmove(s->last_buf, s->gb.buffer + (get_bits_count(&s->gb)>>3), i); yading@10: s->last_buf_size=i; yading@10: } else yading@10: av_log(s->avctx, AV_LOG_ERROR, "invalid old backstep %d\n", i); yading@10: s->gb = s->in_gb; yading@10: s->in_gb.buffer = NULL; yading@10: } yading@10: yading@10: align_get_bits(&s->gb); yading@10: av_assert1((get_bits_count(&s->gb) & 7) == 0); yading@10: i = get_bits_left(&s->gb) >> 3; yading@10: yading@10: if (i < 0 || i > BACKSTEP_SIZE || nb_frames < 0) { yading@10: if (i < 0) yading@10: av_log(s->avctx, AV_LOG_ERROR, "invalid new backstep %d\n", i); yading@10: i = FFMIN(BACKSTEP_SIZE, buf_size - HEADER_SIZE); yading@10: } yading@10: av_assert1(i <= buf_size - HEADER_SIZE && i >= 0); yading@10: memcpy(s->last_buf + s->last_buf_size, s->gb.buffer + buf_size - HEADER_SIZE - i, i); yading@10: s->last_buf_size += i; yading@10: } yading@10: yading@10: if(nb_frames < 0) yading@10: return nb_frames; yading@10: yading@10: /* get output buffer */ yading@10: if (!samples) { yading@10: av_assert0(s->frame != NULL); yading@10: s->frame->nb_samples = s->avctx->frame_size; yading@10: if ((ret = ff_get_buffer(s->avctx, s->frame, 0)) < 0) yading@10: return ret; yading@10: samples = (OUT_INT **)s->frame->extended_data; yading@10: } yading@10: yading@10: /* apply the synthesis filter */ yading@10: for (ch = 0; ch < s->nb_channels; ch++) { yading@10: int sample_stride; yading@10: if (s->avctx->sample_fmt == OUT_FMT_P) { yading@10: samples_ptr = samples[ch]; yading@10: sample_stride = 1; yading@10: } else { yading@10: samples_ptr = samples[0] + ch; yading@10: sample_stride = s->nb_channels; yading@10: } yading@10: for (i = 0; i < nb_frames; i++) { yading@10: RENAME(ff_mpa_synth_filter)(&s->mpadsp, s->synth_buf[ch], yading@10: &(s->synth_buf_offset[ch]), yading@10: RENAME(ff_mpa_synth_window), yading@10: &s->dither_state, samples_ptr, yading@10: sample_stride, s->sb_samples[ch][i]); yading@10: samples_ptr += 32 * sample_stride; yading@10: } yading@10: } yading@10: yading@10: return nb_frames * 32 * sizeof(OUT_INT) * s->nb_channels; yading@10: } yading@10: yading@10: static int decode_frame(AVCodecContext * avctx, void *data, int *got_frame_ptr, yading@10: AVPacket *avpkt) yading@10: { yading@10: const uint8_t *buf = avpkt->data; yading@10: int buf_size = avpkt->size; yading@10: MPADecodeContext *s = avctx->priv_data; yading@10: uint32_t header; yading@10: int ret; yading@10: yading@10: while(buf_size && !*buf){ yading@10: buf++; yading@10: buf_size--; yading@10: } yading@10: yading@10: if (buf_size < HEADER_SIZE) yading@10: return AVERROR_INVALIDDATA; yading@10: yading@10: header = AV_RB32(buf); yading@10: if (header>>8 == AV_RB32("TAG")>>8) { yading@10: av_log(avctx, AV_LOG_DEBUG, "discarding ID3 tag\n"); yading@10: return buf_size; yading@10: } yading@10: if (ff_mpa_check_header(header) < 0) { yading@10: av_log(avctx, AV_LOG_ERROR, "Header missing\n"); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: yading@10: if (avpriv_mpegaudio_decode_header((MPADecodeHeader *)s, header) == 1) { yading@10: /* free format: prepare to compute frame size */ yading@10: s->frame_size = -1; yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: /* update codec info */ yading@10: avctx->channels = s->nb_channels; yading@10: avctx->channel_layout = s->nb_channels == 1 ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO; yading@10: if (!avctx->bit_rate) yading@10: avctx->bit_rate = s->bit_rate; yading@10: yading@10: if (s->frame_size <= 0 || s->frame_size > buf_size) { yading@10: av_log(avctx, AV_LOG_ERROR, "incomplete frame\n"); yading@10: return AVERROR_INVALIDDATA; yading@10: } else if (s->frame_size < buf_size) { yading@10: av_log(avctx, AV_LOG_DEBUG, "incorrect frame size - multiple frames in buffer?\n"); yading@10: buf_size= s->frame_size; yading@10: } yading@10: yading@10: s->frame = data; yading@10: yading@10: ret = mp_decode_frame(s, NULL, buf, buf_size); yading@10: if (ret >= 0) { yading@10: s->frame->nb_samples = avctx->frame_size; yading@10: *got_frame_ptr = 1; yading@10: avctx->sample_rate = s->sample_rate; yading@10: //FIXME maybe move the other codec info stuff from above here too yading@10: } else { yading@10: av_log(avctx, AV_LOG_ERROR, "Error while decoding MPEG audio frame.\n"); yading@10: /* Only return an error if the bad frame makes up the whole packet or yading@10: * the error is related to buffer management. yading@10: * If there is more data in the packet, just consume the bad frame yading@10: * instead of returning an error, which would discard the whole yading@10: * packet. */ yading@10: *got_frame_ptr = 0; yading@10: if (buf_size == avpkt->size || ret != AVERROR_INVALIDDATA) yading@10: return ret; yading@10: } yading@10: s->frame_size = 0; yading@10: return buf_size; yading@10: } yading@10: yading@10: static void mp_flush(MPADecodeContext *ctx) yading@10: { yading@10: memset(ctx->synth_buf, 0, sizeof(ctx->synth_buf)); yading@10: ctx->last_buf_size = 0; yading@10: } yading@10: yading@10: static void flush(AVCodecContext *avctx) yading@10: { yading@10: mp_flush(avctx->priv_data); yading@10: } yading@10: yading@10: #if CONFIG_MP3ADU_DECODER || CONFIG_MP3ADUFLOAT_DECODER yading@10: static int decode_frame_adu(AVCodecContext *avctx, void *data, yading@10: int *got_frame_ptr, AVPacket *avpkt) yading@10: { yading@10: const uint8_t *buf = avpkt->data; yading@10: int buf_size = avpkt->size; yading@10: MPADecodeContext *s = avctx->priv_data; yading@10: uint32_t header; yading@10: int len, ret; yading@10: int av_unused out_size; yading@10: yading@10: len = buf_size; yading@10: yading@10: // Discard too short frames yading@10: if (buf_size < HEADER_SIZE) { yading@10: av_log(avctx, AV_LOG_ERROR, "Packet is too small\n"); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: yading@10: yading@10: if (len > MPA_MAX_CODED_FRAME_SIZE) yading@10: len = MPA_MAX_CODED_FRAME_SIZE; yading@10: yading@10: // Get header and restore sync word yading@10: header = AV_RB32(buf) | 0xffe00000; yading@10: yading@10: if (ff_mpa_check_header(header) < 0) { // Bad header, discard frame yading@10: av_log(avctx, AV_LOG_ERROR, "Invalid frame header\n"); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: yading@10: avpriv_mpegaudio_decode_header((MPADecodeHeader *)s, header); yading@10: /* update codec info */ yading@10: avctx->sample_rate = s->sample_rate; yading@10: avctx->channels = s->nb_channels; yading@10: if (!avctx->bit_rate) yading@10: avctx->bit_rate = s->bit_rate; yading@10: yading@10: s->frame_size = len; yading@10: yading@10: s->frame = data; yading@10: yading@10: ret = mp_decode_frame(s, NULL, buf, buf_size); yading@10: if (ret < 0) { yading@10: av_log(avctx, AV_LOG_ERROR, "Error while decoding MPEG audio frame.\n"); yading@10: return ret; yading@10: } yading@10: yading@10: *got_frame_ptr = 1; yading@10: yading@10: return buf_size; yading@10: } yading@10: #endif /* CONFIG_MP3ADU_DECODER || CONFIG_MP3ADUFLOAT_DECODER */ yading@10: yading@10: #if CONFIG_MP3ON4_DECODER || CONFIG_MP3ON4FLOAT_DECODER yading@10: yading@10: /** yading@10: * Context for MP3On4 decoder yading@10: */ yading@10: typedef struct MP3On4DecodeContext { yading@10: int frames; ///< number of mp3 frames per block (number of mp3 decoder instances) yading@10: int syncword; ///< syncword patch yading@10: const uint8_t *coff; ///< channel offsets in output buffer yading@10: MPADecodeContext *mp3decctx[5]; ///< MPADecodeContext for every decoder instance yading@10: } MP3On4DecodeContext; yading@10: yading@10: #include "mpeg4audio.h" yading@10: yading@10: /* Next 3 arrays are indexed by channel config number (passed via codecdata) */ yading@10: yading@10: /* number of mp3 decoder instances */ yading@10: static const uint8_t mp3Frames[8] = { 0, 1, 1, 2, 3, 3, 4, 5 }; yading@10: yading@10: /* offsets into output buffer, assume output order is FL FR C LFE BL BR SL SR */ yading@10: static const uint8_t chan_offset[8][5] = { yading@10: { 0 }, yading@10: { 0 }, // C yading@10: { 0 }, // FLR yading@10: { 2, 0 }, // C FLR yading@10: { 2, 0, 3 }, // C FLR BS yading@10: { 2, 0, 3 }, // C FLR BLRS yading@10: { 2, 0, 4, 3 }, // C FLR BLRS LFE yading@10: { 2, 0, 6, 4, 3 }, // C FLR BLRS BLR LFE yading@10: }; yading@10: yading@10: /* mp3on4 channel layouts */ yading@10: static const int16_t chan_layout[8] = { yading@10: 0, yading@10: AV_CH_LAYOUT_MONO, yading@10: AV_CH_LAYOUT_STEREO, yading@10: AV_CH_LAYOUT_SURROUND, yading@10: AV_CH_LAYOUT_4POINT0, yading@10: AV_CH_LAYOUT_5POINT0, yading@10: AV_CH_LAYOUT_5POINT1, yading@10: AV_CH_LAYOUT_7POINT1 yading@10: }; yading@10: yading@10: static av_cold int decode_close_mp3on4(AVCodecContext * avctx) yading@10: { yading@10: MP3On4DecodeContext *s = avctx->priv_data; yading@10: int i; yading@10: yading@10: for (i = 0; i < s->frames; i++) yading@10: av_free(s->mp3decctx[i]); yading@10: yading@10: return 0; yading@10: } yading@10: yading@10: yading@10: static int decode_init_mp3on4(AVCodecContext * avctx) yading@10: { yading@10: MP3On4DecodeContext *s = avctx->priv_data; yading@10: MPEG4AudioConfig cfg; yading@10: int i; yading@10: yading@10: if ((avctx->extradata_size < 2) || (avctx->extradata == NULL)) { yading@10: av_log(avctx, AV_LOG_ERROR, "Codec extradata missing or too short.\n"); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: yading@10: avpriv_mpeg4audio_get_config(&cfg, avctx->extradata, yading@10: avctx->extradata_size * 8, 1); yading@10: if (!cfg.chan_config || cfg.chan_config > 7) { yading@10: av_log(avctx, AV_LOG_ERROR, "Invalid channel config number.\n"); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: s->frames = mp3Frames[cfg.chan_config]; yading@10: s->coff = chan_offset[cfg.chan_config]; yading@10: avctx->channels = ff_mpeg4audio_channels[cfg.chan_config]; yading@10: avctx->channel_layout = chan_layout[cfg.chan_config]; yading@10: yading@10: if (cfg.sample_rate < 16000) yading@10: s->syncword = 0xffe00000; yading@10: else yading@10: s->syncword = 0xfff00000; yading@10: yading@10: /* Init the first mp3 decoder in standard way, so that all tables get builded yading@10: * We replace avctx->priv_data with the context of the first decoder so that yading@10: * decode_init() does not have to be changed. yading@10: * Other decoders will be initialized here copying data from the first context yading@10: */ yading@10: // Allocate zeroed memory for the first decoder context yading@10: s->mp3decctx[0] = av_mallocz(sizeof(MPADecodeContext)); yading@10: if (!s->mp3decctx[0]) yading@10: goto alloc_fail; yading@10: // Put decoder context in place to make init_decode() happy yading@10: avctx->priv_data = s->mp3decctx[0]; yading@10: decode_init(avctx); yading@10: // Restore mp3on4 context pointer yading@10: avctx->priv_data = s; yading@10: s->mp3decctx[0]->adu_mode = 1; // Set adu mode yading@10: yading@10: /* Create a separate codec/context for each frame (first is already ok). yading@10: * Each frame is 1 or 2 channels - up to 5 frames allowed yading@10: */ yading@10: for (i = 1; i < s->frames; i++) { yading@10: s->mp3decctx[i] = av_mallocz(sizeof(MPADecodeContext)); yading@10: if (!s->mp3decctx[i]) yading@10: goto alloc_fail; yading@10: s->mp3decctx[i]->adu_mode = 1; yading@10: s->mp3decctx[i]->avctx = avctx; yading@10: s->mp3decctx[i]->mpadsp = s->mp3decctx[0]->mpadsp; yading@10: } yading@10: yading@10: return 0; yading@10: alloc_fail: yading@10: decode_close_mp3on4(avctx); yading@10: return AVERROR(ENOMEM); yading@10: } yading@10: yading@10: yading@10: static void flush_mp3on4(AVCodecContext *avctx) yading@10: { yading@10: int i; yading@10: MP3On4DecodeContext *s = avctx->priv_data; yading@10: yading@10: for (i = 0; i < s->frames; i++) yading@10: mp_flush(s->mp3decctx[i]); yading@10: } yading@10: yading@10: yading@10: static int decode_frame_mp3on4(AVCodecContext *avctx, void *data, yading@10: int *got_frame_ptr, AVPacket *avpkt) yading@10: { yading@10: AVFrame *frame = data; yading@10: const uint8_t *buf = avpkt->data; yading@10: int buf_size = avpkt->size; yading@10: MP3On4DecodeContext *s = avctx->priv_data; yading@10: MPADecodeContext *m; yading@10: int fsize, len = buf_size, out_size = 0; yading@10: uint32_t header; yading@10: OUT_INT **out_samples; yading@10: OUT_INT *outptr[2]; yading@10: int fr, ch, ret; yading@10: yading@10: /* get output buffer */ yading@10: frame->nb_samples = MPA_FRAME_SIZE; yading@10: if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) yading@10: return ret; yading@10: out_samples = (OUT_INT **)frame->extended_data; yading@10: yading@10: // Discard too short frames yading@10: if (buf_size < HEADER_SIZE) yading@10: return AVERROR_INVALIDDATA; yading@10: yading@10: avctx->bit_rate = 0; yading@10: yading@10: ch = 0; yading@10: for (fr = 0; fr < s->frames; fr++) { yading@10: fsize = AV_RB16(buf) >> 4; yading@10: fsize = FFMIN3(fsize, len, MPA_MAX_CODED_FRAME_SIZE); yading@10: m = s->mp3decctx[fr]; yading@10: av_assert1(m); yading@10: yading@10: if (fsize < HEADER_SIZE) { yading@10: av_log(avctx, AV_LOG_ERROR, "Frame size smaller than header size\n"); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: header = (AV_RB32(buf) & 0x000fffff) | s->syncword; // patch header yading@10: yading@10: if (ff_mpa_check_header(header) < 0) // Bad header, discard block yading@10: break; yading@10: yading@10: avpriv_mpegaudio_decode_header((MPADecodeHeader *)m, header); yading@10: yading@10: if (ch + m->nb_channels > avctx->channels || s->coff[fr] + m->nb_channels > avctx->channels) { yading@10: av_log(avctx, AV_LOG_ERROR, "frame channel count exceeds codec " yading@10: "channel count\n"); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: ch += m->nb_channels; yading@10: yading@10: outptr[0] = out_samples[s->coff[fr]]; yading@10: if (m->nb_channels > 1) yading@10: outptr[1] = out_samples[s->coff[fr] + 1]; yading@10: yading@10: if ((ret = mp_decode_frame(m, outptr, buf, fsize)) < 0) yading@10: return ret; yading@10: yading@10: out_size += ret; yading@10: buf += fsize; yading@10: len -= fsize; yading@10: yading@10: avctx->bit_rate += m->bit_rate; yading@10: } yading@10: yading@10: /* update codec info */ yading@10: avctx->sample_rate = s->mp3decctx[0]->sample_rate; yading@10: yading@10: frame->nb_samples = out_size / (avctx->channels * sizeof(OUT_INT)); yading@10: *got_frame_ptr = 1; yading@10: yading@10: return buf_size; yading@10: } yading@10: #endif /* CONFIG_MP3ON4_DECODER || CONFIG_MP3ON4FLOAT_DECODER */ yading@10: yading@10: #if !CONFIG_FLOAT yading@10: #if CONFIG_MP1_DECODER yading@10: AVCodec ff_mp1_decoder = { yading@10: .name = "mp1", yading@10: .type = AVMEDIA_TYPE_AUDIO, yading@10: .id = AV_CODEC_ID_MP1, yading@10: .priv_data_size = sizeof(MPADecodeContext), yading@10: .init = decode_init, yading@10: .decode = decode_frame, yading@10: .capabilities = CODEC_CAP_DR1, yading@10: .flush = flush, yading@10: .long_name = NULL_IF_CONFIG_SMALL("MP1 (MPEG audio layer 1)"), yading@10: .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P, yading@10: AV_SAMPLE_FMT_S16, yading@10: AV_SAMPLE_FMT_NONE }, yading@10: }; yading@10: #endif yading@10: #if CONFIG_MP2_DECODER yading@10: AVCodec ff_mp2_decoder = { yading@10: .name = "mp2", yading@10: .type = AVMEDIA_TYPE_AUDIO, yading@10: .id = AV_CODEC_ID_MP2, yading@10: .priv_data_size = sizeof(MPADecodeContext), yading@10: .init = decode_init, yading@10: .decode = decode_frame, yading@10: .capabilities = CODEC_CAP_DR1, yading@10: .flush = flush, yading@10: .long_name = NULL_IF_CONFIG_SMALL("MP2 (MPEG audio layer 2)"), yading@10: .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P, yading@10: AV_SAMPLE_FMT_S16, yading@10: AV_SAMPLE_FMT_NONE }, yading@10: }; yading@10: #endif yading@10: #if CONFIG_MP3_DECODER yading@10: AVCodec ff_mp3_decoder = { yading@10: .name = "mp3", yading@10: .type = AVMEDIA_TYPE_AUDIO, yading@10: .id = AV_CODEC_ID_MP3, yading@10: .priv_data_size = sizeof(MPADecodeContext), yading@10: .init = decode_init, yading@10: .decode = decode_frame, yading@10: .capabilities = CODEC_CAP_DR1, yading@10: .flush = flush, yading@10: .long_name = NULL_IF_CONFIG_SMALL("MP3 (MPEG audio layer 3)"), yading@10: .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P, yading@10: AV_SAMPLE_FMT_S16, yading@10: AV_SAMPLE_FMT_NONE }, yading@10: }; yading@10: #endif yading@10: #if CONFIG_MP3ADU_DECODER yading@10: AVCodec ff_mp3adu_decoder = { yading@10: .name = "mp3adu", yading@10: .type = AVMEDIA_TYPE_AUDIO, yading@10: .id = AV_CODEC_ID_MP3ADU, yading@10: .priv_data_size = sizeof(MPADecodeContext), yading@10: .init = decode_init, yading@10: .decode = decode_frame_adu, yading@10: .capabilities = CODEC_CAP_DR1, yading@10: .flush = flush, yading@10: .long_name = NULL_IF_CONFIG_SMALL("ADU (Application Data Unit) MP3 (MPEG audio layer 3)"), yading@10: .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P, yading@10: AV_SAMPLE_FMT_S16, yading@10: AV_SAMPLE_FMT_NONE }, yading@10: }; yading@10: #endif yading@10: #if CONFIG_MP3ON4_DECODER yading@10: AVCodec ff_mp3on4_decoder = { yading@10: .name = "mp3on4", yading@10: .type = AVMEDIA_TYPE_AUDIO, yading@10: .id = AV_CODEC_ID_MP3ON4, yading@10: .priv_data_size = sizeof(MP3On4DecodeContext), yading@10: .init = decode_init_mp3on4, yading@10: .close = decode_close_mp3on4, yading@10: .decode = decode_frame_mp3on4, yading@10: .capabilities = CODEC_CAP_DR1, yading@10: .flush = flush_mp3on4, yading@10: .long_name = NULL_IF_CONFIG_SMALL("MP3onMP4"), yading@10: .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P, yading@10: AV_SAMPLE_FMT_NONE }, yading@10: }; yading@10: #endif yading@10: #endif