1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * AAC decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2005-2006 Oded Shimon ( ods15 ods15 dyndns org ) 4cabdff1aSopenharmony_ci * Copyright (c) 2006-2007 Maxim Gavrilov ( maxim.gavrilov gmail com ) 5cabdff1aSopenharmony_ci * Copyright (c) 2008-2013 Alex Converse <alex.converse@gmail.com> 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * AAC LATM decoder 8cabdff1aSopenharmony_ci * Copyright (c) 2008-2010 Paul Kendall <paul@kcbbs.gen.nz> 9cabdff1aSopenharmony_ci * Copyright (c) 2010 Janne Grunau <janne-libav@jannau.net> 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * This file is part of FFmpeg. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 14cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 16cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 19cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 20cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21cabdff1aSopenharmony_ci * Lesser General Public License for more details. 22cabdff1aSopenharmony_ci * 23cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 24cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 25cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci/** 29cabdff1aSopenharmony_ci * @file 30cabdff1aSopenharmony_ci * AAC decoder 31cabdff1aSopenharmony_ci * @author Oded Shimon ( ods15 ods15 dyndns org ) 32cabdff1aSopenharmony_ci * @author Maxim Gavrilov ( maxim.gavrilov gmail com ) 33cabdff1aSopenharmony_ci */ 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_ci#define FFT_FLOAT 1 36cabdff1aSopenharmony_ci#define USE_FIXED 0 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci#include "libavutil/float_dsp.h" 39cabdff1aSopenharmony_ci#include "libavutil/opt.h" 40cabdff1aSopenharmony_ci#include "avcodec.h" 41cabdff1aSopenharmony_ci#include "codec_internal.h" 42cabdff1aSopenharmony_ci#include "get_bits.h" 43cabdff1aSopenharmony_ci#include "fft.h" 44cabdff1aSopenharmony_ci#include "mdct15.h" 45cabdff1aSopenharmony_ci#include "lpc.h" 46cabdff1aSopenharmony_ci#include "kbdwin.h" 47cabdff1aSopenharmony_ci#include "sinewin.h" 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_ci#include "aac.h" 50cabdff1aSopenharmony_ci#include "aactab.h" 51cabdff1aSopenharmony_ci#include "aacdectab.h" 52cabdff1aSopenharmony_ci#include "adts_header.h" 53cabdff1aSopenharmony_ci#include "cbrt_data.h" 54cabdff1aSopenharmony_ci#include "sbr.h" 55cabdff1aSopenharmony_ci#include "aacsbr.h" 56cabdff1aSopenharmony_ci#include "mpeg4audio.h" 57cabdff1aSopenharmony_ci#include "profiles.h" 58cabdff1aSopenharmony_ci#include "libavutil/intfloat.h" 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci#include <errno.h> 61cabdff1aSopenharmony_ci#include <math.h> 62cabdff1aSopenharmony_ci#include <stdint.h> 63cabdff1aSopenharmony_ci#include <string.h> 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ci#if ARCH_ARM 66cabdff1aSopenharmony_ci# include "arm/aac.h" 67cabdff1aSopenharmony_ci#elif ARCH_MIPS 68cabdff1aSopenharmony_ci# include "mips/aacdec_mips.h" 69cabdff1aSopenharmony_ci#endif 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ciDECLARE_ALIGNED(32, static INTFLOAT, AAC_RENAME(sine_120))[120]; 72cabdff1aSopenharmony_ciDECLARE_ALIGNED(32, static INTFLOAT, AAC_RENAME(sine_960))[960]; 73cabdff1aSopenharmony_ciDECLARE_ALIGNED(32, static INTFLOAT, AAC_RENAME(aac_kbd_long_960))[960]; 74cabdff1aSopenharmony_ciDECLARE_ALIGNED(32, static INTFLOAT, AAC_RENAME(aac_kbd_short_120))[120]; 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_cistatic av_always_inline void reset_predict_state(PredictorState *ps) 77cabdff1aSopenharmony_ci{ 78cabdff1aSopenharmony_ci ps->r0 = 0.0f; 79cabdff1aSopenharmony_ci ps->r1 = 0.0f; 80cabdff1aSopenharmony_ci ps->cor0 = 0.0f; 81cabdff1aSopenharmony_ci ps->cor1 = 0.0f; 82cabdff1aSopenharmony_ci ps->var0 = 1.0f; 83cabdff1aSopenharmony_ci ps->var1 = 1.0f; 84cabdff1aSopenharmony_ci} 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci#ifndef VMUL2 87cabdff1aSopenharmony_cistatic inline float *VMUL2(float *dst, const float *v, unsigned idx, 88cabdff1aSopenharmony_ci const float *scale) 89cabdff1aSopenharmony_ci{ 90cabdff1aSopenharmony_ci float s = *scale; 91cabdff1aSopenharmony_ci *dst++ = v[idx & 15] * s; 92cabdff1aSopenharmony_ci *dst++ = v[idx>>4 & 15] * s; 93cabdff1aSopenharmony_ci return dst; 94cabdff1aSopenharmony_ci} 95cabdff1aSopenharmony_ci#endif 96cabdff1aSopenharmony_ci 97cabdff1aSopenharmony_ci#ifndef VMUL4 98cabdff1aSopenharmony_cistatic inline float *VMUL4(float *dst, const float *v, unsigned idx, 99cabdff1aSopenharmony_ci const float *scale) 100cabdff1aSopenharmony_ci{ 101cabdff1aSopenharmony_ci float s = *scale; 102cabdff1aSopenharmony_ci *dst++ = v[idx & 3] * s; 103cabdff1aSopenharmony_ci *dst++ = v[idx>>2 & 3] * s; 104cabdff1aSopenharmony_ci *dst++ = v[idx>>4 & 3] * s; 105cabdff1aSopenharmony_ci *dst++ = v[idx>>6 & 3] * s; 106cabdff1aSopenharmony_ci return dst; 107cabdff1aSopenharmony_ci} 108cabdff1aSopenharmony_ci#endif 109cabdff1aSopenharmony_ci 110cabdff1aSopenharmony_ci#ifndef VMUL2S 111cabdff1aSopenharmony_cistatic inline float *VMUL2S(float *dst, const float *v, unsigned idx, 112cabdff1aSopenharmony_ci unsigned sign, const float *scale) 113cabdff1aSopenharmony_ci{ 114cabdff1aSopenharmony_ci union av_intfloat32 s0, s1; 115cabdff1aSopenharmony_ci 116cabdff1aSopenharmony_ci s0.f = s1.f = *scale; 117cabdff1aSopenharmony_ci s0.i ^= sign >> 1 << 31; 118cabdff1aSopenharmony_ci s1.i ^= sign << 31; 119cabdff1aSopenharmony_ci 120cabdff1aSopenharmony_ci *dst++ = v[idx & 15] * s0.f; 121cabdff1aSopenharmony_ci *dst++ = v[idx>>4 & 15] * s1.f; 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_ci return dst; 124cabdff1aSopenharmony_ci} 125cabdff1aSopenharmony_ci#endif 126cabdff1aSopenharmony_ci 127cabdff1aSopenharmony_ci#ifndef VMUL4S 128cabdff1aSopenharmony_cistatic inline float *VMUL4S(float *dst, const float *v, unsigned idx, 129cabdff1aSopenharmony_ci unsigned sign, const float *scale) 130cabdff1aSopenharmony_ci{ 131cabdff1aSopenharmony_ci unsigned nz = idx >> 12; 132cabdff1aSopenharmony_ci union av_intfloat32 s = { .f = *scale }; 133cabdff1aSopenharmony_ci union av_intfloat32 t; 134cabdff1aSopenharmony_ci 135cabdff1aSopenharmony_ci t.i = s.i ^ (sign & 1U<<31); 136cabdff1aSopenharmony_ci *dst++ = v[idx & 3] * t.f; 137cabdff1aSopenharmony_ci 138cabdff1aSopenharmony_ci sign <<= nz & 1; nz >>= 1; 139cabdff1aSopenharmony_ci t.i = s.i ^ (sign & 1U<<31); 140cabdff1aSopenharmony_ci *dst++ = v[idx>>2 & 3] * t.f; 141cabdff1aSopenharmony_ci 142cabdff1aSopenharmony_ci sign <<= nz & 1; nz >>= 1; 143cabdff1aSopenharmony_ci t.i = s.i ^ (sign & 1U<<31); 144cabdff1aSopenharmony_ci *dst++ = v[idx>>4 & 3] * t.f; 145cabdff1aSopenharmony_ci 146cabdff1aSopenharmony_ci sign <<= nz & 1; 147cabdff1aSopenharmony_ci t.i = s.i ^ (sign & 1U<<31); 148cabdff1aSopenharmony_ci *dst++ = v[idx>>6 & 3] * t.f; 149cabdff1aSopenharmony_ci 150cabdff1aSopenharmony_ci return dst; 151cabdff1aSopenharmony_ci} 152cabdff1aSopenharmony_ci#endif 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_cistatic av_always_inline float flt16_round(float pf) 155cabdff1aSopenharmony_ci{ 156cabdff1aSopenharmony_ci union av_intfloat32 tmp; 157cabdff1aSopenharmony_ci tmp.f = pf; 158cabdff1aSopenharmony_ci tmp.i = (tmp.i + 0x00008000U) & 0xFFFF0000U; 159cabdff1aSopenharmony_ci return tmp.f; 160cabdff1aSopenharmony_ci} 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_cistatic av_always_inline float flt16_even(float pf) 163cabdff1aSopenharmony_ci{ 164cabdff1aSopenharmony_ci union av_intfloat32 tmp; 165cabdff1aSopenharmony_ci tmp.f = pf; 166cabdff1aSopenharmony_ci tmp.i = (tmp.i + 0x00007FFFU + (tmp.i & 0x00010000U >> 16)) & 0xFFFF0000U; 167cabdff1aSopenharmony_ci return tmp.f; 168cabdff1aSopenharmony_ci} 169cabdff1aSopenharmony_ci 170cabdff1aSopenharmony_cistatic av_always_inline float flt16_trunc(float pf) 171cabdff1aSopenharmony_ci{ 172cabdff1aSopenharmony_ci union av_intfloat32 pun; 173cabdff1aSopenharmony_ci pun.f = pf; 174cabdff1aSopenharmony_ci pun.i &= 0xFFFF0000U; 175cabdff1aSopenharmony_ci return pun.f; 176cabdff1aSopenharmony_ci} 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_cistatic av_always_inline void predict(PredictorState *ps, float *coef, 179cabdff1aSopenharmony_ci int output_enable) 180cabdff1aSopenharmony_ci{ 181cabdff1aSopenharmony_ci const float a = 0.953125; // 61.0 / 64 182cabdff1aSopenharmony_ci const float alpha = 0.90625; // 29.0 / 32 183cabdff1aSopenharmony_ci float e0, e1; 184cabdff1aSopenharmony_ci float pv; 185cabdff1aSopenharmony_ci float k1, k2; 186cabdff1aSopenharmony_ci float r0 = ps->r0, r1 = ps->r1; 187cabdff1aSopenharmony_ci float cor0 = ps->cor0, cor1 = ps->cor1; 188cabdff1aSopenharmony_ci float var0 = ps->var0, var1 = ps->var1; 189cabdff1aSopenharmony_ci 190cabdff1aSopenharmony_ci k1 = var0 > 1 ? cor0 * flt16_even(a / var0) : 0; 191cabdff1aSopenharmony_ci k2 = var1 > 1 ? cor1 * flt16_even(a / var1) : 0; 192cabdff1aSopenharmony_ci 193cabdff1aSopenharmony_ci pv = flt16_round(k1 * r0 + k2 * r1); 194cabdff1aSopenharmony_ci if (output_enable) 195cabdff1aSopenharmony_ci *coef += pv; 196cabdff1aSopenharmony_ci 197cabdff1aSopenharmony_ci e0 = *coef; 198cabdff1aSopenharmony_ci e1 = e0 - k1 * r0; 199cabdff1aSopenharmony_ci 200cabdff1aSopenharmony_ci ps->cor1 = flt16_trunc(alpha * cor1 + r1 * e1); 201cabdff1aSopenharmony_ci ps->var1 = flt16_trunc(alpha * var1 + 0.5f * (r1 * r1 + e1 * e1)); 202cabdff1aSopenharmony_ci ps->cor0 = flt16_trunc(alpha * cor0 + r0 * e0); 203cabdff1aSopenharmony_ci ps->var0 = flt16_trunc(alpha * var0 + 0.5f * (r0 * r0 + e0 * e0)); 204cabdff1aSopenharmony_ci 205cabdff1aSopenharmony_ci ps->r1 = flt16_trunc(a * (r0 - k1 * e0)); 206cabdff1aSopenharmony_ci ps->r0 = flt16_trunc(a * e0); 207cabdff1aSopenharmony_ci} 208cabdff1aSopenharmony_ci 209cabdff1aSopenharmony_ci/** 210cabdff1aSopenharmony_ci * Apply dependent channel coupling (applied before IMDCT). 211cabdff1aSopenharmony_ci * 212cabdff1aSopenharmony_ci * @param index index into coupling gain array 213cabdff1aSopenharmony_ci */ 214cabdff1aSopenharmony_cistatic void apply_dependent_coupling(AACContext *ac, 215cabdff1aSopenharmony_ci SingleChannelElement *target, 216cabdff1aSopenharmony_ci ChannelElement *cce, int index) 217cabdff1aSopenharmony_ci{ 218cabdff1aSopenharmony_ci IndividualChannelStream *ics = &cce->ch[0].ics; 219cabdff1aSopenharmony_ci const uint16_t *offsets = ics->swb_offset; 220cabdff1aSopenharmony_ci float *dest = target->coeffs; 221cabdff1aSopenharmony_ci const float *src = cce->ch[0].coeffs; 222cabdff1aSopenharmony_ci int g, i, group, k, idx = 0; 223cabdff1aSopenharmony_ci if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP) { 224cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 225cabdff1aSopenharmony_ci "Dependent coupling is not supported together with LTP\n"); 226cabdff1aSopenharmony_ci return; 227cabdff1aSopenharmony_ci } 228cabdff1aSopenharmony_ci for (g = 0; g < ics->num_window_groups; g++) { 229cabdff1aSopenharmony_ci for (i = 0; i < ics->max_sfb; i++, idx++) { 230cabdff1aSopenharmony_ci if (cce->ch[0].band_type[idx] != ZERO_BT) { 231cabdff1aSopenharmony_ci const float gain = cce->coup.gain[index][idx]; 232cabdff1aSopenharmony_ci for (group = 0; group < ics->group_len[g]; group++) { 233cabdff1aSopenharmony_ci for (k = offsets[i]; k < offsets[i + 1]; k++) { 234cabdff1aSopenharmony_ci // FIXME: SIMDify 235cabdff1aSopenharmony_ci dest[group * 128 + k] += gain * src[group * 128 + k]; 236cabdff1aSopenharmony_ci } 237cabdff1aSopenharmony_ci } 238cabdff1aSopenharmony_ci } 239cabdff1aSopenharmony_ci } 240cabdff1aSopenharmony_ci dest += ics->group_len[g] * 128; 241cabdff1aSopenharmony_ci src += ics->group_len[g] * 128; 242cabdff1aSopenharmony_ci } 243cabdff1aSopenharmony_ci} 244cabdff1aSopenharmony_ci 245cabdff1aSopenharmony_ci/** 246cabdff1aSopenharmony_ci * Apply independent channel coupling (applied after IMDCT). 247cabdff1aSopenharmony_ci * 248cabdff1aSopenharmony_ci * @param index index into coupling gain array 249cabdff1aSopenharmony_ci */ 250cabdff1aSopenharmony_cistatic void apply_independent_coupling(AACContext *ac, 251cabdff1aSopenharmony_ci SingleChannelElement *target, 252cabdff1aSopenharmony_ci ChannelElement *cce, int index) 253cabdff1aSopenharmony_ci{ 254cabdff1aSopenharmony_ci const float gain = cce->coup.gain[index][0]; 255cabdff1aSopenharmony_ci const float *src = cce->ch[0].ret; 256cabdff1aSopenharmony_ci float *dest = target->ret; 257cabdff1aSopenharmony_ci const int len = 1024 << (ac->oc[1].m4ac.sbr == 1); 258cabdff1aSopenharmony_ci 259cabdff1aSopenharmony_ci ac->fdsp->vector_fmac_scalar(dest, src, gain, len); 260cabdff1aSopenharmony_ci} 261cabdff1aSopenharmony_ci 262cabdff1aSopenharmony_ci#include "aacdec_template.c" 263cabdff1aSopenharmony_ci 264cabdff1aSopenharmony_ci#define LOAS_SYNC_WORD 0x2b7 ///< 11 bits LOAS sync word 265cabdff1aSopenharmony_ci 266cabdff1aSopenharmony_cistruct LATMContext { 267cabdff1aSopenharmony_ci AACContext aac_ctx; ///< containing AACContext 268cabdff1aSopenharmony_ci int initialized; ///< initialized after a valid extradata was seen 269cabdff1aSopenharmony_ci 270cabdff1aSopenharmony_ci // parser data 271cabdff1aSopenharmony_ci int audio_mux_version_A; ///< LATM syntax version 272cabdff1aSopenharmony_ci int frame_length_type; ///< 0/1 variable/fixed frame length 273cabdff1aSopenharmony_ci int frame_length; ///< frame length for fixed frame length 274cabdff1aSopenharmony_ci}; 275cabdff1aSopenharmony_ci 276cabdff1aSopenharmony_cistatic inline uint32_t latm_get_value(GetBitContext *b) 277cabdff1aSopenharmony_ci{ 278cabdff1aSopenharmony_ci int length = get_bits(b, 2); 279cabdff1aSopenharmony_ci 280cabdff1aSopenharmony_ci return get_bits_long(b, (length+1)*8); 281cabdff1aSopenharmony_ci} 282cabdff1aSopenharmony_ci 283cabdff1aSopenharmony_cistatic int latm_decode_audio_specific_config(struct LATMContext *latmctx, 284cabdff1aSopenharmony_ci GetBitContext *gb, int asclen) 285cabdff1aSopenharmony_ci{ 286cabdff1aSopenharmony_ci AACContext *ac = &latmctx->aac_ctx; 287cabdff1aSopenharmony_ci AVCodecContext *avctx = ac->avctx; 288cabdff1aSopenharmony_ci MPEG4AudioConfig m4ac = { 0 }; 289cabdff1aSopenharmony_ci GetBitContext gbc; 290cabdff1aSopenharmony_ci int config_start_bit = get_bits_count(gb); 291cabdff1aSopenharmony_ci int sync_extension = 0; 292cabdff1aSopenharmony_ci int bits_consumed, esize, i; 293cabdff1aSopenharmony_ci 294cabdff1aSopenharmony_ci if (asclen > 0) { 295cabdff1aSopenharmony_ci sync_extension = 1; 296cabdff1aSopenharmony_ci asclen = FFMIN(asclen, get_bits_left(gb)); 297cabdff1aSopenharmony_ci init_get_bits(&gbc, gb->buffer, config_start_bit + asclen); 298cabdff1aSopenharmony_ci skip_bits_long(&gbc, config_start_bit); 299cabdff1aSopenharmony_ci } else if (asclen == 0) { 300cabdff1aSopenharmony_ci gbc = *gb; 301cabdff1aSopenharmony_ci } else { 302cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 303cabdff1aSopenharmony_ci } 304cabdff1aSopenharmony_ci 305cabdff1aSopenharmony_ci if (get_bits_left(gb) <= 0) 306cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 307cabdff1aSopenharmony_ci 308cabdff1aSopenharmony_ci bits_consumed = decode_audio_specific_config_gb(NULL, avctx, &m4ac, 309cabdff1aSopenharmony_ci &gbc, config_start_bit, 310cabdff1aSopenharmony_ci sync_extension); 311cabdff1aSopenharmony_ci 312cabdff1aSopenharmony_ci if (bits_consumed < config_start_bit) 313cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 314cabdff1aSopenharmony_ci bits_consumed -= config_start_bit; 315cabdff1aSopenharmony_ci 316cabdff1aSopenharmony_ci if (asclen == 0) 317cabdff1aSopenharmony_ci asclen = bits_consumed; 318cabdff1aSopenharmony_ci 319cabdff1aSopenharmony_ci if (!latmctx->initialized || 320cabdff1aSopenharmony_ci ac->oc[1].m4ac.sample_rate != m4ac.sample_rate || 321cabdff1aSopenharmony_ci ac->oc[1].m4ac.chan_config != m4ac.chan_config) { 322cabdff1aSopenharmony_ci 323cabdff1aSopenharmony_ci if (latmctx->initialized) { 324cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_INFO, "audio config changed (sample_rate=%d, chan_config=%d)\n", m4ac.sample_rate, m4ac.chan_config); 325cabdff1aSopenharmony_ci } else { 326cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, "initializing latmctx\n"); 327cabdff1aSopenharmony_ci } 328cabdff1aSopenharmony_ci latmctx->initialized = 0; 329cabdff1aSopenharmony_ci 330cabdff1aSopenharmony_ci esize = (asclen + 7) / 8; 331cabdff1aSopenharmony_ci 332cabdff1aSopenharmony_ci if (avctx->extradata_size < esize) { 333cabdff1aSopenharmony_ci av_free(avctx->extradata); 334cabdff1aSopenharmony_ci avctx->extradata = av_malloc(esize + AV_INPUT_BUFFER_PADDING_SIZE); 335cabdff1aSopenharmony_ci if (!avctx->extradata) 336cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 337cabdff1aSopenharmony_ci } 338cabdff1aSopenharmony_ci 339cabdff1aSopenharmony_ci avctx->extradata_size = esize; 340cabdff1aSopenharmony_ci gbc = *gb; 341cabdff1aSopenharmony_ci for (i = 0; i < esize; i++) { 342cabdff1aSopenharmony_ci avctx->extradata[i] = get_bits(&gbc, 8); 343cabdff1aSopenharmony_ci } 344cabdff1aSopenharmony_ci memset(avctx->extradata+esize, 0, AV_INPUT_BUFFER_PADDING_SIZE); 345cabdff1aSopenharmony_ci } 346cabdff1aSopenharmony_ci skip_bits_long(gb, asclen); 347cabdff1aSopenharmony_ci 348cabdff1aSopenharmony_ci return 0; 349cabdff1aSopenharmony_ci} 350cabdff1aSopenharmony_ci 351cabdff1aSopenharmony_cistatic int read_stream_mux_config(struct LATMContext *latmctx, 352cabdff1aSopenharmony_ci GetBitContext *gb) 353cabdff1aSopenharmony_ci{ 354cabdff1aSopenharmony_ci int ret, audio_mux_version = get_bits(gb, 1); 355cabdff1aSopenharmony_ci 356cabdff1aSopenharmony_ci latmctx->audio_mux_version_A = 0; 357cabdff1aSopenharmony_ci if (audio_mux_version) 358cabdff1aSopenharmony_ci latmctx->audio_mux_version_A = get_bits(gb, 1); 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_ci if (!latmctx->audio_mux_version_A) { 361cabdff1aSopenharmony_ci 362cabdff1aSopenharmony_ci if (audio_mux_version) 363cabdff1aSopenharmony_ci latm_get_value(gb); // taraFullness 364cabdff1aSopenharmony_ci 365cabdff1aSopenharmony_ci skip_bits(gb, 1); // allStreamSameTimeFraming 366cabdff1aSopenharmony_ci skip_bits(gb, 6); // numSubFrames 367cabdff1aSopenharmony_ci // numPrograms 368cabdff1aSopenharmony_ci if (get_bits(gb, 4)) { // numPrograms 369cabdff1aSopenharmony_ci avpriv_request_sample(latmctx->aac_ctx.avctx, "Multiple programs"); 370cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 371cabdff1aSopenharmony_ci } 372cabdff1aSopenharmony_ci 373cabdff1aSopenharmony_ci // for each program (which there is only one in DVB) 374cabdff1aSopenharmony_ci 375cabdff1aSopenharmony_ci // for each layer (which there is only one in DVB) 376cabdff1aSopenharmony_ci if (get_bits(gb, 3)) { // numLayer 377cabdff1aSopenharmony_ci avpriv_request_sample(latmctx->aac_ctx.avctx, "Multiple layers"); 378cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 379cabdff1aSopenharmony_ci } 380cabdff1aSopenharmony_ci 381cabdff1aSopenharmony_ci // for all but first stream: use_same_config = get_bits(gb, 1); 382cabdff1aSopenharmony_ci if (!audio_mux_version) { 383cabdff1aSopenharmony_ci if ((ret = latm_decode_audio_specific_config(latmctx, gb, 0)) < 0) 384cabdff1aSopenharmony_ci return ret; 385cabdff1aSopenharmony_ci } else { 386cabdff1aSopenharmony_ci int ascLen = latm_get_value(gb); 387cabdff1aSopenharmony_ci if ((ret = latm_decode_audio_specific_config(latmctx, gb, ascLen)) < 0) 388cabdff1aSopenharmony_ci return ret; 389cabdff1aSopenharmony_ci } 390cabdff1aSopenharmony_ci 391cabdff1aSopenharmony_ci latmctx->frame_length_type = get_bits(gb, 3); 392cabdff1aSopenharmony_ci switch (latmctx->frame_length_type) { 393cabdff1aSopenharmony_ci case 0: 394cabdff1aSopenharmony_ci skip_bits(gb, 8); // latmBufferFullness 395cabdff1aSopenharmony_ci break; 396cabdff1aSopenharmony_ci case 1: 397cabdff1aSopenharmony_ci latmctx->frame_length = get_bits(gb, 9); 398cabdff1aSopenharmony_ci break; 399cabdff1aSopenharmony_ci case 3: 400cabdff1aSopenharmony_ci case 4: 401cabdff1aSopenharmony_ci case 5: 402cabdff1aSopenharmony_ci skip_bits(gb, 6); // CELP frame length table index 403cabdff1aSopenharmony_ci break; 404cabdff1aSopenharmony_ci case 6: 405cabdff1aSopenharmony_ci case 7: 406cabdff1aSopenharmony_ci skip_bits(gb, 1); // HVXC frame length table index 407cabdff1aSopenharmony_ci break; 408cabdff1aSopenharmony_ci } 409cabdff1aSopenharmony_ci 410cabdff1aSopenharmony_ci if (get_bits(gb, 1)) { // other data 411cabdff1aSopenharmony_ci if (audio_mux_version) { 412cabdff1aSopenharmony_ci latm_get_value(gb); // other_data_bits 413cabdff1aSopenharmony_ci } else { 414cabdff1aSopenharmony_ci int esc; 415cabdff1aSopenharmony_ci do { 416cabdff1aSopenharmony_ci if (get_bits_left(gb) < 9) 417cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 418cabdff1aSopenharmony_ci esc = get_bits(gb, 1); 419cabdff1aSopenharmony_ci skip_bits(gb, 8); 420cabdff1aSopenharmony_ci } while (esc); 421cabdff1aSopenharmony_ci } 422cabdff1aSopenharmony_ci } 423cabdff1aSopenharmony_ci 424cabdff1aSopenharmony_ci if (get_bits(gb, 1)) // crc present 425cabdff1aSopenharmony_ci skip_bits(gb, 8); // config_crc 426cabdff1aSopenharmony_ci } 427cabdff1aSopenharmony_ci 428cabdff1aSopenharmony_ci return 0; 429cabdff1aSopenharmony_ci} 430cabdff1aSopenharmony_ci 431cabdff1aSopenharmony_cistatic int read_payload_length_info(struct LATMContext *ctx, GetBitContext *gb) 432cabdff1aSopenharmony_ci{ 433cabdff1aSopenharmony_ci uint8_t tmp; 434cabdff1aSopenharmony_ci 435cabdff1aSopenharmony_ci if (ctx->frame_length_type == 0) { 436cabdff1aSopenharmony_ci int mux_slot_length = 0; 437cabdff1aSopenharmony_ci do { 438cabdff1aSopenharmony_ci if (get_bits_left(gb) < 8) 439cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 440cabdff1aSopenharmony_ci tmp = get_bits(gb, 8); 441cabdff1aSopenharmony_ci mux_slot_length += tmp; 442cabdff1aSopenharmony_ci } while (tmp == 255); 443cabdff1aSopenharmony_ci return mux_slot_length; 444cabdff1aSopenharmony_ci } else if (ctx->frame_length_type == 1) { 445cabdff1aSopenharmony_ci return ctx->frame_length; 446cabdff1aSopenharmony_ci } else if (ctx->frame_length_type == 3 || 447cabdff1aSopenharmony_ci ctx->frame_length_type == 5 || 448cabdff1aSopenharmony_ci ctx->frame_length_type == 7) { 449cabdff1aSopenharmony_ci skip_bits(gb, 2); // mux_slot_length_coded 450cabdff1aSopenharmony_ci } 451cabdff1aSopenharmony_ci return 0; 452cabdff1aSopenharmony_ci} 453cabdff1aSopenharmony_ci 454cabdff1aSopenharmony_cistatic int read_audio_mux_element(struct LATMContext *latmctx, 455cabdff1aSopenharmony_ci GetBitContext *gb) 456cabdff1aSopenharmony_ci{ 457cabdff1aSopenharmony_ci int err; 458cabdff1aSopenharmony_ci uint8_t use_same_mux = get_bits(gb, 1); 459cabdff1aSopenharmony_ci if (!use_same_mux) { 460cabdff1aSopenharmony_ci if ((err = read_stream_mux_config(latmctx, gb)) < 0) 461cabdff1aSopenharmony_ci return err; 462cabdff1aSopenharmony_ci } else if (!latmctx->aac_ctx.avctx->extradata) { 463cabdff1aSopenharmony_ci av_log(latmctx->aac_ctx.avctx, AV_LOG_DEBUG, 464cabdff1aSopenharmony_ci "no decoder config found\n"); 465cabdff1aSopenharmony_ci return 1; 466cabdff1aSopenharmony_ci } 467cabdff1aSopenharmony_ci if (latmctx->audio_mux_version_A == 0) { 468cabdff1aSopenharmony_ci int mux_slot_length_bytes = read_payload_length_info(latmctx, gb); 469cabdff1aSopenharmony_ci if (mux_slot_length_bytes < 0 || mux_slot_length_bytes * 8LL > get_bits_left(gb)) { 470cabdff1aSopenharmony_ci av_log(latmctx->aac_ctx.avctx, AV_LOG_ERROR, "incomplete frame\n"); 471cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 472cabdff1aSopenharmony_ci } else if (mux_slot_length_bytes * 8 + 256 < get_bits_left(gb)) { 473cabdff1aSopenharmony_ci av_log(latmctx->aac_ctx.avctx, AV_LOG_ERROR, 474cabdff1aSopenharmony_ci "frame length mismatch %d << %d\n", 475cabdff1aSopenharmony_ci mux_slot_length_bytes * 8, get_bits_left(gb)); 476cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 477cabdff1aSopenharmony_ci } 478cabdff1aSopenharmony_ci } 479cabdff1aSopenharmony_ci return 0; 480cabdff1aSopenharmony_ci} 481cabdff1aSopenharmony_ci 482cabdff1aSopenharmony_ci 483cabdff1aSopenharmony_cistatic int latm_decode_frame(AVCodecContext *avctx, AVFrame *out, 484cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 485cabdff1aSopenharmony_ci{ 486cabdff1aSopenharmony_ci struct LATMContext *latmctx = avctx->priv_data; 487cabdff1aSopenharmony_ci int muxlength, err; 488cabdff1aSopenharmony_ci GetBitContext gb; 489cabdff1aSopenharmony_ci 490cabdff1aSopenharmony_ci if ((err = init_get_bits8(&gb, avpkt->data, avpkt->size)) < 0) 491cabdff1aSopenharmony_ci return err; 492cabdff1aSopenharmony_ci 493cabdff1aSopenharmony_ci // check for LOAS sync word 494cabdff1aSopenharmony_ci if (get_bits(&gb, 11) != LOAS_SYNC_WORD) 495cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 496cabdff1aSopenharmony_ci 497cabdff1aSopenharmony_ci muxlength = get_bits(&gb, 13) + 3; 498cabdff1aSopenharmony_ci // not enough data, the parser should have sorted this out 499cabdff1aSopenharmony_ci if (muxlength > avpkt->size) 500cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 501cabdff1aSopenharmony_ci 502cabdff1aSopenharmony_ci if ((err = read_audio_mux_element(latmctx, &gb))) 503cabdff1aSopenharmony_ci return (err < 0) ? err : avpkt->size; 504cabdff1aSopenharmony_ci 505cabdff1aSopenharmony_ci if (!latmctx->initialized) { 506cabdff1aSopenharmony_ci if (!avctx->extradata) { 507cabdff1aSopenharmony_ci *got_frame_ptr = 0; 508cabdff1aSopenharmony_ci return avpkt->size; 509cabdff1aSopenharmony_ci } else { 510cabdff1aSopenharmony_ci push_output_configuration(&latmctx->aac_ctx); 511cabdff1aSopenharmony_ci if ((err = decode_audio_specific_config( 512cabdff1aSopenharmony_ci &latmctx->aac_ctx, avctx, &latmctx->aac_ctx.oc[1].m4ac, 513cabdff1aSopenharmony_ci avctx->extradata, avctx->extradata_size*8LL, 1)) < 0) { 514cabdff1aSopenharmony_ci pop_output_configuration(&latmctx->aac_ctx); 515cabdff1aSopenharmony_ci return err; 516cabdff1aSopenharmony_ci } 517cabdff1aSopenharmony_ci latmctx->initialized = 1; 518cabdff1aSopenharmony_ci } 519cabdff1aSopenharmony_ci } 520cabdff1aSopenharmony_ci 521cabdff1aSopenharmony_ci if (show_bits(&gb, 12) == 0xfff) { 522cabdff1aSopenharmony_ci av_log(latmctx->aac_ctx.avctx, AV_LOG_ERROR, 523cabdff1aSopenharmony_ci "ADTS header detected, probably as result of configuration " 524cabdff1aSopenharmony_ci "misparsing\n"); 525cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 526cabdff1aSopenharmony_ci } 527cabdff1aSopenharmony_ci 528cabdff1aSopenharmony_ci switch (latmctx->aac_ctx.oc[1].m4ac.object_type) { 529cabdff1aSopenharmony_ci case AOT_ER_AAC_LC: 530cabdff1aSopenharmony_ci case AOT_ER_AAC_LTP: 531cabdff1aSopenharmony_ci case AOT_ER_AAC_LD: 532cabdff1aSopenharmony_ci case AOT_ER_AAC_ELD: 533cabdff1aSopenharmony_ci err = aac_decode_er_frame(avctx, out, got_frame_ptr, &gb); 534cabdff1aSopenharmony_ci break; 535cabdff1aSopenharmony_ci default: 536cabdff1aSopenharmony_ci err = aac_decode_frame_int(avctx, out, got_frame_ptr, &gb, avpkt); 537cabdff1aSopenharmony_ci } 538cabdff1aSopenharmony_ci if (err < 0) 539cabdff1aSopenharmony_ci return err; 540cabdff1aSopenharmony_ci 541cabdff1aSopenharmony_ci return muxlength; 542cabdff1aSopenharmony_ci} 543cabdff1aSopenharmony_ci 544cabdff1aSopenharmony_cistatic av_cold int latm_decode_init(AVCodecContext *avctx) 545cabdff1aSopenharmony_ci{ 546cabdff1aSopenharmony_ci struct LATMContext *latmctx = avctx->priv_data; 547cabdff1aSopenharmony_ci int ret = aac_decode_init(avctx); 548cabdff1aSopenharmony_ci 549cabdff1aSopenharmony_ci if (avctx->extradata_size > 0) 550cabdff1aSopenharmony_ci latmctx->initialized = !ret; 551cabdff1aSopenharmony_ci 552cabdff1aSopenharmony_ci return ret; 553cabdff1aSopenharmony_ci} 554cabdff1aSopenharmony_ci 555cabdff1aSopenharmony_ciconst FFCodec ff_aac_decoder = { 556cabdff1aSopenharmony_ci .p.name = "aac", 557cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("AAC (Advanced Audio Coding)"), 558cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 559cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_AAC, 560cabdff1aSopenharmony_ci .priv_data_size = sizeof(AACContext), 561cabdff1aSopenharmony_ci .init = aac_decode_init, 562cabdff1aSopenharmony_ci .close = aac_decode_close, 563cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(aac_decode_frame), 564cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]) { 565cabdff1aSopenharmony_ci AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE 566cabdff1aSopenharmony_ci }, 567cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF | AV_CODEC_CAP_DR1, 568cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 569cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT 570cabdff1aSopenharmony_ci .p.channel_layouts = aac_channel_layout, 571cabdff1aSopenharmony_ci#endif 572cabdff1aSopenharmony_ci .p.ch_layouts = aac_ch_layout, 573cabdff1aSopenharmony_ci .flush = flush, 574cabdff1aSopenharmony_ci .p.priv_class = &aac_decoder_class, 575cabdff1aSopenharmony_ci .p.profiles = NULL_IF_CONFIG_SMALL(ff_aac_profiles), 576cabdff1aSopenharmony_ci}; 577cabdff1aSopenharmony_ci 578cabdff1aSopenharmony_ci/* 579cabdff1aSopenharmony_ci Note: This decoder filter is intended to decode LATM streams transferred 580cabdff1aSopenharmony_ci in MPEG transport streams which only contain one program. 581cabdff1aSopenharmony_ci To do a more complex LATM demuxing a separate LATM demuxer should be used. 582cabdff1aSopenharmony_ci*/ 583cabdff1aSopenharmony_ciconst FFCodec ff_aac_latm_decoder = { 584cabdff1aSopenharmony_ci .p.name = "aac_latm", 585cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("AAC LATM (Advanced Audio Coding LATM syntax)"), 586cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 587cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_AAC_LATM, 588cabdff1aSopenharmony_ci .priv_data_size = sizeof(struct LATMContext), 589cabdff1aSopenharmony_ci .init = latm_decode_init, 590cabdff1aSopenharmony_ci .close = aac_decode_close, 591cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(latm_decode_frame), 592cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]) { 593cabdff1aSopenharmony_ci AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE 594cabdff1aSopenharmony_ci }, 595cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF | AV_CODEC_CAP_DR1, 596cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 597cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT 598cabdff1aSopenharmony_ci .p.channel_layouts = aac_channel_layout, 599cabdff1aSopenharmony_ci#endif 600cabdff1aSopenharmony_ci .p.ch_layouts = aac_ch_layout, 601cabdff1aSopenharmony_ci .flush = flush, 602cabdff1aSopenharmony_ci .p.profiles = NULL_IF_CONFIG_SMALL(ff_aac_profiles), 603cabdff1aSopenharmony_ci}; 604