1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * MPEG Audio decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2001, 2002 Fabrice Bellard 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * MPEG Audio decoder 25cabdff1aSopenharmony_ci */ 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include "config_components.h" 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 30cabdff1aSopenharmony_ci#include "libavutil/avassert.h" 31cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 32cabdff1aSopenharmony_ci#include "libavutil/crc.h" 33cabdff1aSopenharmony_ci#include "libavutil/float_dsp.h" 34cabdff1aSopenharmony_ci#include "libavutil/libm.h" 35cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 36cabdff1aSopenharmony_ci#include "libavutil/thread.h" 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci#include "avcodec.h" 39cabdff1aSopenharmony_ci#include "get_bits.h" 40cabdff1aSopenharmony_ci#include "internal.h" 41cabdff1aSopenharmony_ci#include "mathops.h" 42cabdff1aSopenharmony_ci#include "mpegaudiodsp.h" 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci/* 45cabdff1aSopenharmony_ci * TODO: 46cabdff1aSopenharmony_ci * - test lsf / mpeg25 extensively. 47cabdff1aSopenharmony_ci */ 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_ci#include "mpegaudio.h" 50cabdff1aSopenharmony_ci#include "mpegaudiodecheader.h" 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_ci#define BACKSTEP_SIZE 512 53cabdff1aSopenharmony_ci#define EXTRABYTES 24 54cabdff1aSopenharmony_ci#define LAST_BUF_SIZE 2 * BACKSTEP_SIZE + EXTRABYTES 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_ci/* layer 3 "granule" */ 57cabdff1aSopenharmony_citypedef struct GranuleDef { 58cabdff1aSopenharmony_ci uint8_t scfsi; 59cabdff1aSopenharmony_ci int part2_3_length; 60cabdff1aSopenharmony_ci int big_values; 61cabdff1aSopenharmony_ci int global_gain; 62cabdff1aSopenharmony_ci int scalefac_compress; 63cabdff1aSopenharmony_ci uint8_t block_type; 64cabdff1aSopenharmony_ci uint8_t switch_point; 65cabdff1aSopenharmony_ci int table_select[3]; 66cabdff1aSopenharmony_ci int subblock_gain[3]; 67cabdff1aSopenharmony_ci uint8_t scalefac_scale; 68cabdff1aSopenharmony_ci uint8_t count1table_select; 69cabdff1aSopenharmony_ci int region_size[3]; /* number of huffman codes in each region */ 70cabdff1aSopenharmony_ci int preflag; 71cabdff1aSopenharmony_ci int short_start, long_end; /* long/short band indexes */ 72cabdff1aSopenharmony_ci uint8_t scale_factors[40]; 73cabdff1aSopenharmony_ci DECLARE_ALIGNED(16, INTFLOAT, sb_hybrid)[SBLIMIT * 18]; /* 576 samples */ 74cabdff1aSopenharmony_ci} GranuleDef; 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_citypedef struct MPADecodeContext { 77cabdff1aSopenharmony_ci MPA_DECODE_HEADER 78cabdff1aSopenharmony_ci uint8_t last_buf[LAST_BUF_SIZE]; 79cabdff1aSopenharmony_ci int last_buf_size; 80cabdff1aSopenharmony_ci int extrasize; 81cabdff1aSopenharmony_ci /* next header (used in free format parsing) */ 82cabdff1aSopenharmony_ci uint32_t free_format_next_header; 83cabdff1aSopenharmony_ci GetBitContext gb; 84cabdff1aSopenharmony_ci GetBitContext in_gb; 85cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, MPA_INT, synth_buf)[MPA_MAX_CHANNELS][512 * 2]; 86cabdff1aSopenharmony_ci int synth_buf_offset[MPA_MAX_CHANNELS]; 87cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, INTFLOAT, sb_samples)[MPA_MAX_CHANNELS][36][SBLIMIT]; 88cabdff1aSopenharmony_ci INTFLOAT mdct_buf[MPA_MAX_CHANNELS][SBLIMIT * 18]; /* previous samples, for layer 3 MDCT */ 89cabdff1aSopenharmony_ci GranuleDef granules[2][2]; /* Used in Layer 3 */ 90cabdff1aSopenharmony_ci int adu_mode; ///< 0 for standard mp3, 1 for adu formatted mp3 91cabdff1aSopenharmony_ci int dither_state; 92cabdff1aSopenharmony_ci int err_recognition; 93cabdff1aSopenharmony_ci AVCodecContext* avctx; 94cabdff1aSopenharmony_ci MPADSPContext mpadsp; 95cabdff1aSopenharmony_ci void (*butterflies_float)(float *av_restrict v1, float *av_restrict v2, int len); 96cabdff1aSopenharmony_ci AVFrame *frame; 97cabdff1aSopenharmony_ci uint32_t crc; 98cabdff1aSopenharmony_ci} MPADecodeContext; 99cabdff1aSopenharmony_ci 100cabdff1aSopenharmony_ci#define HEADER_SIZE 4 101cabdff1aSopenharmony_ci 102cabdff1aSopenharmony_ci#include "mpegaudiodata.h" 103cabdff1aSopenharmony_ci 104cabdff1aSopenharmony_ci#include "mpegaudio_tablegen.h" 105cabdff1aSopenharmony_ci/* intensity stereo coef table */ 106cabdff1aSopenharmony_cistatic INTFLOAT is_table_lsf[2][2][16]; 107cabdff1aSopenharmony_ci 108cabdff1aSopenharmony_ci/* [i][j]: 2^(-j/3) * FRAC_ONE * 2^(i+2) / (2^(i+2) - 1) */ 109cabdff1aSopenharmony_cistatic int32_t scale_factor_mult[15][3]; 110cabdff1aSopenharmony_ci/* mult table for layer 2 group quantization */ 111cabdff1aSopenharmony_ci 112cabdff1aSopenharmony_ci#define SCALE_GEN(v) \ 113cabdff1aSopenharmony_ci{ FIXR_OLD(1.0 * (v)), FIXR_OLD(0.7937005259 * (v)), FIXR_OLD(0.6299605249 * (v)) } 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_cistatic const int32_t scale_factor_mult2[3][3] = { 116cabdff1aSopenharmony_ci SCALE_GEN(4.0 / 3.0), /* 3 steps */ 117cabdff1aSopenharmony_ci SCALE_GEN(4.0 / 5.0), /* 5 steps */ 118cabdff1aSopenharmony_ci SCALE_GEN(4.0 / 9.0), /* 9 steps */ 119cabdff1aSopenharmony_ci}; 120cabdff1aSopenharmony_ci 121cabdff1aSopenharmony_ci/** 122cabdff1aSopenharmony_ci * Convert region offsets to region sizes and truncate 123cabdff1aSopenharmony_ci * size to big_values. 124cabdff1aSopenharmony_ci */ 125cabdff1aSopenharmony_cistatic void region_offset2size(GranuleDef *g) 126cabdff1aSopenharmony_ci{ 127cabdff1aSopenharmony_ci int i, k, j = 0; 128cabdff1aSopenharmony_ci g->region_size[2] = 576 / 2; 129cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) { 130cabdff1aSopenharmony_ci k = FFMIN(g->region_size[i], g->big_values); 131cabdff1aSopenharmony_ci g->region_size[i] = k - j; 132cabdff1aSopenharmony_ci j = k; 133cabdff1aSopenharmony_ci } 134cabdff1aSopenharmony_ci} 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_cistatic void init_short_region(MPADecodeContext *s, GranuleDef *g) 137cabdff1aSopenharmony_ci{ 138cabdff1aSopenharmony_ci if (g->block_type == 2) { 139cabdff1aSopenharmony_ci if (s->sample_rate_index != 8) 140cabdff1aSopenharmony_ci g->region_size[0] = (36 / 2); 141cabdff1aSopenharmony_ci else 142cabdff1aSopenharmony_ci g->region_size[0] = (72 / 2); 143cabdff1aSopenharmony_ci } else { 144cabdff1aSopenharmony_ci if (s->sample_rate_index <= 2) 145cabdff1aSopenharmony_ci g->region_size[0] = (36 / 2); 146cabdff1aSopenharmony_ci else if (s->sample_rate_index != 8) 147cabdff1aSopenharmony_ci g->region_size[0] = (54 / 2); 148cabdff1aSopenharmony_ci else 149cabdff1aSopenharmony_ci g->region_size[0] = (108 / 2); 150cabdff1aSopenharmony_ci } 151cabdff1aSopenharmony_ci g->region_size[1] = (576 / 2); 152cabdff1aSopenharmony_ci} 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_cistatic void init_long_region(MPADecodeContext *s, GranuleDef *g, 155cabdff1aSopenharmony_ci int ra1, int ra2) 156cabdff1aSopenharmony_ci{ 157cabdff1aSopenharmony_ci int l; 158cabdff1aSopenharmony_ci g->region_size[0] = ff_band_index_long[s->sample_rate_index][ra1 + 1]; 159cabdff1aSopenharmony_ci /* should not overflow */ 160cabdff1aSopenharmony_ci l = FFMIN(ra1 + ra2 + 2, 22); 161cabdff1aSopenharmony_ci g->region_size[1] = ff_band_index_long[s->sample_rate_index][ l]; 162cabdff1aSopenharmony_ci} 163cabdff1aSopenharmony_ci 164cabdff1aSopenharmony_cistatic void compute_band_indexes(MPADecodeContext *s, GranuleDef *g) 165cabdff1aSopenharmony_ci{ 166cabdff1aSopenharmony_ci if (g->block_type == 2) { 167cabdff1aSopenharmony_ci if (g->switch_point) { 168cabdff1aSopenharmony_ci if(s->sample_rate_index == 8) 169cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "switch point in 8khz"); 170cabdff1aSopenharmony_ci /* if switched mode, we handle the 36 first samples as 171cabdff1aSopenharmony_ci long blocks. For 8000Hz, we handle the 72 first 172cabdff1aSopenharmony_ci exponents as long blocks */ 173cabdff1aSopenharmony_ci if (s->sample_rate_index <= 2) 174cabdff1aSopenharmony_ci g->long_end = 8; 175cabdff1aSopenharmony_ci else 176cabdff1aSopenharmony_ci g->long_end = 6; 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ci g->short_start = 3; 179cabdff1aSopenharmony_ci } else { 180cabdff1aSopenharmony_ci g->long_end = 0; 181cabdff1aSopenharmony_ci g->short_start = 0; 182cabdff1aSopenharmony_ci } 183cabdff1aSopenharmony_ci } else { 184cabdff1aSopenharmony_ci g->short_start = 13; 185cabdff1aSopenharmony_ci g->long_end = 22; 186cabdff1aSopenharmony_ci } 187cabdff1aSopenharmony_ci} 188cabdff1aSopenharmony_ci 189cabdff1aSopenharmony_ci/* layer 1 unscaling */ 190cabdff1aSopenharmony_ci/* n = number of bits of the mantissa minus 1 */ 191cabdff1aSopenharmony_cistatic inline int l1_unscale(int n, int mant, int scale_factor) 192cabdff1aSopenharmony_ci{ 193cabdff1aSopenharmony_ci int shift, mod; 194cabdff1aSopenharmony_ci int64_t val; 195cabdff1aSopenharmony_ci 196cabdff1aSopenharmony_ci shift = ff_scale_factor_modshift[scale_factor]; 197cabdff1aSopenharmony_ci mod = shift & 3; 198cabdff1aSopenharmony_ci shift >>= 2; 199cabdff1aSopenharmony_ci val = MUL64((int)(mant + (-1U << n) + 1), scale_factor_mult[n-1][mod]); 200cabdff1aSopenharmony_ci shift += n; 201cabdff1aSopenharmony_ci /* NOTE: at this point, 1 <= shift >= 21 + 15 */ 202cabdff1aSopenharmony_ci return (int)((val + (1LL << (shift - 1))) >> shift); 203cabdff1aSopenharmony_ci} 204cabdff1aSopenharmony_ci 205cabdff1aSopenharmony_cistatic inline int l2_unscale_group(int steps, int mant, int scale_factor) 206cabdff1aSopenharmony_ci{ 207cabdff1aSopenharmony_ci int shift, mod, val; 208cabdff1aSopenharmony_ci 209cabdff1aSopenharmony_ci shift = ff_scale_factor_modshift[scale_factor]; 210cabdff1aSopenharmony_ci mod = shift & 3; 211cabdff1aSopenharmony_ci shift >>= 2; 212cabdff1aSopenharmony_ci 213cabdff1aSopenharmony_ci val = (mant - (steps >> 1)) * scale_factor_mult2[steps >> 2][mod]; 214cabdff1aSopenharmony_ci /* NOTE: at this point, 0 <= shift <= 21 */ 215cabdff1aSopenharmony_ci if (shift > 0) 216cabdff1aSopenharmony_ci val = (val + (1 << (shift - 1))) >> shift; 217cabdff1aSopenharmony_ci return val; 218cabdff1aSopenharmony_ci} 219cabdff1aSopenharmony_ci 220cabdff1aSopenharmony_ci/* compute value^(4/3) * 2^(exponent/4). It normalized to FRAC_BITS */ 221cabdff1aSopenharmony_cistatic inline int l3_unscale(int value, int exponent) 222cabdff1aSopenharmony_ci{ 223cabdff1aSopenharmony_ci unsigned int m; 224cabdff1aSopenharmony_ci int e; 225cabdff1aSopenharmony_ci 226cabdff1aSopenharmony_ci e = ff_table_4_3_exp [4 * value + (exponent & 3)]; 227cabdff1aSopenharmony_ci m = ff_table_4_3_value[4 * value + (exponent & 3)]; 228cabdff1aSopenharmony_ci e -= exponent >> 2; 229cabdff1aSopenharmony_ci#ifdef DEBUG 230cabdff1aSopenharmony_ci if(e < 1) 231cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_WARNING, "l3_unscale: e is %d\n", e); 232cabdff1aSopenharmony_ci#endif 233cabdff1aSopenharmony_ci if (e > (SUINT)31) 234cabdff1aSopenharmony_ci return 0; 235cabdff1aSopenharmony_ci m = (m + ((1U << e) >> 1)) >> e; 236cabdff1aSopenharmony_ci 237cabdff1aSopenharmony_ci return m; 238cabdff1aSopenharmony_ci} 239cabdff1aSopenharmony_ci 240cabdff1aSopenharmony_cistatic av_cold void decode_init_static(void) 241cabdff1aSopenharmony_ci{ 242cabdff1aSopenharmony_ci int i, j; 243cabdff1aSopenharmony_ci 244cabdff1aSopenharmony_ci /* scale factor multiply for layer 1 */ 245cabdff1aSopenharmony_ci for (i = 0; i < 15; i++) { 246cabdff1aSopenharmony_ci int n, norm; 247cabdff1aSopenharmony_ci n = i + 2; 248cabdff1aSopenharmony_ci norm = ((INT64_C(1) << n) * FRAC_ONE) / ((1 << n) - 1); 249cabdff1aSopenharmony_ci scale_factor_mult[i][0] = MULLx(norm, FIXR(1.0 * 2.0), FRAC_BITS); 250cabdff1aSopenharmony_ci scale_factor_mult[i][1] = MULLx(norm, FIXR(0.7937005259 * 2.0), FRAC_BITS); 251cabdff1aSopenharmony_ci scale_factor_mult[i][2] = MULLx(norm, FIXR(0.6299605249 * 2.0), FRAC_BITS); 252cabdff1aSopenharmony_ci ff_dlog(NULL, "%d: norm=%x s=%"PRIx32" %"PRIx32" %"PRIx32"\n", i, 253cabdff1aSopenharmony_ci (unsigned)norm, 254cabdff1aSopenharmony_ci scale_factor_mult[i][0], 255cabdff1aSopenharmony_ci scale_factor_mult[i][1], 256cabdff1aSopenharmony_ci scale_factor_mult[i][2]); 257cabdff1aSopenharmony_ci } 258cabdff1aSopenharmony_ci 259cabdff1aSopenharmony_ci /* compute n ^ (4/3) and store it in mantissa/exp format */ 260cabdff1aSopenharmony_ci 261cabdff1aSopenharmony_ci mpegaudio_tableinit(); 262cabdff1aSopenharmony_ci 263cabdff1aSopenharmony_ci for (i = 0; i < 16; i++) { 264cabdff1aSopenharmony_ci double f; 265cabdff1aSopenharmony_ci int e, k; 266cabdff1aSopenharmony_ci 267cabdff1aSopenharmony_ci for (j = 0; j < 2; j++) { 268cabdff1aSopenharmony_ci e = -(j + 1) * ((i + 1) >> 1); 269cabdff1aSopenharmony_ci f = exp2(e / 4.0); 270cabdff1aSopenharmony_ci k = i & 1; 271cabdff1aSopenharmony_ci is_table_lsf[j][k ^ 1][i] = FIXR(f); 272cabdff1aSopenharmony_ci is_table_lsf[j][k ][i] = FIXR(1.0); 273cabdff1aSopenharmony_ci ff_dlog(NULL, "is_table_lsf %d %d: %f %f\n", 274cabdff1aSopenharmony_ci i, j, (float) is_table_lsf[j][0][i], 275cabdff1aSopenharmony_ci (float) is_table_lsf[j][1][i]); 276cabdff1aSopenharmony_ci } 277cabdff1aSopenharmony_ci } 278cabdff1aSopenharmony_ci RENAME(ff_mpa_synth_init)(); 279cabdff1aSopenharmony_ci ff_mpegaudiodec_common_init_static(); 280cabdff1aSopenharmony_ci} 281cabdff1aSopenharmony_ci 282cabdff1aSopenharmony_cistatic av_cold int decode_init(AVCodecContext * avctx) 283cabdff1aSopenharmony_ci{ 284cabdff1aSopenharmony_ci static AVOnce init_static_once = AV_ONCE_INIT; 285cabdff1aSopenharmony_ci MPADecodeContext *s = avctx->priv_data; 286cabdff1aSopenharmony_ci 287cabdff1aSopenharmony_ci s->avctx = avctx; 288cabdff1aSopenharmony_ci 289cabdff1aSopenharmony_ci#if USE_FLOATS 290cabdff1aSopenharmony_ci { 291cabdff1aSopenharmony_ci AVFloatDSPContext *fdsp; 292cabdff1aSopenharmony_ci fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT); 293cabdff1aSopenharmony_ci if (!fdsp) 294cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 295cabdff1aSopenharmony_ci s->butterflies_float = fdsp->butterflies_float; 296cabdff1aSopenharmony_ci av_free(fdsp); 297cabdff1aSopenharmony_ci } 298cabdff1aSopenharmony_ci#endif 299cabdff1aSopenharmony_ci 300cabdff1aSopenharmony_ci ff_mpadsp_init(&s->mpadsp); 301cabdff1aSopenharmony_ci 302cabdff1aSopenharmony_ci if (avctx->request_sample_fmt == OUT_FMT && 303cabdff1aSopenharmony_ci avctx->codec_id != AV_CODEC_ID_MP3ON4) 304cabdff1aSopenharmony_ci avctx->sample_fmt = OUT_FMT; 305cabdff1aSopenharmony_ci else 306cabdff1aSopenharmony_ci avctx->sample_fmt = OUT_FMT_P; 307cabdff1aSopenharmony_ci s->err_recognition = avctx->err_recognition; 308cabdff1aSopenharmony_ci 309cabdff1aSopenharmony_ci if (avctx->codec_id == AV_CODEC_ID_MP3ADU) 310cabdff1aSopenharmony_ci s->adu_mode = 1; 311cabdff1aSopenharmony_ci 312cabdff1aSopenharmony_ci ff_thread_once(&init_static_once, decode_init_static); 313cabdff1aSopenharmony_ci 314cabdff1aSopenharmony_ci return 0; 315cabdff1aSopenharmony_ci} 316cabdff1aSopenharmony_ci 317cabdff1aSopenharmony_ci#define C3 FIXHR(0.86602540378443864676/2) 318cabdff1aSopenharmony_ci#define C4 FIXHR(0.70710678118654752439/2) //0.5 / cos(pi*(9)/36) 319cabdff1aSopenharmony_ci#define C5 FIXHR(0.51763809020504152469/2) //0.5 / cos(pi*(5)/36) 320cabdff1aSopenharmony_ci#define C6 FIXHR(1.93185165257813657349/4) //0.5 / cos(pi*(15)/36) 321cabdff1aSopenharmony_ci 322cabdff1aSopenharmony_ci/* 12 points IMDCT. We compute it "by hand" by factorizing obvious 323cabdff1aSopenharmony_ci cases. */ 324cabdff1aSopenharmony_cistatic void imdct12(INTFLOAT *out, SUINTFLOAT *in) 325cabdff1aSopenharmony_ci{ 326cabdff1aSopenharmony_ci SUINTFLOAT in0, in1, in2, in3, in4, in5, t1, t2; 327cabdff1aSopenharmony_ci 328cabdff1aSopenharmony_ci in0 = in[0*3]; 329cabdff1aSopenharmony_ci in1 = in[1*3] + in[0*3]; 330cabdff1aSopenharmony_ci in2 = in[2*3] + in[1*3]; 331cabdff1aSopenharmony_ci in3 = in[3*3] + in[2*3]; 332cabdff1aSopenharmony_ci in4 = in[4*3] + in[3*3]; 333cabdff1aSopenharmony_ci in5 = in[5*3] + in[4*3]; 334cabdff1aSopenharmony_ci in5 += in3; 335cabdff1aSopenharmony_ci in3 += in1; 336cabdff1aSopenharmony_ci 337cabdff1aSopenharmony_ci in2 = MULH3(in2, C3, 2); 338cabdff1aSopenharmony_ci in3 = MULH3(in3, C3, 4); 339cabdff1aSopenharmony_ci 340cabdff1aSopenharmony_ci t1 = in0 - in4; 341cabdff1aSopenharmony_ci t2 = MULH3(in1 - in5, C4, 2); 342cabdff1aSopenharmony_ci 343cabdff1aSopenharmony_ci out[ 7] = 344cabdff1aSopenharmony_ci out[10] = t1 + t2; 345cabdff1aSopenharmony_ci out[ 1] = 346cabdff1aSopenharmony_ci out[ 4] = t1 - t2; 347cabdff1aSopenharmony_ci 348cabdff1aSopenharmony_ci in0 += SHR(in4, 1); 349cabdff1aSopenharmony_ci in4 = in0 + in2; 350cabdff1aSopenharmony_ci in5 += 2*in1; 351cabdff1aSopenharmony_ci in1 = MULH3(in5 + in3, C5, 1); 352cabdff1aSopenharmony_ci out[ 8] = 353cabdff1aSopenharmony_ci out[ 9] = in4 + in1; 354cabdff1aSopenharmony_ci out[ 2] = 355cabdff1aSopenharmony_ci out[ 3] = in4 - in1; 356cabdff1aSopenharmony_ci 357cabdff1aSopenharmony_ci in0 -= in2; 358cabdff1aSopenharmony_ci in5 = MULH3(in5 - in3, C6, 2); 359cabdff1aSopenharmony_ci out[ 0] = 360cabdff1aSopenharmony_ci out[ 5] = in0 - in5; 361cabdff1aSopenharmony_ci out[ 6] = 362cabdff1aSopenharmony_ci out[11] = in0 + in5; 363cabdff1aSopenharmony_ci} 364cabdff1aSopenharmony_ci 365cabdff1aSopenharmony_cistatic int handle_crc(MPADecodeContext *s, int sec_len) 366cabdff1aSopenharmony_ci{ 367cabdff1aSopenharmony_ci if (s->error_protection && (s->err_recognition & AV_EF_CRCCHECK)) { 368cabdff1aSopenharmony_ci const uint8_t *buf = s->gb.buffer - HEADER_SIZE; 369cabdff1aSopenharmony_ci int sec_byte_len = sec_len >> 3; 370cabdff1aSopenharmony_ci int sec_rem_bits = sec_len & 7; 371cabdff1aSopenharmony_ci const AVCRC *crc_tab = av_crc_get_table(AV_CRC_16_ANSI); 372cabdff1aSopenharmony_ci uint8_t tmp_buf[4]; 373cabdff1aSopenharmony_ci uint32_t crc_val = av_crc(crc_tab, UINT16_MAX, &buf[2], 2); 374cabdff1aSopenharmony_ci crc_val = av_crc(crc_tab, crc_val, &buf[6], sec_byte_len); 375cabdff1aSopenharmony_ci 376cabdff1aSopenharmony_ci AV_WB32(tmp_buf, 377cabdff1aSopenharmony_ci ((buf[6 + sec_byte_len] & (0xFF00U >> sec_rem_bits)) << 24) + 378cabdff1aSopenharmony_ci ((s->crc << 16) >> sec_rem_bits)); 379cabdff1aSopenharmony_ci 380cabdff1aSopenharmony_ci crc_val = av_crc(crc_tab, crc_val, tmp_buf, 3); 381cabdff1aSopenharmony_ci 382cabdff1aSopenharmony_ci if (crc_val) { 383cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "CRC mismatch %X!\n", crc_val); 384cabdff1aSopenharmony_ci if (s->err_recognition & AV_EF_EXPLODE) 385cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 386cabdff1aSopenharmony_ci } 387cabdff1aSopenharmony_ci } 388cabdff1aSopenharmony_ci return 0; 389cabdff1aSopenharmony_ci} 390cabdff1aSopenharmony_ci 391cabdff1aSopenharmony_ci/* return the number of decoded frames */ 392cabdff1aSopenharmony_cistatic int mp_decode_layer1(MPADecodeContext *s) 393cabdff1aSopenharmony_ci{ 394cabdff1aSopenharmony_ci int bound, i, v, n, ch, j, mant; 395cabdff1aSopenharmony_ci uint8_t allocation[MPA_MAX_CHANNELS][SBLIMIT]; 396cabdff1aSopenharmony_ci uint8_t scale_factors[MPA_MAX_CHANNELS][SBLIMIT]; 397cabdff1aSopenharmony_ci int ret; 398cabdff1aSopenharmony_ci 399cabdff1aSopenharmony_ci ret = handle_crc(s, (s->nb_channels == 1) ? 8*16 : 8*32); 400cabdff1aSopenharmony_ci if (ret < 0) 401cabdff1aSopenharmony_ci return ret; 402cabdff1aSopenharmony_ci 403cabdff1aSopenharmony_ci if (s->mode == MPA_JSTEREO) 404cabdff1aSopenharmony_ci bound = (s->mode_ext + 1) * 4; 405cabdff1aSopenharmony_ci else 406cabdff1aSopenharmony_ci bound = SBLIMIT; 407cabdff1aSopenharmony_ci 408cabdff1aSopenharmony_ci /* allocation bits */ 409cabdff1aSopenharmony_ci for (i = 0; i < bound; i++) { 410cabdff1aSopenharmony_ci for (ch = 0; ch < s->nb_channels; ch++) { 411cabdff1aSopenharmony_ci allocation[ch][i] = get_bits(&s->gb, 4); 412cabdff1aSopenharmony_ci } 413cabdff1aSopenharmony_ci } 414cabdff1aSopenharmony_ci for (i = bound; i < SBLIMIT; i++) 415cabdff1aSopenharmony_ci allocation[0][i] = get_bits(&s->gb, 4); 416cabdff1aSopenharmony_ci 417cabdff1aSopenharmony_ci /* scale factors */ 418cabdff1aSopenharmony_ci for (i = 0; i < bound; i++) { 419cabdff1aSopenharmony_ci for (ch = 0; ch < s->nb_channels; ch++) { 420cabdff1aSopenharmony_ci if (allocation[ch][i]) 421cabdff1aSopenharmony_ci scale_factors[ch][i] = get_bits(&s->gb, 6); 422cabdff1aSopenharmony_ci } 423cabdff1aSopenharmony_ci } 424cabdff1aSopenharmony_ci for (i = bound; i < SBLIMIT; i++) { 425cabdff1aSopenharmony_ci if (allocation[0][i]) { 426cabdff1aSopenharmony_ci scale_factors[0][i] = get_bits(&s->gb, 6); 427cabdff1aSopenharmony_ci scale_factors[1][i] = get_bits(&s->gb, 6); 428cabdff1aSopenharmony_ci } 429cabdff1aSopenharmony_ci } 430cabdff1aSopenharmony_ci 431cabdff1aSopenharmony_ci /* compute samples */ 432cabdff1aSopenharmony_ci for (j = 0; j < 12; j++) { 433cabdff1aSopenharmony_ci for (i = 0; i < bound; i++) { 434cabdff1aSopenharmony_ci for (ch = 0; ch < s->nb_channels; ch++) { 435cabdff1aSopenharmony_ci n = allocation[ch][i]; 436cabdff1aSopenharmony_ci if (n) { 437cabdff1aSopenharmony_ci mant = get_bits(&s->gb, n + 1); 438cabdff1aSopenharmony_ci v = l1_unscale(n, mant, scale_factors[ch][i]); 439cabdff1aSopenharmony_ci } else { 440cabdff1aSopenharmony_ci v = 0; 441cabdff1aSopenharmony_ci } 442cabdff1aSopenharmony_ci s->sb_samples[ch][j][i] = v; 443cabdff1aSopenharmony_ci } 444cabdff1aSopenharmony_ci } 445cabdff1aSopenharmony_ci for (i = bound; i < SBLIMIT; i++) { 446cabdff1aSopenharmony_ci n = allocation[0][i]; 447cabdff1aSopenharmony_ci if (n) { 448cabdff1aSopenharmony_ci mant = get_bits(&s->gb, n + 1); 449cabdff1aSopenharmony_ci v = l1_unscale(n, mant, scale_factors[0][i]); 450cabdff1aSopenharmony_ci s->sb_samples[0][j][i] = v; 451cabdff1aSopenharmony_ci v = l1_unscale(n, mant, scale_factors[1][i]); 452cabdff1aSopenharmony_ci s->sb_samples[1][j][i] = v; 453cabdff1aSopenharmony_ci } else { 454cabdff1aSopenharmony_ci s->sb_samples[0][j][i] = 0; 455cabdff1aSopenharmony_ci s->sb_samples[1][j][i] = 0; 456cabdff1aSopenharmony_ci } 457cabdff1aSopenharmony_ci } 458cabdff1aSopenharmony_ci } 459cabdff1aSopenharmony_ci return 12; 460cabdff1aSopenharmony_ci} 461cabdff1aSopenharmony_ci 462cabdff1aSopenharmony_cistatic int mp_decode_layer2(MPADecodeContext *s) 463cabdff1aSopenharmony_ci{ 464cabdff1aSopenharmony_ci int sblimit; /* number of used subbands */ 465cabdff1aSopenharmony_ci const unsigned char *alloc_table; 466cabdff1aSopenharmony_ci int table, bit_alloc_bits, i, j, ch, bound, v; 467cabdff1aSopenharmony_ci unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT]; 468cabdff1aSopenharmony_ci unsigned char scale_code[MPA_MAX_CHANNELS][SBLIMIT]; 469cabdff1aSopenharmony_ci unsigned char scale_factors[MPA_MAX_CHANNELS][SBLIMIT][3], *sf; 470cabdff1aSopenharmony_ci int scale, qindex, bits, steps, k, l, m, b; 471cabdff1aSopenharmony_ci int ret; 472cabdff1aSopenharmony_ci 473cabdff1aSopenharmony_ci /* select decoding table */ 474cabdff1aSopenharmony_ci table = ff_mpa_l2_select_table(s->bit_rate / 1000, s->nb_channels, 475cabdff1aSopenharmony_ci s->sample_rate, s->lsf); 476cabdff1aSopenharmony_ci sblimit = ff_mpa_sblimit_table[table]; 477cabdff1aSopenharmony_ci alloc_table = ff_mpa_alloc_tables[table]; 478cabdff1aSopenharmony_ci 479cabdff1aSopenharmony_ci if (s->mode == MPA_JSTEREO) 480cabdff1aSopenharmony_ci bound = (s->mode_ext + 1) * 4; 481cabdff1aSopenharmony_ci else 482cabdff1aSopenharmony_ci bound = sblimit; 483cabdff1aSopenharmony_ci 484cabdff1aSopenharmony_ci ff_dlog(s->avctx, "bound=%d sblimit=%d\n", bound, sblimit); 485cabdff1aSopenharmony_ci 486cabdff1aSopenharmony_ci /* sanity check */ 487cabdff1aSopenharmony_ci if (bound > sblimit) 488cabdff1aSopenharmony_ci bound = sblimit; 489cabdff1aSopenharmony_ci 490cabdff1aSopenharmony_ci /* parse bit allocation */ 491cabdff1aSopenharmony_ci j = 0; 492cabdff1aSopenharmony_ci for (i = 0; i < bound; i++) { 493cabdff1aSopenharmony_ci bit_alloc_bits = alloc_table[j]; 494cabdff1aSopenharmony_ci for (ch = 0; ch < s->nb_channels; ch++) 495cabdff1aSopenharmony_ci bit_alloc[ch][i] = get_bits(&s->gb, bit_alloc_bits); 496cabdff1aSopenharmony_ci j += 1 << bit_alloc_bits; 497cabdff1aSopenharmony_ci } 498cabdff1aSopenharmony_ci for (i = bound; i < sblimit; i++) { 499cabdff1aSopenharmony_ci bit_alloc_bits = alloc_table[j]; 500cabdff1aSopenharmony_ci v = get_bits(&s->gb, bit_alloc_bits); 501cabdff1aSopenharmony_ci bit_alloc[0][i] = v; 502cabdff1aSopenharmony_ci bit_alloc[1][i] = v; 503cabdff1aSopenharmony_ci j += 1 << bit_alloc_bits; 504cabdff1aSopenharmony_ci } 505cabdff1aSopenharmony_ci 506cabdff1aSopenharmony_ci /* scale codes */ 507cabdff1aSopenharmony_ci for (i = 0; i < sblimit; i++) { 508cabdff1aSopenharmony_ci for (ch = 0; ch < s->nb_channels; ch++) { 509cabdff1aSopenharmony_ci if (bit_alloc[ch][i]) 510cabdff1aSopenharmony_ci scale_code[ch][i] = get_bits(&s->gb, 2); 511cabdff1aSopenharmony_ci } 512cabdff1aSopenharmony_ci } 513cabdff1aSopenharmony_ci 514cabdff1aSopenharmony_ci ret = handle_crc(s, get_bits_count(&s->gb) - 16); 515cabdff1aSopenharmony_ci if (ret < 0) 516cabdff1aSopenharmony_ci return ret; 517cabdff1aSopenharmony_ci 518cabdff1aSopenharmony_ci /* scale factors */ 519cabdff1aSopenharmony_ci for (i = 0; i < sblimit; i++) { 520cabdff1aSopenharmony_ci for (ch = 0; ch < s->nb_channels; ch++) { 521cabdff1aSopenharmony_ci if (bit_alloc[ch][i]) { 522cabdff1aSopenharmony_ci sf = scale_factors[ch][i]; 523cabdff1aSopenharmony_ci switch (scale_code[ch][i]) { 524cabdff1aSopenharmony_ci default: 525cabdff1aSopenharmony_ci case 0: 526cabdff1aSopenharmony_ci sf[0] = get_bits(&s->gb, 6); 527cabdff1aSopenharmony_ci sf[1] = get_bits(&s->gb, 6); 528cabdff1aSopenharmony_ci sf[2] = get_bits(&s->gb, 6); 529cabdff1aSopenharmony_ci break; 530cabdff1aSopenharmony_ci case 2: 531cabdff1aSopenharmony_ci sf[0] = get_bits(&s->gb, 6); 532cabdff1aSopenharmony_ci sf[1] = sf[0]; 533cabdff1aSopenharmony_ci sf[2] = sf[0]; 534cabdff1aSopenharmony_ci break; 535cabdff1aSopenharmony_ci case 1: 536cabdff1aSopenharmony_ci sf[0] = get_bits(&s->gb, 6); 537cabdff1aSopenharmony_ci sf[2] = get_bits(&s->gb, 6); 538cabdff1aSopenharmony_ci sf[1] = sf[0]; 539cabdff1aSopenharmony_ci break; 540cabdff1aSopenharmony_ci case 3: 541cabdff1aSopenharmony_ci sf[0] = get_bits(&s->gb, 6); 542cabdff1aSopenharmony_ci sf[2] = get_bits(&s->gb, 6); 543cabdff1aSopenharmony_ci sf[1] = sf[2]; 544cabdff1aSopenharmony_ci break; 545cabdff1aSopenharmony_ci } 546cabdff1aSopenharmony_ci } 547cabdff1aSopenharmony_ci } 548cabdff1aSopenharmony_ci } 549cabdff1aSopenharmony_ci 550cabdff1aSopenharmony_ci /* samples */ 551cabdff1aSopenharmony_ci for (k = 0; k < 3; k++) { 552cabdff1aSopenharmony_ci for (l = 0; l < 12; l += 3) { 553cabdff1aSopenharmony_ci j = 0; 554cabdff1aSopenharmony_ci for (i = 0; i < bound; i++) { 555cabdff1aSopenharmony_ci bit_alloc_bits = alloc_table[j]; 556cabdff1aSopenharmony_ci for (ch = 0; ch < s->nb_channels; ch++) { 557cabdff1aSopenharmony_ci b = bit_alloc[ch][i]; 558cabdff1aSopenharmony_ci if (b) { 559cabdff1aSopenharmony_ci scale = scale_factors[ch][i][k]; 560cabdff1aSopenharmony_ci qindex = alloc_table[j+b]; 561cabdff1aSopenharmony_ci bits = ff_mpa_quant_bits[qindex]; 562cabdff1aSopenharmony_ci if (bits < 0) { 563cabdff1aSopenharmony_ci int v2; 564cabdff1aSopenharmony_ci /* 3 values at the same time */ 565cabdff1aSopenharmony_ci v = get_bits(&s->gb, -bits); 566cabdff1aSopenharmony_ci v2 = ff_division_tabs[qindex][v]; 567cabdff1aSopenharmony_ci steps = ff_mpa_quant_steps[qindex]; 568cabdff1aSopenharmony_ci 569cabdff1aSopenharmony_ci s->sb_samples[ch][k * 12 + l + 0][i] = 570cabdff1aSopenharmony_ci l2_unscale_group(steps, v2 & 15, scale); 571cabdff1aSopenharmony_ci s->sb_samples[ch][k * 12 + l + 1][i] = 572cabdff1aSopenharmony_ci l2_unscale_group(steps, (v2 >> 4) & 15, scale); 573cabdff1aSopenharmony_ci s->sb_samples[ch][k * 12 + l + 2][i] = 574cabdff1aSopenharmony_ci l2_unscale_group(steps, v2 >> 8 , scale); 575cabdff1aSopenharmony_ci } else { 576cabdff1aSopenharmony_ci for (m = 0; m < 3; m++) { 577cabdff1aSopenharmony_ci v = get_bits(&s->gb, bits); 578cabdff1aSopenharmony_ci v = l1_unscale(bits - 1, v, scale); 579cabdff1aSopenharmony_ci s->sb_samples[ch][k * 12 + l + m][i] = v; 580cabdff1aSopenharmony_ci } 581cabdff1aSopenharmony_ci } 582cabdff1aSopenharmony_ci } else { 583cabdff1aSopenharmony_ci s->sb_samples[ch][k * 12 + l + 0][i] = 0; 584cabdff1aSopenharmony_ci s->sb_samples[ch][k * 12 + l + 1][i] = 0; 585cabdff1aSopenharmony_ci s->sb_samples[ch][k * 12 + l + 2][i] = 0; 586cabdff1aSopenharmony_ci } 587cabdff1aSopenharmony_ci } 588cabdff1aSopenharmony_ci /* next subband in alloc table */ 589cabdff1aSopenharmony_ci j += 1 << bit_alloc_bits; 590cabdff1aSopenharmony_ci } 591cabdff1aSopenharmony_ci /* XXX: find a way to avoid this duplication of code */ 592cabdff1aSopenharmony_ci for (i = bound; i < sblimit; i++) { 593cabdff1aSopenharmony_ci bit_alloc_bits = alloc_table[j]; 594cabdff1aSopenharmony_ci b = bit_alloc[0][i]; 595cabdff1aSopenharmony_ci if (b) { 596cabdff1aSopenharmony_ci int mant, scale0, scale1; 597cabdff1aSopenharmony_ci scale0 = scale_factors[0][i][k]; 598cabdff1aSopenharmony_ci scale1 = scale_factors[1][i][k]; 599cabdff1aSopenharmony_ci qindex = alloc_table[j + b]; 600cabdff1aSopenharmony_ci bits = ff_mpa_quant_bits[qindex]; 601cabdff1aSopenharmony_ci if (bits < 0) { 602cabdff1aSopenharmony_ci /* 3 values at the same time */ 603cabdff1aSopenharmony_ci v = get_bits(&s->gb, -bits); 604cabdff1aSopenharmony_ci steps = ff_mpa_quant_steps[qindex]; 605cabdff1aSopenharmony_ci mant = v % steps; 606cabdff1aSopenharmony_ci v = v / steps; 607cabdff1aSopenharmony_ci s->sb_samples[0][k * 12 + l + 0][i] = 608cabdff1aSopenharmony_ci l2_unscale_group(steps, mant, scale0); 609cabdff1aSopenharmony_ci s->sb_samples[1][k * 12 + l + 0][i] = 610cabdff1aSopenharmony_ci l2_unscale_group(steps, mant, scale1); 611cabdff1aSopenharmony_ci mant = v % steps; 612cabdff1aSopenharmony_ci v = v / steps; 613cabdff1aSopenharmony_ci s->sb_samples[0][k * 12 + l + 1][i] = 614cabdff1aSopenharmony_ci l2_unscale_group(steps, mant, scale0); 615cabdff1aSopenharmony_ci s->sb_samples[1][k * 12 + l + 1][i] = 616cabdff1aSopenharmony_ci l2_unscale_group(steps, mant, scale1); 617cabdff1aSopenharmony_ci s->sb_samples[0][k * 12 + l + 2][i] = 618cabdff1aSopenharmony_ci l2_unscale_group(steps, v, scale0); 619cabdff1aSopenharmony_ci s->sb_samples[1][k * 12 + l + 2][i] = 620cabdff1aSopenharmony_ci l2_unscale_group(steps, v, scale1); 621cabdff1aSopenharmony_ci } else { 622cabdff1aSopenharmony_ci for (m = 0; m < 3; m++) { 623cabdff1aSopenharmony_ci mant = get_bits(&s->gb, bits); 624cabdff1aSopenharmony_ci s->sb_samples[0][k * 12 + l + m][i] = 625cabdff1aSopenharmony_ci l1_unscale(bits - 1, mant, scale0); 626cabdff1aSopenharmony_ci s->sb_samples[1][k * 12 + l + m][i] = 627cabdff1aSopenharmony_ci l1_unscale(bits - 1, mant, scale1); 628cabdff1aSopenharmony_ci } 629cabdff1aSopenharmony_ci } 630cabdff1aSopenharmony_ci } else { 631cabdff1aSopenharmony_ci s->sb_samples[0][k * 12 + l + 0][i] = 0; 632cabdff1aSopenharmony_ci s->sb_samples[0][k * 12 + l + 1][i] = 0; 633cabdff1aSopenharmony_ci s->sb_samples[0][k * 12 + l + 2][i] = 0; 634cabdff1aSopenharmony_ci s->sb_samples[1][k * 12 + l + 0][i] = 0; 635cabdff1aSopenharmony_ci s->sb_samples[1][k * 12 + l + 1][i] = 0; 636cabdff1aSopenharmony_ci s->sb_samples[1][k * 12 + l + 2][i] = 0; 637cabdff1aSopenharmony_ci } 638cabdff1aSopenharmony_ci /* next subband in alloc table */ 639cabdff1aSopenharmony_ci j += 1 << bit_alloc_bits; 640cabdff1aSopenharmony_ci } 641cabdff1aSopenharmony_ci /* fill remaining samples to zero */ 642cabdff1aSopenharmony_ci for (i = sblimit; i < SBLIMIT; i++) { 643cabdff1aSopenharmony_ci for (ch = 0; ch < s->nb_channels; ch++) { 644cabdff1aSopenharmony_ci s->sb_samples[ch][k * 12 + l + 0][i] = 0; 645cabdff1aSopenharmony_ci s->sb_samples[ch][k * 12 + l + 1][i] = 0; 646cabdff1aSopenharmony_ci s->sb_samples[ch][k * 12 + l + 2][i] = 0; 647cabdff1aSopenharmony_ci } 648cabdff1aSopenharmony_ci } 649cabdff1aSopenharmony_ci } 650cabdff1aSopenharmony_ci } 651cabdff1aSopenharmony_ci return 3 * 12; 652cabdff1aSopenharmony_ci} 653cabdff1aSopenharmony_ci 654cabdff1aSopenharmony_ci#define SPLIT(dst,sf,n) \ 655cabdff1aSopenharmony_ci if (n == 3) { \ 656cabdff1aSopenharmony_ci int m = (sf * 171) >> 9; \ 657cabdff1aSopenharmony_ci dst = sf - 3 * m; \ 658cabdff1aSopenharmony_ci sf = m; \ 659cabdff1aSopenharmony_ci } else if (n == 4) { \ 660cabdff1aSopenharmony_ci dst = sf & 3; \ 661cabdff1aSopenharmony_ci sf >>= 2; \ 662cabdff1aSopenharmony_ci } else if (n == 5) { \ 663cabdff1aSopenharmony_ci int m = (sf * 205) >> 10; \ 664cabdff1aSopenharmony_ci dst = sf - 5 * m; \ 665cabdff1aSopenharmony_ci sf = m; \ 666cabdff1aSopenharmony_ci } else if (n == 6) { \ 667cabdff1aSopenharmony_ci int m = (sf * 171) >> 10; \ 668cabdff1aSopenharmony_ci dst = sf - 6 * m; \ 669cabdff1aSopenharmony_ci sf = m; \ 670cabdff1aSopenharmony_ci } else { \ 671cabdff1aSopenharmony_ci dst = 0; \ 672cabdff1aSopenharmony_ci } 673cabdff1aSopenharmony_ci 674cabdff1aSopenharmony_cistatic av_always_inline void lsf_sf_expand(int *slen, int sf, int n1, int n2, 675cabdff1aSopenharmony_ci int n3) 676cabdff1aSopenharmony_ci{ 677cabdff1aSopenharmony_ci SPLIT(slen[3], sf, n3) 678cabdff1aSopenharmony_ci SPLIT(slen[2], sf, n2) 679cabdff1aSopenharmony_ci SPLIT(slen[1], sf, n1) 680cabdff1aSopenharmony_ci slen[0] = sf; 681cabdff1aSopenharmony_ci} 682cabdff1aSopenharmony_ci 683cabdff1aSopenharmony_cistatic void exponents_from_scale_factors(MPADecodeContext *s, GranuleDef *g, 684cabdff1aSopenharmony_ci int16_t *exponents) 685cabdff1aSopenharmony_ci{ 686cabdff1aSopenharmony_ci const uint8_t *bstab, *pretab; 687cabdff1aSopenharmony_ci int len, i, j, k, l, v0, shift, gain, gains[3]; 688cabdff1aSopenharmony_ci int16_t *exp_ptr; 689cabdff1aSopenharmony_ci 690cabdff1aSopenharmony_ci exp_ptr = exponents; 691cabdff1aSopenharmony_ci gain = g->global_gain - 210; 692cabdff1aSopenharmony_ci shift = g->scalefac_scale + 1; 693cabdff1aSopenharmony_ci 694cabdff1aSopenharmony_ci bstab = ff_band_size_long[s->sample_rate_index]; 695cabdff1aSopenharmony_ci pretab = ff_mpa_pretab[g->preflag]; 696cabdff1aSopenharmony_ci for (i = 0; i < g->long_end; i++) { 697cabdff1aSopenharmony_ci v0 = gain - ((g->scale_factors[i] + pretab[i]) << shift) + 400; 698cabdff1aSopenharmony_ci len = bstab[i]; 699cabdff1aSopenharmony_ci for (j = len; j > 0; j--) 700cabdff1aSopenharmony_ci *exp_ptr++ = v0; 701cabdff1aSopenharmony_ci } 702cabdff1aSopenharmony_ci 703cabdff1aSopenharmony_ci if (g->short_start < 13) { 704cabdff1aSopenharmony_ci bstab = ff_band_size_short[s->sample_rate_index]; 705cabdff1aSopenharmony_ci gains[0] = gain - (g->subblock_gain[0] << 3); 706cabdff1aSopenharmony_ci gains[1] = gain - (g->subblock_gain[1] << 3); 707cabdff1aSopenharmony_ci gains[2] = gain - (g->subblock_gain[2] << 3); 708cabdff1aSopenharmony_ci k = g->long_end; 709cabdff1aSopenharmony_ci for (i = g->short_start; i < 13; i++) { 710cabdff1aSopenharmony_ci len = bstab[i]; 711cabdff1aSopenharmony_ci for (l = 0; l < 3; l++) { 712cabdff1aSopenharmony_ci v0 = gains[l] - (g->scale_factors[k++] << shift) + 400; 713cabdff1aSopenharmony_ci for (j = len; j > 0; j--) 714cabdff1aSopenharmony_ci *exp_ptr++ = v0; 715cabdff1aSopenharmony_ci } 716cabdff1aSopenharmony_ci } 717cabdff1aSopenharmony_ci } 718cabdff1aSopenharmony_ci} 719cabdff1aSopenharmony_ci 720cabdff1aSopenharmony_cistatic void switch_buffer(MPADecodeContext *s, int *pos, int *end_pos, 721cabdff1aSopenharmony_ci int *end_pos2) 722cabdff1aSopenharmony_ci{ 723cabdff1aSopenharmony_ci if (s->in_gb.buffer && *pos >= s->gb.size_in_bits - s->extrasize * 8) { 724cabdff1aSopenharmony_ci s->gb = s->in_gb; 725cabdff1aSopenharmony_ci s->in_gb.buffer = NULL; 726cabdff1aSopenharmony_ci s->extrasize = 0; 727cabdff1aSopenharmony_ci av_assert2((get_bits_count(&s->gb) & 7) == 0); 728cabdff1aSopenharmony_ci skip_bits_long(&s->gb, *pos - *end_pos); 729cabdff1aSopenharmony_ci *end_pos2 = 730cabdff1aSopenharmony_ci *end_pos = *end_pos2 + get_bits_count(&s->gb) - *pos; 731cabdff1aSopenharmony_ci *pos = get_bits_count(&s->gb); 732cabdff1aSopenharmony_ci } 733cabdff1aSopenharmony_ci} 734cabdff1aSopenharmony_ci 735cabdff1aSopenharmony_ci/* Following is an optimized code for 736cabdff1aSopenharmony_ci INTFLOAT v = *src 737cabdff1aSopenharmony_ci if(get_bits1(&s->gb)) 738cabdff1aSopenharmony_ci v = -v; 739cabdff1aSopenharmony_ci *dst = v; 740cabdff1aSopenharmony_ci*/ 741cabdff1aSopenharmony_ci#if USE_FLOATS 742cabdff1aSopenharmony_ci#define READ_FLIP_SIGN(dst,src) \ 743cabdff1aSopenharmony_ci v = AV_RN32A(src) ^ (get_bits1(&s->gb) << 31); \ 744cabdff1aSopenharmony_ci AV_WN32A(dst, v); 745cabdff1aSopenharmony_ci#else 746cabdff1aSopenharmony_ci#define READ_FLIP_SIGN(dst,src) \ 747cabdff1aSopenharmony_ci v = -get_bits1(&s->gb); \ 748cabdff1aSopenharmony_ci *(dst) = (*(src) ^ v) - v; 749cabdff1aSopenharmony_ci#endif 750cabdff1aSopenharmony_ci 751cabdff1aSopenharmony_cistatic int huffman_decode(MPADecodeContext *s, GranuleDef *g, 752cabdff1aSopenharmony_ci int16_t *exponents, int end_pos2) 753cabdff1aSopenharmony_ci{ 754cabdff1aSopenharmony_ci int s_index; 755cabdff1aSopenharmony_ci int i; 756cabdff1aSopenharmony_ci int last_pos, bits_left; 757cabdff1aSopenharmony_ci VLC *vlc; 758cabdff1aSopenharmony_ci int end_pos = FFMIN(end_pos2, s->gb.size_in_bits - s->extrasize * 8); 759cabdff1aSopenharmony_ci 760cabdff1aSopenharmony_ci /* low frequencies (called big values) */ 761cabdff1aSopenharmony_ci s_index = 0; 762cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) { 763cabdff1aSopenharmony_ci int j, k, l, linbits; 764cabdff1aSopenharmony_ci j = g->region_size[i]; 765cabdff1aSopenharmony_ci if (j == 0) 766cabdff1aSopenharmony_ci continue; 767cabdff1aSopenharmony_ci /* select vlc table */ 768cabdff1aSopenharmony_ci k = g->table_select[i]; 769cabdff1aSopenharmony_ci l = ff_mpa_huff_data[k][0]; 770cabdff1aSopenharmony_ci linbits = ff_mpa_huff_data[k][1]; 771cabdff1aSopenharmony_ci vlc = &ff_huff_vlc[l]; 772cabdff1aSopenharmony_ci 773cabdff1aSopenharmony_ci if (!l) { 774cabdff1aSopenharmony_ci memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid) * 2 * j); 775cabdff1aSopenharmony_ci s_index += 2 * j; 776cabdff1aSopenharmony_ci continue; 777cabdff1aSopenharmony_ci } 778cabdff1aSopenharmony_ci 779cabdff1aSopenharmony_ci /* read huffcode and compute each couple */ 780cabdff1aSopenharmony_ci for (; j > 0; j--) { 781cabdff1aSopenharmony_ci int exponent, x, y; 782cabdff1aSopenharmony_ci int v; 783cabdff1aSopenharmony_ci int pos = get_bits_count(&s->gb); 784cabdff1aSopenharmony_ci 785cabdff1aSopenharmony_ci if (pos >= end_pos){ 786cabdff1aSopenharmony_ci switch_buffer(s, &pos, &end_pos, &end_pos2); 787cabdff1aSopenharmony_ci if (pos >= end_pos) 788cabdff1aSopenharmony_ci break; 789cabdff1aSopenharmony_ci } 790cabdff1aSopenharmony_ci y = get_vlc2(&s->gb, vlc->table, 7, 3); 791cabdff1aSopenharmony_ci 792cabdff1aSopenharmony_ci if (!y) { 793cabdff1aSopenharmony_ci g->sb_hybrid[s_index ] = 794cabdff1aSopenharmony_ci g->sb_hybrid[s_index + 1] = 0; 795cabdff1aSopenharmony_ci s_index += 2; 796cabdff1aSopenharmony_ci continue; 797cabdff1aSopenharmony_ci } 798cabdff1aSopenharmony_ci 799cabdff1aSopenharmony_ci exponent= exponents[s_index]; 800cabdff1aSopenharmony_ci 801cabdff1aSopenharmony_ci ff_dlog(s->avctx, "region=%d n=%d y=%d exp=%d\n", 802cabdff1aSopenharmony_ci i, g->region_size[i] - j, y, exponent); 803cabdff1aSopenharmony_ci if (y & 16) { 804cabdff1aSopenharmony_ci x = y >> 5; 805cabdff1aSopenharmony_ci y = y & 0x0f; 806cabdff1aSopenharmony_ci if (x < 15) { 807cabdff1aSopenharmony_ci READ_FLIP_SIGN(g->sb_hybrid + s_index, RENAME(expval_table)[exponent] + x) 808cabdff1aSopenharmony_ci } else { 809cabdff1aSopenharmony_ci x += get_bitsz(&s->gb, linbits); 810cabdff1aSopenharmony_ci v = l3_unscale(x, exponent); 811cabdff1aSopenharmony_ci if (get_bits1(&s->gb)) 812cabdff1aSopenharmony_ci v = -v; 813cabdff1aSopenharmony_ci g->sb_hybrid[s_index] = v; 814cabdff1aSopenharmony_ci } 815cabdff1aSopenharmony_ci if (y < 15) { 816cabdff1aSopenharmony_ci READ_FLIP_SIGN(g->sb_hybrid + s_index + 1, RENAME(expval_table)[exponent] + y) 817cabdff1aSopenharmony_ci } else { 818cabdff1aSopenharmony_ci y += get_bitsz(&s->gb, linbits); 819cabdff1aSopenharmony_ci v = l3_unscale(y, exponent); 820cabdff1aSopenharmony_ci if (get_bits1(&s->gb)) 821cabdff1aSopenharmony_ci v = -v; 822cabdff1aSopenharmony_ci g->sb_hybrid[s_index + 1] = v; 823cabdff1aSopenharmony_ci } 824cabdff1aSopenharmony_ci } else { 825cabdff1aSopenharmony_ci x = y >> 5; 826cabdff1aSopenharmony_ci y = y & 0x0f; 827cabdff1aSopenharmony_ci x += y; 828cabdff1aSopenharmony_ci if (x < 15) { 829cabdff1aSopenharmony_ci READ_FLIP_SIGN(g->sb_hybrid + s_index + !!y, RENAME(expval_table)[exponent] + x) 830cabdff1aSopenharmony_ci } else { 831cabdff1aSopenharmony_ci x += get_bitsz(&s->gb, linbits); 832cabdff1aSopenharmony_ci v = l3_unscale(x, exponent); 833cabdff1aSopenharmony_ci if (get_bits1(&s->gb)) 834cabdff1aSopenharmony_ci v = -v; 835cabdff1aSopenharmony_ci g->sb_hybrid[s_index+!!y] = v; 836cabdff1aSopenharmony_ci } 837cabdff1aSopenharmony_ci g->sb_hybrid[s_index + !y] = 0; 838cabdff1aSopenharmony_ci } 839cabdff1aSopenharmony_ci s_index += 2; 840cabdff1aSopenharmony_ci } 841cabdff1aSopenharmony_ci } 842cabdff1aSopenharmony_ci 843cabdff1aSopenharmony_ci /* high frequencies */ 844cabdff1aSopenharmony_ci vlc = &ff_huff_quad_vlc[g->count1table_select]; 845cabdff1aSopenharmony_ci last_pos = 0; 846cabdff1aSopenharmony_ci while (s_index <= 572) { 847cabdff1aSopenharmony_ci int pos, code; 848cabdff1aSopenharmony_ci pos = get_bits_count(&s->gb); 849cabdff1aSopenharmony_ci if (pos >= end_pos) { 850cabdff1aSopenharmony_ci if (pos > end_pos2 && last_pos) { 851cabdff1aSopenharmony_ci /* some encoders generate an incorrect size for this 852cabdff1aSopenharmony_ci part. We must go back into the data */ 853cabdff1aSopenharmony_ci s_index -= 4; 854cabdff1aSopenharmony_ci skip_bits_long(&s->gb, last_pos - pos); 855cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_INFO, "overread, skip %d enddists: %d %d\n", last_pos - pos, end_pos-pos, end_pos2-pos); 856cabdff1aSopenharmony_ci if(s->err_recognition & (AV_EF_BITSTREAM|AV_EF_COMPLIANT)) 857cabdff1aSopenharmony_ci s_index=0; 858cabdff1aSopenharmony_ci break; 859cabdff1aSopenharmony_ci } 860cabdff1aSopenharmony_ci switch_buffer(s, &pos, &end_pos, &end_pos2); 861cabdff1aSopenharmony_ci if (pos >= end_pos) 862cabdff1aSopenharmony_ci break; 863cabdff1aSopenharmony_ci } 864cabdff1aSopenharmony_ci last_pos = pos; 865cabdff1aSopenharmony_ci 866cabdff1aSopenharmony_ci code = get_vlc2(&s->gb, vlc->table, vlc->bits, 1); 867cabdff1aSopenharmony_ci ff_dlog(s->avctx, "t=%d code=%d\n", g->count1table_select, code); 868cabdff1aSopenharmony_ci g->sb_hybrid[s_index + 0] = 869cabdff1aSopenharmony_ci g->sb_hybrid[s_index + 1] = 870cabdff1aSopenharmony_ci g->sb_hybrid[s_index + 2] = 871cabdff1aSopenharmony_ci g->sb_hybrid[s_index + 3] = 0; 872cabdff1aSopenharmony_ci while (code) { 873cabdff1aSopenharmony_ci static const int idxtab[16] = { 3,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0 }; 874cabdff1aSopenharmony_ci int v; 875cabdff1aSopenharmony_ci int pos = s_index + idxtab[code]; 876cabdff1aSopenharmony_ci code ^= 8 >> idxtab[code]; 877cabdff1aSopenharmony_ci READ_FLIP_SIGN(g->sb_hybrid + pos, RENAME(exp_table)+exponents[pos]) 878cabdff1aSopenharmony_ci } 879cabdff1aSopenharmony_ci s_index += 4; 880cabdff1aSopenharmony_ci } 881cabdff1aSopenharmony_ci /* skip extension bits */ 882cabdff1aSopenharmony_ci bits_left = end_pos2 - get_bits_count(&s->gb); 883cabdff1aSopenharmony_ci if (bits_left < 0 && (s->err_recognition & (AV_EF_BUFFER|AV_EF_COMPLIANT))) { 884cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "bits_left=%d\n", bits_left); 885cabdff1aSopenharmony_ci s_index=0; 886cabdff1aSopenharmony_ci } else if (bits_left > 0 && (s->err_recognition & (AV_EF_BUFFER|AV_EF_AGGRESSIVE))) { 887cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "bits_left=%d\n", bits_left); 888cabdff1aSopenharmony_ci s_index = 0; 889cabdff1aSopenharmony_ci } 890cabdff1aSopenharmony_ci memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid) * (576 - s_index)); 891cabdff1aSopenharmony_ci skip_bits_long(&s->gb, bits_left); 892cabdff1aSopenharmony_ci 893cabdff1aSopenharmony_ci i = get_bits_count(&s->gb); 894cabdff1aSopenharmony_ci switch_buffer(s, &i, &end_pos, &end_pos2); 895cabdff1aSopenharmony_ci 896cabdff1aSopenharmony_ci return 0; 897cabdff1aSopenharmony_ci} 898cabdff1aSopenharmony_ci 899cabdff1aSopenharmony_ci/* Reorder short blocks from bitstream order to interleaved order. It 900cabdff1aSopenharmony_ci would be faster to do it in parsing, but the code would be far more 901cabdff1aSopenharmony_ci complicated */ 902cabdff1aSopenharmony_cistatic void reorder_block(MPADecodeContext *s, GranuleDef *g) 903cabdff1aSopenharmony_ci{ 904cabdff1aSopenharmony_ci int i, j, len; 905cabdff1aSopenharmony_ci INTFLOAT *ptr, *dst, *ptr1; 906cabdff1aSopenharmony_ci INTFLOAT tmp[576]; 907cabdff1aSopenharmony_ci 908cabdff1aSopenharmony_ci if (g->block_type != 2) 909cabdff1aSopenharmony_ci return; 910cabdff1aSopenharmony_ci 911cabdff1aSopenharmony_ci if (g->switch_point) { 912cabdff1aSopenharmony_ci if (s->sample_rate_index != 8) 913cabdff1aSopenharmony_ci ptr = g->sb_hybrid + 36; 914cabdff1aSopenharmony_ci else 915cabdff1aSopenharmony_ci ptr = g->sb_hybrid + 72; 916cabdff1aSopenharmony_ci } else { 917cabdff1aSopenharmony_ci ptr = g->sb_hybrid; 918cabdff1aSopenharmony_ci } 919cabdff1aSopenharmony_ci 920cabdff1aSopenharmony_ci for (i = g->short_start; i < 13; i++) { 921cabdff1aSopenharmony_ci len = ff_band_size_short[s->sample_rate_index][i]; 922cabdff1aSopenharmony_ci ptr1 = ptr; 923cabdff1aSopenharmony_ci dst = tmp; 924cabdff1aSopenharmony_ci for (j = len; j > 0; j--) { 925cabdff1aSopenharmony_ci *dst++ = ptr[0*len]; 926cabdff1aSopenharmony_ci *dst++ = ptr[1*len]; 927cabdff1aSopenharmony_ci *dst++ = ptr[2*len]; 928cabdff1aSopenharmony_ci ptr++; 929cabdff1aSopenharmony_ci } 930cabdff1aSopenharmony_ci ptr += 2 * len; 931cabdff1aSopenharmony_ci memcpy(ptr1, tmp, len * 3 * sizeof(*ptr1)); 932cabdff1aSopenharmony_ci } 933cabdff1aSopenharmony_ci} 934cabdff1aSopenharmony_ci 935cabdff1aSopenharmony_ci#define ISQRT2 FIXR(0.70710678118654752440) 936cabdff1aSopenharmony_ci 937cabdff1aSopenharmony_cistatic void compute_stereo(MPADecodeContext *s, GranuleDef *g0, GranuleDef *g1) 938cabdff1aSopenharmony_ci{ 939cabdff1aSopenharmony_ci int i, j, k, l; 940cabdff1aSopenharmony_ci int sf_max, sf, len, non_zero_found; 941cabdff1aSopenharmony_ci INTFLOAT *tab0, *tab1, v1, v2; 942cabdff1aSopenharmony_ci const INTFLOAT (*is_tab)[16]; 943cabdff1aSopenharmony_ci SUINTFLOAT tmp0, tmp1; 944cabdff1aSopenharmony_ci int non_zero_found_short[3]; 945cabdff1aSopenharmony_ci 946cabdff1aSopenharmony_ci /* intensity stereo */ 947cabdff1aSopenharmony_ci if (s->mode_ext & MODE_EXT_I_STEREO) { 948cabdff1aSopenharmony_ci if (!s->lsf) { 949cabdff1aSopenharmony_ci is_tab = is_table; 950cabdff1aSopenharmony_ci sf_max = 7; 951cabdff1aSopenharmony_ci } else { 952cabdff1aSopenharmony_ci is_tab = is_table_lsf[g1->scalefac_compress & 1]; 953cabdff1aSopenharmony_ci sf_max = 16; 954cabdff1aSopenharmony_ci } 955cabdff1aSopenharmony_ci 956cabdff1aSopenharmony_ci tab0 = g0->sb_hybrid + 576; 957cabdff1aSopenharmony_ci tab1 = g1->sb_hybrid + 576; 958cabdff1aSopenharmony_ci 959cabdff1aSopenharmony_ci non_zero_found_short[0] = 0; 960cabdff1aSopenharmony_ci non_zero_found_short[1] = 0; 961cabdff1aSopenharmony_ci non_zero_found_short[2] = 0; 962cabdff1aSopenharmony_ci k = (13 - g1->short_start) * 3 + g1->long_end - 3; 963cabdff1aSopenharmony_ci for (i = 12; i >= g1->short_start; i--) { 964cabdff1aSopenharmony_ci /* for last band, use previous scale factor */ 965cabdff1aSopenharmony_ci if (i != 11) 966cabdff1aSopenharmony_ci k -= 3; 967cabdff1aSopenharmony_ci len = ff_band_size_short[s->sample_rate_index][i]; 968cabdff1aSopenharmony_ci for (l = 2; l >= 0; l--) { 969cabdff1aSopenharmony_ci tab0 -= len; 970cabdff1aSopenharmony_ci tab1 -= len; 971cabdff1aSopenharmony_ci if (!non_zero_found_short[l]) { 972cabdff1aSopenharmony_ci /* test if non zero band. if so, stop doing i-stereo */ 973cabdff1aSopenharmony_ci for (j = 0; j < len; j++) { 974cabdff1aSopenharmony_ci if (tab1[j] != 0) { 975cabdff1aSopenharmony_ci non_zero_found_short[l] = 1; 976cabdff1aSopenharmony_ci goto found1; 977cabdff1aSopenharmony_ci } 978cabdff1aSopenharmony_ci } 979cabdff1aSopenharmony_ci sf = g1->scale_factors[k + l]; 980cabdff1aSopenharmony_ci if (sf >= sf_max) 981cabdff1aSopenharmony_ci goto found1; 982cabdff1aSopenharmony_ci 983cabdff1aSopenharmony_ci v1 = is_tab[0][sf]; 984cabdff1aSopenharmony_ci v2 = is_tab[1][sf]; 985cabdff1aSopenharmony_ci for (j = 0; j < len; j++) { 986cabdff1aSopenharmony_ci tmp0 = tab0[j]; 987cabdff1aSopenharmony_ci tab0[j] = MULLx(tmp0, v1, FRAC_BITS); 988cabdff1aSopenharmony_ci tab1[j] = MULLx(tmp0, v2, FRAC_BITS); 989cabdff1aSopenharmony_ci } 990cabdff1aSopenharmony_ci } else { 991cabdff1aSopenharmony_cifound1: 992cabdff1aSopenharmony_ci if (s->mode_ext & MODE_EXT_MS_STEREO) { 993cabdff1aSopenharmony_ci /* lower part of the spectrum : do ms stereo 994cabdff1aSopenharmony_ci if enabled */ 995cabdff1aSopenharmony_ci for (j = 0; j < len; j++) { 996cabdff1aSopenharmony_ci tmp0 = tab0[j]; 997cabdff1aSopenharmony_ci tmp1 = tab1[j]; 998cabdff1aSopenharmony_ci tab0[j] = MULLx(tmp0 + tmp1, ISQRT2, FRAC_BITS); 999cabdff1aSopenharmony_ci tab1[j] = MULLx(tmp0 - tmp1, ISQRT2, FRAC_BITS); 1000cabdff1aSopenharmony_ci } 1001cabdff1aSopenharmony_ci } 1002cabdff1aSopenharmony_ci } 1003cabdff1aSopenharmony_ci } 1004cabdff1aSopenharmony_ci } 1005cabdff1aSopenharmony_ci 1006cabdff1aSopenharmony_ci non_zero_found = non_zero_found_short[0] | 1007cabdff1aSopenharmony_ci non_zero_found_short[1] | 1008cabdff1aSopenharmony_ci non_zero_found_short[2]; 1009cabdff1aSopenharmony_ci 1010cabdff1aSopenharmony_ci for (i = g1->long_end - 1;i >= 0;i--) { 1011cabdff1aSopenharmony_ci len = ff_band_size_long[s->sample_rate_index][i]; 1012cabdff1aSopenharmony_ci tab0 -= len; 1013cabdff1aSopenharmony_ci tab1 -= len; 1014cabdff1aSopenharmony_ci /* test if non zero band. if so, stop doing i-stereo */ 1015cabdff1aSopenharmony_ci if (!non_zero_found) { 1016cabdff1aSopenharmony_ci for (j = 0; j < len; j++) { 1017cabdff1aSopenharmony_ci if (tab1[j] != 0) { 1018cabdff1aSopenharmony_ci non_zero_found = 1; 1019cabdff1aSopenharmony_ci goto found2; 1020cabdff1aSopenharmony_ci } 1021cabdff1aSopenharmony_ci } 1022cabdff1aSopenharmony_ci /* for last band, use previous scale factor */ 1023cabdff1aSopenharmony_ci k = (i == 21) ? 20 : i; 1024cabdff1aSopenharmony_ci sf = g1->scale_factors[k]; 1025cabdff1aSopenharmony_ci if (sf >= sf_max) 1026cabdff1aSopenharmony_ci goto found2; 1027cabdff1aSopenharmony_ci v1 = is_tab[0][sf]; 1028cabdff1aSopenharmony_ci v2 = is_tab[1][sf]; 1029cabdff1aSopenharmony_ci for (j = 0; j < len; j++) { 1030cabdff1aSopenharmony_ci tmp0 = tab0[j]; 1031cabdff1aSopenharmony_ci tab0[j] = MULLx(tmp0, v1, FRAC_BITS); 1032cabdff1aSopenharmony_ci tab1[j] = MULLx(tmp0, v2, FRAC_BITS); 1033cabdff1aSopenharmony_ci } 1034cabdff1aSopenharmony_ci } else { 1035cabdff1aSopenharmony_cifound2: 1036cabdff1aSopenharmony_ci if (s->mode_ext & MODE_EXT_MS_STEREO) { 1037cabdff1aSopenharmony_ci /* lower part of the spectrum : do ms stereo 1038cabdff1aSopenharmony_ci if enabled */ 1039cabdff1aSopenharmony_ci for (j = 0; j < len; j++) { 1040cabdff1aSopenharmony_ci tmp0 = tab0[j]; 1041cabdff1aSopenharmony_ci tmp1 = tab1[j]; 1042cabdff1aSopenharmony_ci tab0[j] = MULLx(tmp0 + tmp1, ISQRT2, FRAC_BITS); 1043cabdff1aSopenharmony_ci tab1[j] = MULLx(tmp0 - tmp1, ISQRT2, FRAC_BITS); 1044cabdff1aSopenharmony_ci } 1045cabdff1aSopenharmony_ci } 1046cabdff1aSopenharmony_ci } 1047cabdff1aSopenharmony_ci } 1048cabdff1aSopenharmony_ci } else if (s->mode_ext & MODE_EXT_MS_STEREO) { 1049cabdff1aSopenharmony_ci /* ms stereo ONLY */ 1050cabdff1aSopenharmony_ci /* NOTE: the 1/sqrt(2) normalization factor is included in the 1051cabdff1aSopenharmony_ci global gain */ 1052cabdff1aSopenharmony_ci#if USE_FLOATS 1053cabdff1aSopenharmony_ci s->butterflies_float(g0->sb_hybrid, g1->sb_hybrid, 576); 1054cabdff1aSopenharmony_ci#else 1055cabdff1aSopenharmony_ci tab0 = g0->sb_hybrid; 1056cabdff1aSopenharmony_ci tab1 = g1->sb_hybrid; 1057cabdff1aSopenharmony_ci for (i = 0; i < 576; i++) { 1058cabdff1aSopenharmony_ci tmp0 = tab0[i]; 1059cabdff1aSopenharmony_ci tmp1 = tab1[i]; 1060cabdff1aSopenharmony_ci tab0[i] = tmp0 + tmp1; 1061cabdff1aSopenharmony_ci tab1[i] = tmp0 - tmp1; 1062cabdff1aSopenharmony_ci } 1063cabdff1aSopenharmony_ci#endif 1064cabdff1aSopenharmony_ci } 1065cabdff1aSopenharmony_ci} 1066cabdff1aSopenharmony_ci 1067cabdff1aSopenharmony_ci#if USE_FLOATS 1068cabdff1aSopenharmony_ci#if HAVE_MIPSFPU 1069cabdff1aSopenharmony_ci# include "mips/compute_antialias_float.h" 1070cabdff1aSopenharmony_ci#endif /* HAVE_MIPSFPU */ 1071cabdff1aSopenharmony_ci#else 1072cabdff1aSopenharmony_ci#if HAVE_MIPSDSP 1073cabdff1aSopenharmony_ci# include "mips/compute_antialias_fixed.h" 1074cabdff1aSopenharmony_ci#endif /* HAVE_MIPSDSP */ 1075cabdff1aSopenharmony_ci#endif /* USE_FLOATS */ 1076cabdff1aSopenharmony_ci 1077cabdff1aSopenharmony_ci#ifndef compute_antialias 1078cabdff1aSopenharmony_ci#if USE_FLOATS 1079cabdff1aSopenharmony_ci#define AA(j) do { \ 1080cabdff1aSopenharmony_ci float tmp0 = ptr[-1-j]; \ 1081cabdff1aSopenharmony_ci float tmp1 = ptr[ j]; \ 1082cabdff1aSopenharmony_ci ptr[-1-j] = tmp0 * csa_table[j][0] - tmp1 * csa_table[j][1]; \ 1083cabdff1aSopenharmony_ci ptr[ j] = tmp0 * csa_table[j][1] + tmp1 * csa_table[j][0]; \ 1084cabdff1aSopenharmony_ci } while (0) 1085cabdff1aSopenharmony_ci#else 1086cabdff1aSopenharmony_ci#define AA(j) do { \ 1087cabdff1aSopenharmony_ci SUINT tmp0 = ptr[-1-j]; \ 1088cabdff1aSopenharmony_ci SUINT tmp1 = ptr[ j]; \ 1089cabdff1aSopenharmony_ci SUINT tmp2 = MULH(tmp0 + tmp1, csa_table[j][0]); \ 1090cabdff1aSopenharmony_ci ptr[-1-j] = 4 * (tmp2 - MULH(tmp1, csa_table[j][2])); \ 1091cabdff1aSopenharmony_ci ptr[ j] = 4 * (tmp2 + MULH(tmp0, csa_table[j][3])); \ 1092cabdff1aSopenharmony_ci } while (0) 1093cabdff1aSopenharmony_ci#endif 1094cabdff1aSopenharmony_ci 1095cabdff1aSopenharmony_cistatic void compute_antialias(MPADecodeContext *s, GranuleDef *g) 1096cabdff1aSopenharmony_ci{ 1097cabdff1aSopenharmony_ci INTFLOAT *ptr; 1098cabdff1aSopenharmony_ci int n, i; 1099cabdff1aSopenharmony_ci 1100cabdff1aSopenharmony_ci /* we antialias only "long" bands */ 1101cabdff1aSopenharmony_ci if (g->block_type == 2) { 1102cabdff1aSopenharmony_ci if (!g->switch_point) 1103cabdff1aSopenharmony_ci return; 1104cabdff1aSopenharmony_ci /* XXX: check this for 8000Hz case */ 1105cabdff1aSopenharmony_ci n = 1; 1106cabdff1aSopenharmony_ci } else { 1107cabdff1aSopenharmony_ci n = SBLIMIT - 1; 1108cabdff1aSopenharmony_ci } 1109cabdff1aSopenharmony_ci 1110cabdff1aSopenharmony_ci ptr = g->sb_hybrid + 18; 1111cabdff1aSopenharmony_ci for (i = n; i > 0; i--) { 1112cabdff1aSopenharmony_ci AA(0); 1113cabdff1aSopenharmony_ci AA(1); 1114cabdff1aSopenharmony_ci AA(2); 1115cabdff1aSopenharmony_ci AA(3); 1116cabdff1aSopenharmony_ci AA(4); 1117cabdff1aSopenharmony_ci AA(5); 1118cabdff1aSopenharmony_ci AA(6); 1119cabdff1aSopenharmony_ci AA(7); 1120cabdff1aSopenharmony_ci 1121cabdff1aSopenharmony_ci ptr += 18; 1122cabdff1aSopenharmony_ci } 1123cabdff1aSopenharmony_ci} 1124cabdff1aSopenharmony_ci#endif /* compute_antialias */ 1125cabdff1aSopenharmony_ci 1126cabdff1aSopenharmony_cistatic void compute_imdct(MPADecodeContext *s, GranuleDef *g, 1127cabdff1aSopenharmony_ci INTFLOAT *sb_samples, INTFLOAT *mdct_buf) 1128cabdff1aSopenharmony_ci{ 1129cabdff1aSopenharmony_ci INTFLOAT *win, *out_ptr, *ptr, *buf, *ptr1; 1130cabdff1aSopenharmony_ci INTFLOAT out2[12]; 1131cabdff1aSopenharmony_ci int i, j, mdct_long_end, sblimit; 1132cabdff1aSopenharmony_ci 1133cabdff1aSopenharmony_ci /* find last non zero block */ 1134cabdff1aSopenharmony_ci ptr = g->sb_hybrid + 576; 1135cabdff1aSopenharmony_ci ptr1 = g->sb_hybrid + 2 * 18; 1136cabdff1aSopenharmony_ci while (ptr >= ptr1) { 1137cabdff1aSopenharmony_ci int32_t *p; 1138cabdff1aSopenharmony_ci ptr -= 6; 1139cabdff1aSopenharmony_ci p = (int32_t*)ptr; 1140cabdff1aSopenharmony_ci if (p[0] | p[1] | p[2] | p[3] | p[4] | p[5]) 1141cabdff1aSopenharmony_ci break; 1142cabdff1aSopenharmony_ci } 1143cabdff1aSopenharmony_ci sblimit = ((ptr - g->sb_hybrid) / 18) + 1; 1144cabdff1aSopenharmony_ci 1145cabdff1aSopenharmony_ci if (g->block_type == 2) { 1146cabdff1aSopenharmony_ci /* XXX: check for 8000 Hz */ 1147cabdff1aSopenharmony_ci if (g->switch_point) 1148cabdff1aSopenharmony_ci mdct_long_end = 2; 1149cabdff1aSopenharmony_ci else 1150cabdff1aSopenharmony_ci mdct_long_end = 0; 1151cabdff1aSopenharmony_ci } else { 1152cabdff1aSopenharmony_ci mdct_long_end = sblimit; 1153cabdff1aSopenharmony_ci } 1154cabdff1aSopenharmony_ci 1155cabdff1aSopenharmony_ci s->mpadsp.RENAME(imdct36_blocks)(sb_samples, mdct_buf, g->sb_hybrid, 1156cabdff1aSopenharmony_ci mdct_long_end, g->switch_point, 1157cabdff1aSopenharmony_ci g->block_type); 1158cabdff1aSopenharmony_ci 1159cabdff1aSopenharmony_ci buf = mdct_buf + 4*18*(mdct_long_end >> 2) + (mdct_long_end & 3); 1160cabdff1aSopenharmony_ci ptr = g->sb_hybrid + 18 * mdct_long_end; 1161cabdff1aSopenharmony_ci 1162cabdff1aSopenharmony_ci for (j = mdct_long_end; j < sblimit; j++) { 1163cabdff1aSopenharmony_ci /* select frequency inversion */ 1164cabdff1aSopenharmony_ci win = RENAME(ff_mdct_win)[2 + (4 & -(j & 1))]; 1165cabdff1aSopenharmony_ci out_ptr = sb_samples + j; 1166cabdff1aSopenharmony_ci 1167cabdff1aSopenharmony_ci for (i = 0; i < 6; i++) { 1168cabdff1aSopenharmony_ci *out_ptr = buf[4*i]; 1169cabdff1aSopenharmony_ci out_ptr += SBLIMIT; 1170cabdff1aSopenharmony_ci } 1171cabdff1aSopenharmony_ci imdct12(out2, ptr + 0); 1172cabdff1aSopenharmony_ci for (i = 0; i < 6; i++) { 1173cabdff1aSopenharmony_ci *out_ptr = MULH3(out2[i ], win[i ], 1) + buf[4*(i + 6*1)]; 1174cabdff1aSopenharmony_ci buf[4*(i + 6*2)] = MULH3(out2[i + 6], win[i + 6], 1); 1175cabdff1aSopenharmony_ci out_ptr += SBLIMIT; 1176cabdff1aSopenharmony_ci } 1177cabdff1aSopenharmony_ci imdct12(out2, ptr + 1); 1178cabdff1aSopenharmony_ci for (i = 0; i < 6; i++) { 1179cabdff1aSopenharmony_ci *out_ptr = MULH3(out2[i ], win[i ], 1) + buf[4*(i + 6*2)]; 1180cabdff1aSopenharmony_ci buf[4*(i + 6*0)] = MULH3(out2[i + 6], win[i + 6], 1); 1181cabdff1aSopenharmony_ci out_ptr += SBLIMIT; 1182cabdff1aSopenharmony_ci } 1183cabdff1aSopenharmony_ci imdct12(out2, ptr + 2); 1184cabdff1aSopenharmony_ci for (i = 0; i < 6; i++) { 1185cabdff1aSopenharmony_ci buf[4*(i + 6*0)] = MULH3(out2[i ], win[i ], 1) + buf[4*(i + 6*0)]; 1186cabdff1aSopenharmony_ci buf[4*(i + 6*1)] = MULH3(out2[i + 6], win[i + 6], 1); 1187cabdff1aSopenharmony_ci buf[4*(i + 6*2)] = 0; 1188cabdff1aSopenharmony_ci } 1189cabdff1aSopenharmony_ci ptr += 18; 1190cabdff1aSopenharmony_ci buf += (j&3) != 3 ? 1 : (4*18-3); 1191cabdff1aSopenharmony_ci } 1192cabdff1aSopenharmony_ci /* zero bands */ 1193cabdff1aSopenharmony_ci for (j = sblimit; j < SBLIMIT; j++) { 1194cabdff1aSopenharmony_ci /* overlap */ 1195cabdff1aSopenharmony_ci out_ptr = sb_samples + j; 1196cabdff1aSopenharmony_ci for (i = 0; i < 18; i++) { 1197cabdff1aSopenharmony_ci *out_ptr = buf[4*i]; 1198cabdff1aSopenharmony_ci buf[4*i] = 0; 1199cabdff1aSopenharmony_ci out_ptr += SBLIMIT; 1200cabdff1aSopenharmony_ci } 1201cabdff1aSopenharmony_ci buf += (j&3) != 3 ? 1 : (4*18-3); 1202cabdff1aSopenharmony_ci } 1203cabdff1aSopenharmony_ci} 1204cabdff1aSopenharmony_ci 1205cabdff1aSopenharmony_ci/* main layer3 decoding function */ 1206cabdff1aSopenharmony_cistatic int mp_decode_layer3(MPADecodeContext *s) 1207cabdff1aSopenharmony_ci{ 1208cabdff1aSopenharmony_ci int nb_granules, main_data_begin; 1209cabdff1aSopenharmony_ci int gr, ch, blocksplit_flag, i, j, k, n, bits_pos; 1210cabdff1aSopenharmony_ci GranuleDef *g; 1211cabdff1aSopenharmony_ci int16_t exponents[576]; //FIXME try INTFLOAT 1212cabdff1aSopenharmony_ci int ret; 1213cabdff1aSopenharmony_ci 1214cabdff1aSopenharmony_ci /* read side info */ 1215cabdff1aSopenharmony_ci if (s->lsf) { 1216cabdff1aSopenharmony_ci ret = handle_crc(s, ((s->nb_channels == 1) ? 8*9 : 8*17)); 1217cabdff1aSopenharmony_ci main_data_begin = get_bits(&s->gb, 8); 1218cabdff1aSopenharmony_ci skip_bits(&s->gb, s->nb_channels); 1219cabdff1aSopenharmony_ci nb_granules = 1; 1220cabdff1aSopenharmony_ci } else { 1221cabdff1aSopenharmony_ci ret = handle_crc(s, ((s->nb_channels == 1) ? 8*17 : 8*32)); 1222cabdff1aSopenharmony_ci main_data_begin = get_bits(&s->gb, 9); 1223cabdff1aSopenharmony_ci if (s->nb_channels == 2) 1224cabdff1aSopenharmony_ci skip_bits(&s->gb, 3); 1225cabdff1aSopenharmony_ci else 1226cabdff1aSopenharmony_ci skip_bits(&s->gb, 5); 1227cabdff1aSopenharmony_ci nb_granules = 2; 1228cabdff1aSopenharmony_ci for (ch = 0; ch < s->nb_channels; ch++) { 1229cabdff1aSopenharmony_ci s->granules[ch][0].scfsi = 0;/* all scale factors are transmitted */ 1230cabdff1aSopenharmony_ci s->granules[ch][1].scfsi = get_bits(&s->gb, 4); 1231cabdff1aSopenharmony_ci } 1232cabdff1aSopenharmony_ci } 1233cabdff1aSopenharmony_ci if (ret < 0) 1234cabdff1aSopenharmony_ci return ret; 1235cabdff1aSopenharmony_ci 1236cabdff1aSopenharmony_ci for (gr = 0; gr < nb_granules; gr++) { 1237cabdff1aSopenharmony_ci for (ch = 0; ch < s->nb_channels; ch++) { 1238cabdff1aSopenharmony_ci ff_dlog(s->avctx, "gr=%d ch=%d: side_info\n", gr, ch); 1239cabdff1aSopenharmony_ci g = &s->granules[ch][gr]; 1240cabdff1aSopenharmony_ci g->part2_3_length = get_bits(&s->gb, 12); 1241cabdff1aSopenharmony_ci g->big_values = get_bits(&s->gb, 9); 1242cabdff1aSopenharmony_ci if (g->big_values > 288) { 1243cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "big_values too big\n"); 1244cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1245cabdff1aSopenharmony_ci } 1246cabdff1aSopenharmony_ci 1247cabdff1aSopenharmony_ci g->global_gain = get_bits(&s->gb, 8); 1248cabdff1aSopenharmony_ci /* if MS stereo only is selected, we precompute the 1249cabdff1aSopenharmony_ci 1/sqrt(2) renormalization factor */ 1250cabdff1aSopenharmony_ci if ((s->mode_ext & (MODE_EXT_MS_STEREO | MODE_EXT_I_STEREO)) == 1251cabdff1aSopenharmony_ci MODE_EXT_MS_STEREO) 1252cabdff1aSopenharmony_ci g->global_gain -= 2; 1253cabdff1aSopenharmony_ci if (s->lsf) 1254cabdff1aSopenharmony_ci g->scalefac_compress = get_bits(&s->gb, 9); 1255cabdff1aSopenharmony_ci else 1256cabdff1aSopenharmony_ci g->scalefac_compress = get_bits(&s->gb, 4); 1257cabdff1aSopenharmony_ci blocksplit_flag = get_bits1(&s->gb); 1258cabdff1aSopenharmony_ci if (blocksplit_flag) { 1259cabdff1aSopenharmony_ci g->block_type = get_bits(&s->gb, 2); 1260cabdff1aSopenharmony_ci if (g->block_type == 0) { 1261cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "invalid block type\n"); 1262cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1263cabdff1aSopenharmony_ci } 1264cabdff1aSopenharmony_ci g->switch_point = get_bits1(&s->gb); 1265cabdff1aSopenharmony_ci for (i = 0; i < 2; i++) 1266cabdff1aSopenharmony_ci g->table_select[i] = get_bits(&s->gb, 5); 1267cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) 1268cabdff1aSopenharmony_ci g->subblock_gain[i] = get_bits(&s->gb, 3); 1269cabdff1aSopenharmony_ci init_short_region(s, g); 1270cabdff1aSopenharmony_ci } else { 1271cabdff1aSopenharmony_ci int region_address1, region_address2; 1272cabdff1aSopenharmony_ci g->block_type = 0; 1273cabdff1aSopenharmony_ci g->switch_point = 0; 1274cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) 1275cabdff1aSopenharmony_ci g->table_select[i] = get_bits(&s->gb, 5); 1276cabdff1aSopenharmony_ci /* compute huffman coded region sizes */ 1277cabdff1aSopenharmony_ci region_address1 = get_bits(&s->gb, 4); 1278cabdff1aSopenharmony_ci region_address2 = get_bits(&s->gb, 3); 1279cabdff1aSopenharmony_ci ff_dlog(s->avctx, "region1=%d region2=%d\n", 1280cabdff1aSopenharmony_ci region_address1, region_address2); 1281cabdff1aSopenharmony_ci init_long_region(s, g, region_address1, region_address2); 1282cabdff1aSopenharmony_ci } 1283cabdff1aSopenharmony_ci region_offset2size(g); 1284cabdff1aSopenharmony_ci compute_band_indexes(s, g); 1285cabdff1aSopenharmony_ci 1286cabdff1aSopenharmony_ci g->preflag = 0; 1287cabdff1aSopenharmony_ci if (!s->lsf) 1288cabdff1aSopenharmony_ci g->preflag = get_bits1(&s->gb); 1289cabdff1aSopenharmony_ci g->scalefac_scale = get_bits1(&s->gb); 1290cabdff1aSopenharmony_ci g->count1table_select = get_bits1(&s->gb); 1291cabdff1aSopenharmony_ci ff_dlog(s->avctx, "block_type=%d switch_point=%d\n", 1292cabdff1aSopenharmony_ci g->block_type, g->switch_point); 1293cabdff1aSopenharmony_ci } 1294cabdff1aSopenharmony_ci } 1295cabdff1aSopenharmony_ci 1296cabdff1aSopenharmony_ci if (!s->adu_mode) { 1297cabdff1aSopenharmony_ci int skip; 1298cabdff1aSopenharmony_ci const uint8_t *ptr = s->gb.buffer + (get_bits_count(&s->gb) >> 3); 1299cabdff1aSopenharmony_ci s->extrasize = av_clip((get_bits_left(&s->gb) >> 3) - s->extrasize, 0, 1300cabdff1aSopenharmony_ci FFMAX(0, LAST_BUF_SIZE - s->last_buf_size)); 1301cabdff1aSopenharmony_ci av_assert1((get_bits_count(&s->gb) & 7) == 0); 1302cabdff1aSopenharmony_ci /* now we get bits from the main_data_begin offset */ 1303cabdff1aSopenharmony_ci ff_dlog(s->avctx, "seekback:%d, lastbuf:%d\n", 1304cabdff1aSopenharmony_ci main_data_begin, s->last_buf_size); 1305cabdff1aSopenharmony_ci 1306cabdff1aSopenharmony_ci memcpy(s->last_buf + s->last_buf_size, ptr, s->extrasize); 1307cabdff1aSopenharmony_ci s->in_gb = s->gb; 1308cabdff1aSopenharmony_ci init_get_bits(&s->gb, s->last_buf, (s->last_buf_size + s->extrasize) * 8); 1309cabdff1aSopenharmony_ci s->last_buf_size <<= 3; 1310cabdff1aSopenharmony_ci for (gr = 0; gr < nb_granules && (s->last_buf_size >> 3) < main_data_begin; gr++) { 1311cabdff1aSopenharmony_ci for (ch = 0; ch < s->nb_channels; ch++) { 1312cabdff1aSopenharmony_ci g = &s->granules[ch][gr]; 1313cabdff1aSopenharmony_ci s->last_buf_size += g->part2_3_length; 1314cabdff1aSopenharmony_ci memset(g->sb_hybrid, 0, sizeof(g->sb_hybrid)); 1315cabdff1aSopenharmony_ci compute_imdct(s, g, &s->sb_samples[ch][18 * gr][0], s->mdct_buf[ch]); 1316cabdff1aSopenharmony_ci } 1317cabdff1aSopenharmony_ci } 1318cabdff1aSopenharmony_ci skip = s->last_buf_size - 8 * main_data_begin; 1319cabdff1aSopenharmony_ci if (skip >= s->gb.size_in_bits - s->extrasize * 8 && s->in_gb.buffer) { 1320cabdff1aSopenharmony_ci skip_bits_long(&s->in_gb, skip - s->gb.size_in_bits + s->extrasize * 8); 1321cabdff1aSopenharmony_ci s->gb = s->in_gb; 1322cabdff1aSopenharmony_ci s->in_gb.buffer = NULL; 1323cabdff1aSopenharmony_ci s->extrasize = 0; 1324cabdff1aSopenharmony_ci } else { 1325cabdff1aSopenharmony_ci skip_bits_long(&s->gb, skip); 1326cabdff1aSopenharmony_ci } 1327cabdff1aSopenharmony_ci } else { 1328cabdff1aSopenharmony_ci gr = 0; 1329cabdff1aSopenharmony_ci s->extrasize = 0; 1330cabdff1aSopenharmony_ci } 1331cabdff1aSopenharmony_ci 1332cabdff1aSopenharmony_ci for (; gr < nb_granules; gr++) { 1333cabdff1aSopenharmony_ci for (ch = 0; ch < s->nb_channels; ch++) { 1334cabdff1aSopenharmony_ci g = &s->granules[ch][gr]; 1335cabdff1aSopenharmony_ci bits_pos = get_bits_count(&s->gb); 1336cabdff1aSopenharmony_ci 1337cabdff1aSopenharmony_ci if (!s->lsf) { 1338cabdff1aSopenharmony_ci uint8_t *sc; 1339cabdff1aSopenharmony_ci int slen, slen1, slen2; 1340cabdff1aSopenharmony_ci 1341cabdff1aSopenharmony_ci /* MPEG-1 scale factors */ 1342cabdff1aSopenharmony_ci slen1 = ff_slen_table[0][g->scalefac_compress]; 1343cabdff1aSopenharmony_ci slen2 = ff_slen_table[1][g->scalefac_compress]; 1344cabdff1aSopenharmony_ci ff_dlog(s->avctx, "slen1=%d slen2=%d\n", slen1, slen2); 1345cabdff1aSopenharmony_ci if (g->block_type == 2) { 1346cabdff1aSopenharmony_ci n = g->switch_point ? 17 : 18; 1347cabdff1aSopenharmony_ci j = 0; 1348cabdff1aSopenharmony_ci if (slen1) { 1349cabdff1aSopenharmony_ci for (i = 0; i < n; i++) 1350cabdff1aSopenharmony_ci g->scale_factors[j++] = get_bits(&s->gb, slen1); 1351cabdff1aSopenharmony_ci } else { 1352cabdff1aSopenharmony_ci for (i = 0; i < n; i++) 1353cabdff1aSopenharmony_ci g->scale_factors[j++] = 0; 1354cabdff1aSopenharmony_ci } 1355cabdff1aSopenharmony_ci if (slen2) { 1356cabdff1aSopenharmony_ci for (i = 0; i < 18; i++) 1357cabdff1aSopenharmony_ci g->scale_factors[j++] = get_bits(&s->gb, slen2); 1358cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) 1359cabdff1aSopenharmony_ci g->scale_factors[j++] = 0; 1360cabdff1aSopenharmony_ci } else { 1361cabdff1aSopenharmony_ci for (i = 0; i < 21; i++) 1362cabdff1aSopenharmony_ci g->scale_factors[j++] = 0; 1363cabdff1aSopenharmony_ci } 1364cabdff1aSopenharmony_ci } else { 1365cabdff1aSopenharmony_ci sc = s->granules[ch][0].scale_factors; 1366cabdff1aSopenharmony_ci j = 0; 1367cabdff1aSopenharmony_ci for (k = 0; k < 4; k++) { 1368cabdff1aSopenharmony_ci n = k == 0 ? 6 : 5; 1369cabdff1aSopenharmony_ci if ((g->scfsi & (0x8 >> k)) == 0) { 1370cabdff1aSopenharmony_ci slen = (k < 2) ? slen1 : slen2; 1371cabdff1aSopenharmony_ci if (slen) { 1372cabdff1aSopenharmony_ci for (i = 0; i < n; i++) 1373cabdff1aSopenharmony_ci g->scale_factors[j++] = get_bits(&s->gb, slen); 1374cabdff1aSopenharmony_ci } else { 1375cabdff1aSopenharmony_ci for (i = 0; i < n; i++) 1376cabdff1aSopenharmony_ci g->scale_factors[j++] = 0; 1377cabdff1aSopenharmony_ci } 1378cabdff1aSopenharmony_ci } else { 1379cabdff1aSopenharmony_ci /* simply copy from last granule */ 1380cabdff1aSopenharmony_ci for (i = 0; i < n; i++) { 1381cabdff1aSopenharmony_ci g->scale_factors[j] = sc[j]; 1382cabdff1aSopenharmony_ci j++; 1383cabdff1aSopenharmony_ci } 1384cabdff1aSopenharmony_ci } 1385cabdff1aSopenharmony_ci } 1386cabdff1aSopenharmony_ci g->scale_factors[j++] = 0; 1387cabdff1aSopenharmony_ci } 1388cabdff1aSopenharmony_ci } else { 1389cabdff1aSopenharmony_ci int tindex, tindex2, slen[4], sl, sf; 1390cabdff1aSopenharmony_ci 1391cabdff1aSopenharmony_ci /* LSF scale factors */ 1392cabdff1aSopenharmony_ci if (g->block_type == 2) 1393cabdff1aSopenharmony_ci tindex = g->switch_point ? 2 : 1; 1394cabdff1aSopenharmony_ci else 1395cabdff1aSopenharmony_ci tindex = 0; 1396cabdff1aSopenharmony_ci 1397cabdff1aSopenharmony_ci sf = g->scalefac_compress; 1398cabdff1aSopenharmony_ci if ((s->mode_ext & MODE_EXT_I_STEREO) && ch == 1) { 1399cabdff1aSopenharmony_ci /* intensity stereo case */ 1400cabdff1aSopenharmony_ci sf >>= 1; 1401cabdff1aSopenharmony_ci if (sf < 180) { 1402cabdff1aSopenharmony_ci lsf_sf_expand(slen, sf, 6, 6, 0); 1403cabdff1aSopenharmony_ci tindex2 = 3; 1404cabdff1aSopenharmony_ci } else if (sf < 244) { 1405cabdff1aSopenharmony_ci lsf_sf_expand(slen, sf - 180, 4, 4, 0); 1406cabdff1aSopenharmony_ci tindex2 = 4; 1407cabdff1aSopenharmony_ci } else { 1408cabdff1aSopenharmony_ci lsf_sf_expand(slen, sf - 244, 3, 0, 0); 1409cabdff1aSopenharmony_ci tindex2 = 5; 1410cabdff1aSopenharmony_ci } 1411cabdff1aSopenharmony_ci } else { 1412cabdff1aSopenharmony_ci /* normal case */ 1413cabdff1aSopenharmony_ci if (sf < 400) { 1414cabdff1aSopenharmony_ci lsf_sf_expand(slen, sf, 5, 4, 4); 1415cabdff1aSopenharmony_ci tindex2 = 0; 1416cabdff1aSopenharmony_ci } else if (sf < 500) { 1417cabdff1aSopenharmony_ci lsf_sf_expand(slen, sf - 400, 5, 4, 0); 1418cabdff1aSopenharmony_ci tindex2 = 1; 1419cabdff1aSopenharmony_ci } else { 1420cabdff1aSopenharmony_ci lsf_sf_expand(slen, sf - 500, 3, 0, 0); 1421cabdff1aSopenharmony_ci tindex2 = 2; 1422cabdff1aSopenharmony_ci g->preflag = 1; 1423cabdff1aSopenharmony_ci } 1424cabdff1aSopenharmony_ci } 1425cabdff1aSopenharmony_ci 1426cabdff1aSopenharmony_ci j = 0; 1427cabdff1aSopenharmony_ci for (k = 0; k < 4; k++) { 1428cabdff1aSopenharmony_ci n = ff_lsf_nsf_table[tindex2][tindex][k]; 1429cabdff1aSopenharmony_ci sl = slen[k]; 1430cabdff1aSopenharmony_ci if (sl) { 1431cabdff1aSopenharmony_ci for (i = 0; i < n; i++) 1432cabdff1aSopenharmony_ci g->scale_factors[j++] = get_bits(&s->gb, sl); 1433cabdff1aSopenharmony_ci } else { 1434cabdff1aSopenharmony_ci for (i = 0; i < n; i++) 1435cabdff1aSopenharmony_ci g->scale_factors[j++] = 0; 1436cabdff1aSopenharmony_ci } 1437cabdff1aSopenharmony_ci } 1438cabdff1aSopenharmony_ci /* XXX: should compute exact size */ 1439cabdff1aSopenharmony_ci for (; j < 40; j++) 1440cabdff1aSopenharmony_ci g->scale_factors[j] = 0; 1441cabdff1aSopenharmony_ci } 1442cabdff1aSopenharmony_ci 1443cabdff1aSopenharmony_ci exponents_from_scale_factors(s, g, exponents); 1444cabdff1aSopenharmony_ci 1445cabdff1aSopenharmony_ci /* read Huffman coded residue */ 1446cabdff1aSopenharmony_ci huffman_decode(s, g, exponents, bits_pos + g->part2_3_length); 1447cabdff1aSopenharmony_ci } /* ch */ 1448cabdff1aSopenharmony_ci 1449cabdff1aSopenharmony_ci if (s->mode == MPA_JSTEREO) 1450cabdff1aSopenharmony_ci compute_stereo(s, &s->granules[0][gr], &s->granules[1][gr]); 1451cabdff1aSopenharmony_ci 1452cabdff1aSopenharmony_ci for (ch = 0; ch < s->nb_channels; ch++) { 1453cabdff1aSopenharmony_ci g = &s->granules[ch][gr]; 1454cabdff1aSopenharmony_ci 1455cabdff1aSopenharmony_ci reorder_block(s, g); 1456cabdff1aSopenharmony_ci compute_antialias(s, g); 1457cabdff1aSopenharmony_ci compute_imdct(s, g, &s->sb_samples[ch][18 * gr][0], s->mdct_buf[ch]); 1458cabdff1aSopenharmony_ci } 1459cabdff1aSopenharmony_ci } /* gr */ 1460cabdff1aSopenharmony_ci if (get_bits_count(&s->gb) < 0) 1461cabdff1aSopenharmony_ci skip_bits_long(&s->gb, -get_bits_count(&s->gb)); 1462cabdff1aSopenharmony_ci return nb_granules * 18; 1463cabdff1aSopenharmony_ci} 1464cabdff1aSopenharmony_ci 1465cabdff1aSopenharmony_cistatic int mp_decode_frame(MPADecodeContext *s, OUT_INT **samples, 1466cabdff1aSopenharmony_ci const uint8_t *buf, int buf_size) 1467cabdff1aSopenharmony_ci{ 1468cabdff1aSopenharmony_ci int i, nb_frames, ch, ret; 1469cabdff1aSopenharmony_ci OUT_INT *samples_ptr; 1470cabdff1aSopenharmony_ci 1471cabdff1aSopenharmony_ci init_get_bits(&s->gb, buf + HEADER_SIZE, (buf_size - HEADER_SIZE) * 8); 1472cabdff1aSopenharmony_ci if (s->error_protection) 1473cabdff1aSopenharmony_ci s->crc = get_bits(&s->gb, 16); 1474cabdff1aSopenharmony_ci 1475cabdff1aSopenharmony_ci switch(s->layer) { 1476cabdff1aSopenharmony_ci case 1: 1477cabdff1aSopenharmony_ci s->avctx->frame_size = 384; 1478cabdff1aSopenharmony_ci nb_frames = mp_decode_layer1(s); 1479cabdff1aSopenharmony_ci break; 1480cabdff1aSopenharmony_ci case 2: 1481cabdff1aSopenharmony_ci s->avctx->frame_size = 1152; 1482cabdff1aSopenharmony_ci nb_frames = mp_decode_layer2(s); 1483cabdff1aSopenharmony_ci break; 1484cabdff1aSopenharmony_ci case 3: 1485cabdff1aSopenharmony_ci s->avctx->frame_size = s->lsf ? 576 : 1152; 1486cabdff1aSopenharmony_ci default: 1487cabdff1aSopenharmony_ci nb_frames = mp_decode_layer3(s); 1488cabdff1aSopenharmony_ci 1489cabdff1aSopenharmony_ci s->last_buf_size=0; 1490cabdff1aSopenharmony_ci if (s->in_gb.buffer) { 1491cabdff1aSopenharmony_ci align_get_bits(&s->gb); 1492cabdff1aSopenharmony_ci i = (get_bits_left(&s->gb) >> 3) - s->extrasize; 1493cabdff1aSopenharmony_ci if (i >= 0 && i <= BACKSTEP_SIZE) { 1494cabdff1aSopenharmony_ci memmove(s->last_buf, s->gb.buffer + (get_bits_count(&s->gb) >> 3), i); 1495cabdff1aSopenharmony_ci s->last_buf_size=i; 1496cabdff1aSopenharmony_ci } else 1497cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "invalid old backstep %d\n", i); 1498cabdff1aSopenharmony_ci s->gb = s->in_gb; 1499cabdff1aSopenharmony_ci s->in_gb.buffer = NULL; 1500cabdff1aSopenharmony_ci s->extrasize = 0; 1501cabdff1aSopenharmony_ci } 1502cabdff1aSopenharmony_ci 1503cabdff1aSopenharmony_ci align_get_bits(&s->gb); 1504cabdff1aSopenharmony_ci av_assert1((get_bits_count(&s->gb) & 7) == 0); 1505cabdff1aSopenharmony_ci i = (get_bits_left(&s->gb) >> 3) - s->extrasize; 1506cabdff1aSopenharmony_ci if (i < 0 || i > BACKSTEP_SIZE || nb_frames < 0) { 1507cabdff1aSopenharmony_ci if (i < 0) 1508cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "invalid new backstep %d\n", i); 1509cabdff1aSopenharmony_ci i = FFMIN(BACKSTEP_SIZE, buf_size - HEADER_SIZE); 1510cabdff1aSopenharmony_ci } 1511cabdff1aSopenharmony_ci av_assert1(i <= buf_size - HEADER_SIZE && i >= 0); 1512cabdff1aSopenharmony_ci memcpy(s->last_buf + s->last_buf_size, s->gb.buffer + buf_size - HEADER_SIZE - i, i); 1513cabdff1aSopenharmony_ci s->last_buf_size += i; 1514cabdff1aSopenharmony_ci } 1515cabdff1aSopenharmony_ci 1516cabdff1aSopenharmony_ci if(nb_frames < 0) 1517cabdff1aSopenharmony_ci return nb_frames; 1518cabdff1aSopenharmony_ci 1519cabdff1aSopenharmony_ci /* get output buffer */ 1520cabdff1aSopenharmony_ci if (!samples) { 1521cabdff1aSopenharmony_ci av_assert0(s->frame); 1522cabdff1aSopenharmony_ci s->frame->nb_samples = s->avctx->frame_size; 1523cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(s->avctx, s->frame, 0)) < 0) 1524cabdff1aSopenharmony_ci return ret; 1525cabdff1aSopenharmony_ci samples = (OUT_INT **)s->frame->extended_data; 1526cabdff1aSopenharmony_ci } 1527cabdff1aSopenharmony_ci 1528cabdff1aSopenharmony_ci /* apply the synthesis filter */ 1529cabdff1aSopenharmony_ci for (ch = 0; ch < s->nb_channels; ch++) { 1530cabdff1aSopenharmony_ci int sample_stride; 1531cabdff1aSopenharmony_ci if (s->avctx->sample_fmt == OUT_FMT_P) { 1532cabdff1aSopenharmony_ci samples_ptr = samples[ch]; 1533cabdff1aSopenharmony_ci sample_stride = 1; 1534cabdff1aSopenharmony_ci } else { 1535cabdff1aSopenharmony_ci samples_ptr = samples[0] + ch; 1536cabdff1aSopenharmony_ci sample_stride = s->nb_channels; 1537cabdff1aSopenharmony_ci } 1538cabdff1aSopenharmony_ci for (i = 0; i < nb_frames; i++) { 1539cabdff1aSopenharmony_ci RENAME(ff_mpa_synth_filter)(&s->mpadsp, s->synth_buf[ch], 1540cabdff1aSopenharmony_ci &(s->synth_buf_offset[ch]), 1541cabdff1aSopenharmony_ci RENAME(ff_mpa_synth_window), 1542cabdff1aSopenharmony_ci &s->dither_state, samples_ptr, 1543cabdff1aSopenharmony_ci sample_stride, s->sb_samples[ch][i]); 1544cabdff1aSopenharmony_ci samples_ptr += 32 * sample_stride; 1545cabdff1aSopenharmony_ci } 1546cabdff1aSopenharmony_ci } 1547cabdff1aSopenharmony_ci 1548cabdff1aSopenharmony_ci return nb_frames * 32 * sizeof(OUT_INT) * s->nb_channels; 1549cabdff1aSopenharmony_ci} 1550cabdff1aSopenharmony_ci 1551cabdff1aSopenharmony_cistatic int decode_frame(AVCodecContext *avctx, AVFrame *frame, 1552cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 1553cabdff1aSopenharmony_ci{ 1554cabdff1aSopenharmony_ci const uint8_t *buf = avpkt->data; 1555cabdff1aSopenharmony_ci int buf_size = avpkt->size; 1556cabdff1aSopenharmony_ci MPADecodeContext *s = avctx->priv_data; 1557cabdff1aSopenharmony_ci uint32_t header; 1558cabdff1aSopenharmony_ci int ret; 1559cabdff1aSopenharmony_ci 1560cabdff1aSopenharmony_ci int skipped = 0; 1561cabdff1aSopenharmony_ci while(buf_size && !*buf){ 1562cabdff1aSopenharmony_ci buf++; 1563cabdff1aSopenharmony_ci buf_size--; 1564cabdff1aSopenharmony_ci skipped++; 1565cabdff1aSopenharmony_ci } 1566cabdff1aSopenharmony_ci 1567cabdff1aSopenharmony_ci if (buf_size < HEADER_SIZE) 1568cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1569cabdff1aSopenharmony_ci 1570cabdff1aSopenharmony_ci header = AV_RB32(buf); 1571cabdff1aSopenharmony_ci if (header >> 8 == AV_RB32("TAG") >> 8) { 1572cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, "discarding ID3 tag\n"); 1573cabdff1aSopenharmony_ci return buf_size + skipped; 1574cabdff1aSopenharmony_ci } 1575cabdff1aSopenharmony_ci ret = avpriv_mpegaudio_decode_header((MPADecodeHeader *)s, header); 1576cabdff1aSopenharmony_ci if (ret < 0) { 1577cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Header missing\n"); 1578cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1579cabdff1aSopenharmony_ci } else if (ret == 1) { 1580cabdff1aSopenharmony_ci /* free format: prepare to compute frame size */ 1581cabdff1aSopenharmony_ci s->frame_size = -1; 1582cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1583cabdff1aSopenharmony_ci } 1584cabdff1aSopenharmony_ci /* update codec info */ 1585cabdff1aSopenharmony_ci av_channel_layout_uninit(&avctx->ch_layout); 1586cabdff1aSopenharmony_ci avctx->ch_layout = s->nb_channels == 1 ? (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO : 1587cabdff1aSopenharmony_ci (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO; 1588cabdff1aSopenharmony_ci if (!avctx->bit_rate) 1589cabdff1aSopenharmony_ci avctx->bit_rate = s->bit_rate; 1590cabdff1aSopenharmony_ci 1591cabdff1aSopenharmony_ci if (s->frame_size <= 0) { 1592cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "incomplete frame\n"); 1593cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1594cabdff1aSopenharmony_ci } else if (s->frame_size < buf_size) { 1595cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, "incorrect frame size - multiple frames in buffer?\n"); 1596cabdff1aSopenharmony_ci buf_size= s->frame_size; 1597cabdff1aSopenharmony_ci } 1598cabdff1aSopenharmony_ci 1599cabdff1aSopenharmony_ci s->frame = frame; 1600cabdff1aSopenharmony_ci 1601cabdff1aSopenharmony_ci ret = mp_decode_frame(s, NULL, buf, buf_size); 1602cabdff1aSopenharmony_ci if (ret >= 0) { 1603cabdff1aSopenharmony_ci s->frame->nb_samples = avctx->frame_size; 1604cabdff1aSopenharmony_ci *got_frame_ptr = 1; 1605cabdff1aSopenharmony_ci avctx->sample_rate = s->sample_rate; 1606cabdff1aSopenharmony_ci //FIXME maybe move the other codec info stuff from above here too 1607cabdff1aSopenharmony_ci } else { 1608cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Error while decoding MPEG audio frame.\n"); 1609cabdff1aSopenharmony_ci /* Only return an error if the bad frame makes up the whole packet or 1610cabdff1aSopenharmony_ci * the error is related to buffer management. 1611cabdff1aSopenharmony_ci * If there is more data in the packet, just consume the bad frame 1612cabdff1aSopenharmony_ci * instead of returning an error, which would discard the whole 1613cabdff1aSopenharmony_ci * packet. */ 1614cabdff1aSopenharmony_ci *got_frame_ptr = 0; 1615cabdff1aSopenharmony_ci if (buf_size == avpkt->size || ret != AVERROR_INVALIDDATA) 1616cabdff1aSopenharmony_ci return ret; 1617cabdff1aSopenharmony_ci } 1618cabdff1aSopenharmony_ci s->frame_size = 0; 1619cabdff1aSopenharmony_ci return buf_size + skipped; 1620cabdff1aSopenharmony_ci} 1621cabdff1aSopenharmony_ci 1622cabdff1aSopenharmony_cistatic void mp_flush(MPADecodeContext *ctx) 1623cabdff1aSopenharmony_ci{ 1624cabdff1aSopenharmony_ci memset(ctx->synth_buf, 0, sizeof(ctx->synth_buf)); 1625cabdff1aSopenharmony_ci memset(ctx->mdct_buf, 0, sizeof(ctx->mdct_buf)); 1626cabdff1aSopenharmony_ci ctx->last_buf_size = 0; 1627cabdff1aSopenharmony_ci ctx->dither_state = 0; 1628cabdff1aSopenharmony_ci} 1629cabdff1aSopenharmony_ci 1630cabdff1aSopenharmony_cistatic void flush(AVCodecContext *avctx) 1631cabdff1aSopenharmony_ci{ 1632cabdff1aSopenharmony_ci mp_flush(avctx->priv_data); 1633cabdff1aSopenharmony_ci} 1634cabdff1aSopenharmony_ci 1635cabdff1aSopenharmony_ci#if CONFIG_MP3ADU_DECODER || CONFIG_MP3ADUFLOAT_DECODER 1636cabdff1aSopenharmony_cistatic int decode_frame_adu(AVCodecContext *avctx, AVFrame *frame, 1637cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 1638cabdff1aSopenharmony_ci{ 1639cabdff1aSopenharmony_ci const uint8_t *buf = avpkt->data; 1640cabdff1aSopenharmony_ci int buf_size = avpkt->size; 1641cabdff1aSopenharmony_ci MPADecodeContext *s = avctx->priv_data; 1642cabdff1aSopenharmony_ci uint32_t header; 1643cabdff1aSopenharmony_ci int len, ret; 1644cabdff1aSopenharmony_ci 1645cabdff1aSopenharmony_ci len = buf_size; 1646cabdff1aSopenharmony_ci 1647cabdff1aSopenharmony_ci // Discard too short frames 1648cabdff1aSopenharmony_ci if (buf_size < HEADER_SIZE) { 1649cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Packet is too small\n"); 1650cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1651cabdff1aSopenharmony_ci } 1652cabdff1aSopenharmony_ci 1653cabdff1aSopenharmony_ci 1654cabdff1aSopenharmony_ci if (len > MPA_MAX_CODED_FRAME_SIZE) 1655cabdff1aSopenharmony_ci len = MPA_MAX_CODED_FRAME_SIZE; 1656cabdff1aSopenharmony_ci 1657cabdff1aSopenharmony_ci // Get header and restore sync word 1658cabdff1aSopenharmony_ci header = AV_RB32(buf) | 0xffe00000; 1659cabdff1aSopenharmony_ci 1660cabdff1aSopenharmony_ci ret = avpriv_mpegaudio_decode_header((MPADecodeHeader *)s, header); 1661cabdff1aSopenharmony_ci if (ret < 0) { 1662cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Invalid frame header\n"); 1663cabdff1aSopenharmony_ci return ret; 1664cabdff1aSopenharmony_ci } 1665cabdff1aSopenharmony_ci /* update codec info */ 1666cabdff1aSopenharmony_ci avctx->sample_rate = s->sample_rate; 1667cabdff1aSopenharmony_ci av_channel_layout_uninit(&avctx->ch_layout); 1668cabdff1aSopenharmony_ci avctx->ch_layout = s->nb_channels == 1 ? (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO : 1669cabdff1aSopenharmony_ci (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO; 1670cabdff1aSopenharmony_ci if (!avctx->bit_rate) 1671cabdff1aSopenharmony_ci avctx->bit_rate = s->bit_rate; 1672cabdff1aSopenharmony_ci 1673cabdff1aSopenharmony_ci s->frame_size = len; 1674cabdff1aSopenharmony_ci 1675cabdff1aSopenharmony_ci s->frame = frame; 1676cabdff1aSopenharmony_ci 1677cabdff1aSopenharmony_ci ret = mp_decode_frame(s, NULL, buf, buf_size); 1678cabdff1aSopenharmony_ci if (ret < 0) { 1679cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Error while decoding MPEG audio frame.\n"); 1680cabdff1aSopenharmony_ci return ret; 1681cabdff1aSopenharmony_ci } 1682cabdff1aSopenharmony_ci 1683cabdff1aSopenharmony_ci *got_frame_ptr = 1; 1684cabdff1aSopenharmony_ci 1685cabdff1aSopenharmony_ci return buf_size; 1686cabdff1aSopenharmony_ci} 1687cabdff1aSopenharmony_ci#endif /* CONFIG_MP3ADU_DECODER || CONFIG_MP3ADUFLOAT_DECODER */ 1688cabdff1aSopenharmony_ci 1689cabdff1aSopenharmony_ci#if CONFIG_MP3ON4_DECODER || CONFIG_MP3ON4FLOAT_DECODER 1690cabdff1aSopenharmony_ci 1691cabdff1aSopenharmony_ci/** 1692cabdff1aSopenharmony_ci * Context for MP3On4 decoder 1693cabdff1aSopenharmony_ci */ 1694cabdff1aSopenharmony_citypedef struct MP3On4DecodeContext { 1695cabdff1aSopenharmony_ci int frames; ///< number of mp3 frames per block (number of mp3 decoder instances) 1696cabdff1aSopenharmony_ci int syncword; ///< syncword patch 1697cabdff1aSopenharmony_ci const uint8_t *coff; ///< channel offsets in output buffer 1698cabdff1aSopenharmony_ci MPADecodeContext *mp3decctx[5]; ///< MPADecodeContext for every decoder instance 1699cabdff1aSopenharmony_ci} MP3On4DecodeContext; 1700cabdff1aSopenharmony_ci 1701cabdff1aSopenharmony_ci#include "mpeg4audio.h" 1702cabdff1aSopenharmony_ci 1703cabdff1aSopenharmony_ci/* Next 3 arrays are indexed by channel config number (passed via codecdata) */ 1704cabdff1aSopenharmony_ci 1705cabdff1aSopenharmony_ci/* number of mp3 decoder instances */ 1706cabdff1aSopenharmony_cistatic const uint8_t mp3Frames[8] = { 0, 1, 1, 2, 3, 3, 4, 5 }; 1707cabdff1aSopenharmony_ci 1708cabdff1aSopenharmony_ci/* offsets into output buffer, assume output order is FL FR C LFE BL BR SL SR */ 1709cabdff1aSopenharmony_cistatic const uint8_t chan_offset[8][5] = { 1710cabdff1aSopenharmony_ci { 0 }, 1711cabdff1aSopenharmony_ci { 0 }, // C 1712cabdff1aSopenharmony_ci { 0 }, // FLR 1713cabdff1aSopenharmony_ci { 2, 0 }, // C FLR 1714cabdff1aSopenharmony_ci { 2, 0, 3 }, // C FLR BS 1715cabdff1aSopenharmony_ci { 2, 0, 3 }, // C FLR BLRS 1716cabdff1aSopenharmony_ci { 2, 0, 4, 3 }, // C FLR BLRS LFE 1717cabdff1aSopenharmony_ci { 2, 0, 6, 4, 3 }, // C FLR BLRS BLR LFE 1718cabdff1aSopenharmony_ci}; 1719cabdff1aSopenharmony_ci 1720cabdff1aSopenharmony_ci/* mp3on4 channel layouts */ 1721cabdff1aSopenharmony_cistatic const int16_t chan_layout[8] = { 1722cabdff1aSopenharmony_ci 0, 1723cabdff1aSopenharmony_ci AV_CH_LAYOUT_MONO, 1724cabdff1aSopenharmony_ci AV_CH_LAYOUT_STEREO, 1725cabdff1aSopenharmony_ci AV_CH_LAYOUT_SURROUND, 1726cabdff1aSopenharmony_ci AV_CH_LAYOUT_4POINT0, 1727cabdff1aSopenharmony_ci AV_CH_LAYOUT_5POINT0, 1728cabdff1aSopenharmony_ci AV_CH_LAYOUT_5POINT1, 1729cabdff1aSopenharmony_ci AV_CH_LAYOUT_7POINT1 1730cabdff1aSopenharmony_ci}; 1731cabdff1aSopenharmony_ci 1732cabdff1aSopenharmony_cistatic av_cold int decode_close_mp3on4(AVCodecContext * avctx) 1733cabdff1aSopenharmony_ci{ 1734cabdff1aSopenharmony_ci MP3On4DecodeContext *s = avctx->priv_data; 1735cabdff1aSopenharmony_ci int i; 1736cabdff1aSopenharmony_ci 1737cabdff1aSopenharmony_ci for (i = 0; i < s->frames; i++) 1738cabdff1aSopenharmony_ci av_freep(&s->mp3decctx[i]); 1739cabdff1aSopenharmony_ci 1740cabdff1aSopenharmony_ci return 0; 1741cabdff1aSopenharmony_ci} 1742cabdff1aSopenharmony_ci 1743cabdff1aSopenharmony_ci 1744cabdff1aSopenharmony_cistatic av_cold int decode_init_mp3on4(AVCodecContext * avctx) 1745cabdff1aSopenharmony_ci{ 1746cabdff1aSopenharmony_ci MP3On4DecodeContext *s = avctx->priv_data; 1747cabdff1aSopenharmony_ci MPEG4AudioConfig cfg; 1748cabdff1aSopenharmony_ci int i, ret; 1749cabdff1aSopenharmony_ci 1750cabdff1aSopenharmony_ci if ((avctx->extradata_size < 2) || !avctx->extradata) { 1751cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Codec extradata missing or too short.\n"); 1752cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1753cabdff1aSopenharmony_ci } 1754cabdff1aSopenharmony_ci 1755cabdff1aSopenharmony_ci avpriv_mpeg4audio_get_config2(&cfg, avctx->extradata, 1756cabdff1aSopenharmony_ci avctx->extradata_size, 1, avctx); 1757cabdff1aSopenharmony_ci if (!cfg.chan_config || cfg.chan_config > 7) { 1758cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Invalid channel config number.\n"); 1759cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1760cabdff1aSopenharmony_ci } 1761cabdff1aSopenharmony_ci s->frames = mp3Frames[cfg.chan_config]; 1762cabdff1aSopenharmony_ci s->coff = chan_offset[cfg.chan_config]; 1763cabdff1aSopenharmony_ci av_channel_layout_uninit(&avctx->ch_layout); 1764cabdff1aSopenharmony_ci av_channel_layout_from_mask(&avctx->ch_layout, chan_layout[cfg.chan_config]); 1765cabdff1aSopenharmony_ci 1766cabdff1aSopenharmony_ci if (cfg.sample_rate < 16000) 1767cabdff1aSopenharmony_ci s->syncword = 0xffe00000; 1768cabdff1aSopenharmony_ci else 1769cabdff1aSopenharmony_ci s->syncword = 0xfff00000; 1770cabdff1aSopenharmony_ci 1771cabdff1aSopenharmony_ci /* Init the first mp3 decoder in standard way, so that all tables get builded 1772cabdff1aSopenharmony_ci * We replace avctx->priv_data with the context of the first decoder so that 1773cabdff1aSopenharmony_ci * decode_init() does not have to be changed. 1774cabdff1aSopenharmony_ci * Other decoders will be initialized here copying data from the first context 1775cabdff1aSopenharmony_ci */ 1776cabdff1aSopenharmony_ci // Allocate zeroed memory for the first decoder context 1777cabdff1aSopenharmony_ci s->mp3decctx[0] = av_mallocz(sizeof(MPADecodeContext)); 1778cabdff1aSopenharmony_ci if (!s->mp3decctx[0]) 1779cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1780cabdff1aSopenharmony_ci // Put decoder context in place to make init_decode() happy 1781cabdff1aSopenharmony_ci avctx->priv_data = s->mp3decctx[0]; 1782cabdff1aSopenharmony_ci ret = decode_init(avctx); 1783cabdff1aSopenharmony_ci // Restore mp3on4 context pointer 1784cabdff1aSopenharmony_ci avctx->priv_data = s; 1785cabdff1aSopenharmony_ci if (ret < 0) 1786cabdff1aSopenharmony_ci return ret; 1787cabdff1aSopenharmony_ci s->mp3decctx[0]->adu_mode = 1; // Set adu mode 1788cabdff1aSopenharmony_ci 1789cabdff1aSopenharmony_ci /* Create a separate codec/context for each frame (first is already ok). 1790cabdff1aSopenharmony_ci * Each frame is 1 or 2 channels - up to 5 frames allowed 1791cabdff1aSopenharmony_ci */ 1792cabdff1aSopenharmony_ci for (i = 1; i < s->frames; i++) { 1793cabdff1aSopenharmony_ci s->mp3decctx[i] = av_mallocz(sizeof(MPADecodeContext)); 1794cabdff1aSopenharmony_ci if (!s->mp3decctx[i]) 1795cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1796cabdff1aSopenharmony_ci s->mp3decctx[i]->adu_mode = 1; 1797cabdff1aSopenharmony_ci s->mp3decctx[i]->avctx = avctx; 1798cabdff1aSopenharmony_ci s->mp3decctx[i]->mpadsp = s->mp3decctx[0]->mpadsp; 1799cabdff1aSopenharmony_ci s->mp3decctx[i]->butterflies_float = s->mp3decctx[0]->butterflies_float; 1800cabdff1aSopenharmony_ci } 1801cabdff1aSopenharmony_ci 1802cabdff1aSopenharmony_ci return 0; 1803cabdff1aSopenharmony_ci} 1804cabdff1aSopenharmony_ci 1805cabdff1aSopenharmony_ci 1806cabdff1aSopenharmony_cistatic void flush_mp3on4(AVCodecContext *avctx) 1807cabdff1aSopenharmony_ci{ 1808cabdff1aSopenharmony_ci int i; 1809cabdff1aSopenharmony_ci MP3On4DecodeContext *s = avctx->priv_data; 1810cabdff1aSopenharmony_ci 1811cabdff1aSopenharmony_ci for (i = 0; i < s->frames; i++) 1812cabdff1aSopenharmony_ci mp_flush(s->mp3decctx[i]); 1813cabdff1aSopenharmony_ci} 1814cabdff1aSopenharmony_ci 1815cabdff1aSopenharmony_ci 1816cabdff1aSopenharmony_cistatic int decode_frame_mp3on4(AVCodecContext *avctx, AVFrame *frame, 1817cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 1818cabdff1aSopenharmony_ci{ 1819cabdff1aSopenharmony_ci const uint8_t *buf = avpkt->data; 1820cabdff1aSopenharmony_ci int buf_size = avpkt->size; 1821cabdff1aSopenharmony_ci MP3On4DecodeContext *s = avctx->priv_data; 1822cabdff1aSopenharmony_ci MPADecodeContext *m; 1823cabdff1aSopenharmony_ci int fsize, len = buf_size, out_size = 0; 1824cabdff1aSopenharmony_ci uint32_t header; 1825cabdff1aSopenharmony_ci OUT_INT **out_samples; 1826cabdff1aSopenharmony_ci OUT_INT *outptr[2]; 1827cabdff1aSopenharmony_ci int fr, ch, ret; 1828cabdff1aSopenharmony_ci 1829cabdff1aSopenharmony_ci /* get output buffer */ 1830cabdff1aSopenharmony_ci frame->nb_samples = MPA_FRAME_SIZE; 1831cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 1832cabdff1aSopenharmony_ci return ret; 1833cabdff1aSopenharmony_ci out_samples = (OUT_INT **)frame->extended_data; 1834cabdff1aSopenharmony_ci 1835cabdff1aSopenharmony_ci // Discard too short frames 1836cabdff1aSopenharmony_ci if (buf_size < HEADER_SIZE) 1837cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1838cabdff1aSopenharmony_ci 1839cabdff1aSopenharmony_ci avctx->bit_rate = 0; 1840cabdff1aSopenharmony_ci 1841cabdff1aSopenharmony_ci ch = 0; 1842cabdff1aSopenharmony_ci for (fr = 0; fr < s->frames; fr++) { 1843cabdff1aSopenharmony_ci fsize = AV_RB16(buf) >> 4; 1844cabdff1aSopenharmony_ci fsize = FFMIN3(fsize, len, MPA_MAX_CODED_FRAME_SIZE); 1845cabdff1aSopenharmony_ci m = s->mp3decctx[fr]; 1846cabdff1aSopenharmony_ci av_assert1(m); 1847cabdff1aSopenharmony_ci 1848cabdff1aSopenharmony_ci if (fsize < HEADER_SIZE) { 1849cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Frame size smaller than header size\n"); 1850cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1851cabdff1aSopenharmony_ci } 1852cabdff1aSopenharmony_ci header = (AV_RB32(buf) & 0x000fffff) | s->syncword; // patch header 1853cabdff1aSopenharmony_ci 1854cabdff1aSopenharmony_ci ret = avpriv_mpegaudio_decode_header((MPADecodeHeader *)m, header); 1855cabdff1aSopenharmony_ci if (ret < 0) { 1856cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Bad header, discard block\n"); 1857cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1858cabdff1aSopenharmony_ci } 1859cabdff1aSopenharmony_ci 1860cabdff1aSopenharmony_ci if (ch + m->nb_channels > avctx->ch_layout.nb_channels || 1861cabdff1aSopenharmony_ci s->coff[fr] + m->nb_channels > avctx->ch_layout.nb_channels) { 1862cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "frame channel count exceeds codec " 1863cabdff1aSopenharmony_ci "channel count\n"); 1864cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1865cabdff1aSopenharmony_ci } 1866cabdff1aSopenharmony_ci ch += m->nb_channels; 1867cabdff1aSopenharmony_ci 1868cabdff1aSopenharmony_ci outptr[0] = out_samples[s->coff[fr]]; 1869cabdff1aSopenharmony_ci if (m->nb_channels > 1) 1870cabdff1aSopenharmony_ci outptr[1] = out_samples[s->coff[fr] + 1]; 1871cabdff1aSopenharmony_ci 1872cabdff1aSopenharmony_ci if ((ret = mp_decode_frame(m, outptr, buf, fsize)) < 0) { 1873cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "failed to decode channel %d\n", ch); 1874cabdff1aSopenharmony_ci memset(outptr[0], 0, MPA_FRAME_SIZE*sizeof(OUT_INT)); 1875cabdff1aSopenharmony_ci if (m->nb_channels > 1) 1876cabdff1aSopenharmony_ci memset(outptr[1], 0, MPA_FRAME_SIZE*sizeof(OUT_INT)); 1877cabdff1aSopenharmony_ci ret = m->nb_channels * MPA_FRAME_SIZE*sizeof(OUT_INT); 1878cabdff1aSopenharmony_ci } 1879cabdff1aSopenharmony_ci 1880cabdff1aSopenharmony_ci out_size += ret; 1881cabdff1aSopenharmony_ci buf += fsize; 1882cabdff1aSopenharmony_ci len -= fsize; 1883cabdff1aSopenharmony_ci 1884cabdff1aSopenharmony_ci avctx->bit_rate += m->bit_rate; 1885cabdff1aSopenharmony_ci } 1886cabdff1aSopenharmony_ci if (ch != avctx->ch_layout.nb_channels) { 1887cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "failed to decode all channels\n"); 1888cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1889cabdff1aSopenharmony_ci } 1890cabdff1aSopenharmony_ci 1891cabdff1aSopenharmony_ci /* update codec info */ 1892cabdff1aSopenharmony_ci avctx->sample_rate = s->mp3decctx[0]->sample_rate; 1893cabdff1aSopenharmony_ci 1894cabdff1aSopenharmony_ci frame->nb_samples = out_size / (avctx->ch_layout.nb_channels * sizeof(OUT_INT)); 1895cabdff1aSopenharmony_ci *got_frame_ptr = 1; 1896cabdff1aSopenharmony_ci 1897cabdff1aSopenharmony_ci return buf_size; 1898cabdff1aSopenharmony_ci} 1899cabdff1aSopenharmony_ci#endif /* CONFIG_MP3ON4_DECODER || CONFIG_MP3ON4FLOAT_DECODER */ 1900