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