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 * AAC decoder fixed-point implementation
12cabdff1aSopenharmony_ci * Copyright (c) 2013
13cabdff1aSopenharmony_ci *      MIPS Technologies, Inc., California.
14cabdff1aSopenharmony_ci *
15cabdff1aSopenharmony_ci * This file is part of FFmpeg.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
18cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
19cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
20cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
21cabdff1aSopenharmony_ci *
22cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
23cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
24cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25cabdff1aSopenharmony_ci * Lesser General Public License for more details.
26cabdff1aSopenharmony_ci *
27cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
28cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
29cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30cabdff1aSopenharmony_ci */
31cabdff1aSopenharmony_ci
32cabdff1aSopenharmony_ci/**
33cabdff1aSopenharmony_ci * @file
34cabdff1aSopenharmony_ci * AAC decoder
35cabdff1aSopenharmony_ci * @author Oded Shimon  ( ods15 ods15 dyndns org )
36cabdff1aSopenharmony_ci * @author Maxim Gavrilov ( maxim.gavrilov gmail com )
37cabdff1aSopenharmony_ci *
38cabdff1aSopenharmony_ci * AAC decoder fixed-point implementation
39cabdff1aSopenharmony_ci * @author Stanislav Ocovaj ( stanislav.ocovaj imgtec com )
40cabdff1aSopenharmony_ci * @author Nedeljko Babic ( nedeljko.babic imgtec com )
41cabdff1aSopenharmony_ci */
42cabdff1aSopenharmony_ci
43cabdff1aSopenharmony_ci/*
44cabdff1aSopenharmony_ci * supported tools
45cabdff1aSopenharmony_ci *
46cabdff1aSopenharmony_ci * Support?                     Name
47cabdff1aSopenharmony_ci * N (code in SoC repo)         gain control
48cabdff1aSopenharmony_ci * Y                            block switching
49cabdff1aSopenharmony_ci * Y                            window shapes - standard
50cabdff1aSopenharmony_ci * N                            window shapes - Low Delay
51cabdff1aSopenharmony_ci * Y                            filterbank - standard
52cabdff1aSopenharmony_ci * N (code in SoC repo)         filterbank - Scalable Sample Rate
53cabdff1aSopenharmony_ci * Y                            Temporal Noise Shaping
54cabdff1aSopenharmony_ci * Y                            Long Term Prediction
55cabdff1aSopenharmony_ci * Y                            intensity stereo
56cabdff1aSopenharmony_ci * Y                            channel coupling
57cabdff1aSopenharmony_ci * Y                            frequency domain prediction
58cabdff1aSopenharmony_ci * Y                            Perceptual Noise Substitution
59cabdff1aSopenharmony_ci * Y                            Mid/Side stereo
60cabdff1aSopenharmony_ci * N                            Scalable Inverse AAC Quantization
61cabdff1aSopenharmony_ci * N                            Frequency Selective Switch
62cabdff1aSopenharmony_ci * N                            upsampling filter
63cabdff1aSopenharmony_ci * Y                            quantization & coding - AAC
64cabdff1aSopenharmony_ci * N                            quantization & coding - TwinVQ
65cabdff1aSopenharmony_ci * N                            quantization & coding - BSAC
66cabdff1aSopenharmony_ci * N                            AAC Error Resilience tools
67cabdff1aSopenharmony_ci * N                            Error Resilience payload syntax
68cabdff1aSopenharmony_ci * N                            Error Protection tool
69cabdff1aSopenharmony_ci * N                            CELP
70cabdff1aSopenharmony_ci * N                            Silence Compression
71cabdff1aSopenharmony_ci * N                            HVXC
72cabdff1aSopenharmony_ci * N                            HVXC 4kbits/s VR
73cabdff1aSopenharmony_ci * N                            Structured Audio tools
74cabdff1aSopenharmony_ci * N                            Structured Audio Sample Bank Format
75cabdff1aSopenharmony_ci * N                            MIDI
76cabdff1aSopenharmony_ci * N                            Harmonic and Individual Lines plus Noise
77cabdff1aSopenharmony_ci * N                            Text-To-Speech Interface
78cabdff1aSopenharmony_ci * Y                            Spectral Band Replication
79cabdff1aSopenharmony_ci * Y (not in this code)         Layer-1
80cabdff1aSopenharmony_ci * Y (not in this code)         Layer-2
81cabdff1aSopenharmony_ci * Y (not in this code)         Layer-3
82cabdff1aSopenharmony_ci * N                            SinuSoidal Coding (Transient, Sinusoid, Noise)
83cabdff1aSopenharmony_ci * Y                            Parametric Stereo
84cabdff1aSopenharmony_ci * N                            Direct Stream Transfer
85cabdff1aSopenharmony_ci * Y  (not in fixed point code) Enhanced AAC Low Delay (ER AAC ELD)
86cabdff1aSopenharmony_ci *
87cabdff1aSopenharmony_ci * Note: - HE AAC v1 comprises LC AAC with Spectral Band Replication.
88cabdff1aSopenharmony_ci *       - HE AAC v2 comprises LC AAC with Spectral Band Replication and
89cabdff1aSopenharmony_ci           Parametric Stereo.
90cabdff1aSopenharmony_ci */
91cabdff1aSopenharmony_ci
92cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h"
93cabdff1aSopenharmony_ci#include "libavutil/thread.h"
94cabdff1aSopenharmony_ci#include "internal.h"
95cabdff1aSopenharmony_ci
96cabdff1aSopenharmony_cistatic VLC vlc_scalefactors;
97cabdff1aSopenharmony_cistatic VLC vlc_spectral[11];
98cabdff1aSopenharmony_ci
99cabdff1aSopenharmony_cistatic int output_configure(AACContext *ac,
100cabdff1aSopenharmony_ci                            uint8_t layout_map[MAX_ELEM_ID*4][3], int tags,
101cabdff1aSopenharmony_ci                            enum OCStatus oc_type, int get_new_frame);
102cabdff1aSopenharmony_ci
103cabdff1aSopenharmony_ci#define overread_err "Input buffer exhausted before END element found\n"
104cabdff1aSopenharmony_ci
105cabdff1aSopenharmony_cistatic int count_channels(uint8_t (*layout)[3], int tags)
106cabdff1aSopenharmony_ci{
107cabdff1aSopenharmony_ci    int i, sum = 0;
108cabdff1aSopenharmony_ci    for (i = 0; i < tags; i++) {
109cabdff1aSopenharmony_ci        int syn_ele = layout[i][0];
110cabdff1aSopenharmony_ci        int pos     = layout[i][2];
111cabdff1aSopenharmony_ci        sum += (1 + (syn_ele == TYPE_CPE)) *
112cabdff1aSopenharmony_ci               (pos != AAC_CHANNEL_OFF && pos != AAC_CHANNEL_CC);
113cabdff1aSopenharmony_ci    }
114cabdff1aSopenharmony_ci    return sum;
115cabdff1aSopenharmony_ci}
116cabdff1aSopenharmony_ci
117cabdff1aSopenharmony_ci/**
118cabdff1aSopenharmony_ci * Check for the channel element in the current channel position configuration.
119cabdff1aSopenharmony_ci * If it exists, make sure the appropriate element is allocated and map the
120cabdff1aSopenharmony_ci * channel order to match the internal FFmpeg channel layout.
121cabdff1aSopenharmony_ci *
122cabdff1aSopenharmony_ci * @param   che_pos current channel position configuration
123cabdff1aSopenharmony_ci * @param   type channel element type
124cabdff1aSopenharmony_ci * @param   id channel element id
125cabdff1aSopenharmony_ci * @param   channels count of the number of channels in the configuration
126cabdff1aSopenharmony_ci *
127cabdff1aSopenharmony_ci * @return  Returns error status. 0 - OK, !0 - error
128cabdff1aSopenharmony_ci */
129cabdff1aSopenharmony_cistatic av_cold int che_configure(AACContext *ac,
130cabdff1aSopenharmony_ci                                 enum ChannelPosition che_pos,
131cabdff1aSopenharmony_ci                                 int type, int id, int *channels)
132cabdff1aSopenharmony_ci{
133cabdff1aSopenharmony_ci    if (*channels >= MAX_CHANNELS)
134cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
135cabdff1aSopenharmony_ci    if (che_pos) {
136cabdff1aSopenharmony_ci        if (!ac->che[type][id]) {
137cabdff1aSopenharmony_ci            if (!(ac->che[type][id] = av_mallocz(sizeof(ChannelElement))))
138cabdff1aSopenharmony_ci                return AVERROR(ENOMEM);
139cabdff1aSopenharmony_ci            AAC_RENAME(ff_aac_sbr_ctx_init)(ac, &ac->che[type][id]->sbr, type);
140cabdff1aSopenharmony_ci        }
141cabdff1aSopenharmony_ci        if (type != TYPE_CCE) {
142cabdff1aSopenharmony_ci            if (*channels >= MAX_CHANNELS - (type == TYPE_CPE || (type == TYPE_SCE && ac->oc[1].m4ac.ps == 1))) {
143cabdff1aSopenharmony_ci                av_log(ac->avctx, AV_LOG_ERROR, "Too many channels\n");
144cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
145cabdff1aSopenharmony_ci            }
146cabdff1aSopenharmony_ci            ac->output_element[(*channels)++] = &ac->che[type][id]->ch[0];
147cabdff1aSopenharmony_ci            if (type == TYPE_CPE ||
148cabdff1aSopenharmony_ci                (type == TYPE_SCE && ac->oc[1].m4ac.ps == 1)) {
149cabdff1aSopenharmony_ci                ac->output_element[(*channels)++] = &ac->che[type][id]->ch[1];
150cabdff1aSopenharmony_ci            }
151cabdff1aSopenharmony_ci        }
152cabdff1aSopenharmony_ci    } else {
153cabdff1aSopenharmony_ci        if (ac->che[type][id])
154cabdff1aSopenharmony_ci            AAC_RENAME(ff_aac_sbr_ctx_close)(&ac->che[type][id]->sbr);
155cabdff1aSopenharmony_ci        av_freep(&ac->che[type][id]);
156cabdff1aSopenharmony_ci    }
157cabdff1aSopenharmony_ci    return 0;
158cabdff1aSopenharmony_ci}
159cabdff1aSopenharmony_ci
160cabdff1aSopenharmony_cistatic int frame_configure_elements(AVCodecContext *avctx)
161cabdff1aSopenharmony_ci{
162cabdff1aSopenharmony_ci    AACContext *ac = avctx->priv_data;
163cabdff1aSopenharmony_ci    int type, id, ch, ret;
164cabdff1aSopenharmony_ci
165cabdff1aSopenharmony_ci    /* set channel pointers to internal buffers by default */
166cabdff1aSopenharmony_ci    for (type = 0; type < 4; type++) {
167cabdff1aSopenharmony_ci        for (id = 0; id < MAX_ELEM_ID; id++) {
168cabdff1aSopenharmony_ci            ChannelElement *che = ac->che[type][id];
169cabdff1aSopenharmony_ci            if (che) {
170cabdff1aSopenharmony_ci                che->ch[0].ret = che->ch[0].ret_buf;
171cabdff1aSopenharmony_ci                che->ch[1].ret = che->ch[1].ret_buf;
172cabdff1aSopenharmony_ci            }
173cabdff1aSopenharmony_ci        }
174cabdff1aSopenharmony_ci    }
175cabdff1aSopenharmony_ci
176cabdff1aSopenharmony_ci    /* get output buffer */
177cabdff1aSopenharmony_ci    av_frame_unref(ac->frame);
178cabdff1aSopenharmony_ci    if (!avctx->ch_layout.nb_channels)
179cabdff1aSopenharmony_ci        return 1;
180cabdff1aSopenharmony_ci
181cabdff1aSopenharmony_ci    ac->frame->nb_samples = 2048;
182cabdff1aSopenharmony_ci    if ((ret = ff_get_buffer(avctx, ac->frame, 0)) < 0)
183cabdff1aSopenharmony_ci        return ret;
184cabdff1aSopenharmony_ci
185cabdff1aSopenharmony_ci    /* map output channel pointers to AVFrame data */
186cabdff1aSopenharmony_ci    for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) {
187cabdff1aSopenharmony_ci        if (ac->output_element[ch])
188cabdff1aSopenharmony_ci            ac->output_element[ch]->ret = (INTFLOAT *)ac->frame->extended_data[ch];
189cabdff1aSopenharmony_ci    }
190cabdff1aSopenharmony_ci
191cabdff1aSopenharmony_ci    return 0;
192cabdff1aSopenharmony_ci}
193cabdff1aSopenharmony_ci
194cabdff1aSopenharmony_cistruct elem_to_channel {
195cabdff1aSopenharmony_ci    uint64_t av_position;
196cabdff1aSopenharmony_ci    uint8_t syn_ele;
197cabdff1aSopenharmony_ci    uint8_t elem_id;
198cabdff1aSopenharmony_ci    uint8_t aac_position;
199cabdff1aSopenharmony_ci};
200cabdff1aSopenharmony_ci
201cabdff1aSopenharmony_cistatic int assign_pair(struct elem_to_channel e2c_vec[MAX_ELEM_ID],
202cabdff1aSopenharmony_ci                       uint8_t (*layout_map)[3], int offset, uint64_t left,
203cabdff1aSopenharmony_ci                       uint64_t right, int pos, uint64_t *layout)
204cabdff1aSopenharmony_ci{
205cabdff1aSopenharmony_ci    if (layout_map[offset][0] == TYPE_CPE) {
206cabdff1aSopenharmony_ci        e2c_vec[offset] = (struct elem_to_channel) {
207cabdff1aSopenharmony_ci            .av_position  = left | right,
208cabdff1aSopenharmony_ci            .syn_ele      = TYPE_CPE,
209cabdff1aSopenharmony_ci            .elem_id      = layout_map[offset][1],
210cabdff1aSopenharmony_ci            .aac_position = pos
211cabdff1aSopenharmony_ci        };
212cabdff1aSopenharmony_ci        if (e2c_vec[offset].av_position != UINT64_MAX)
213cabdff1aSopenharmony_ci            *layout |= e2c_vec[offset].av_position;
214cabdff1aSopenharmony_ci
215cabdff1aSopenharmony_ci        return 1;
216cabdff1aSopenharmony_ci    } else {
217cabdff1aSopenharmony_ci        e2c_vec[offset] = (struct elem_to_channel) {
218cabdff1aSopenharmony_ci            .av_position  = left,
219cabdff1aSopenharmony_ci            .syn_ele      = TYPE_SCE,
220cabdff1aSopenharmony_ci            .elem_id      = layout_map[offset][1],
221cabdff1aSopenharmony_ci            .aac_position = pos
222cabdff1aSopenharmony_ci        };
223cabdff1aSopenharmony_ci        e2c_vec[offset + 1] = (struct elem_to_channel) {
224cabdff1aSopenharmony_ci            .av_position  = right,
225cabdff1aSopenharmony_ci            .syn_ele      = TYPE_SCE,
226cabdff1aSopenharmony_ci            .elem_id      = layout_map[offset + 1][1],
227cabdff1aSopenharmony_ci            .aac_position = pos
228cabdff1aSopenharmony_ci        };
229cabdff1aSopenharmony_ci        if (left != UINT64_MAX)
230cabdff1aSopenharmony_ci            *layout |= left;
231cabdff1aSopenharmony_ci
232cabdff1aSopenharmony_ci        if (right != UINT64_MAX)
233cabdff1aSopenharmony_ci            *layout |= right;
234cabdff1aSopenharmony_ci
235cabdff1aSopenharmony_ci        return 2;
236cabdff1aSopenharmony_ci    }
237cabdff1aSopenharmony_ci}
238cabdff1aSopenharmony_ci
239cabdff1aSopenharmony_cistatic int count_paired_channels(uint8_t (*layout_map)[3], int tags, int pos,
240cabdff1aSopenharmony_ci                                 int *current)
241cabdff1aSopenharmony_ci{
242cabdff1aSopenharmony_ci    int num_pos_channels = 0;
243cabdff1aSopenharmony_ci    int first_cpe        = 0;
244cabdff1aSopenharmony_ci    int sce_parity       = 0;
245cabdff1aSopenharmony_ci    int i;
246cabdff1aSopenharmony_ci    for (i = *current; i < tags; i++) {
247cabdff1aSopenharmony_ci        if (layout_map[i][2] != pos)
248cabdff1aSopenharmony_ci            break;
249cabdff1aSopenharmony_ci        if (layout_map[i][0] == TYPE_CPE) {
250cabdff1aSopenharmony_ci            if (sce_parity) {
251cabdff1aSopenharmony_ci                if (pos == AAC_CHANNEL_FRONT && !first_cpe) {
252cabdff1aSopenharmony_ci                    sce_parity = 0;
253cabdff1aSopenharmony_ci                } else {
254cabdff1aSopenharmony_ci                    return -1;
255cabdff1aSopenharmony_ci                }
256cabdff1aSopenharmony_ci            }
257cabdff1aSopenharmony_ci            num_pos_channels += 2;
258cabdff1aSopenharmony_ci            first_cpe         = 1;
259cabdff1aSopenharmony_ci        } else {
260cabdff1aSopenharmony_ci            num_pos_channels++;
261cabdff1aSopenharmony_ci            sce_parity ^= 1;
262cabdff1aSopenharmony_ci        }
263cabdff1aSopenharmony_ci    }
264cabdff1aSopenharmony_ci    if (sce_parity &&
265cabdff1aSopenharmony_ci        ((pos == AAC_CHANNEL_FRONT && first_cpe) || pos == AAC_CHANNEL_SIDE))
266cabdff1aSopenharmony_ci        return -1;
267cabdff1aSopenharmony_ci    *current = i;
268cabdff1aSopenharmony_ci    return num_pos_channels;
269cabdff1aSopenharmony_ci}
270cabdff1aSopenharmony_ci
271cabdff1aSopenharmony_ci#define PREFIX_FOR_22POINT2 (AV_CH_LAYOUT_7POINT1_WIDE_BACK|AV_CH_BACK_CENTER|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT|AV_CH_LOW_FREQUENCY_2)
272cabdff1aSopenharmony_cistatic uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
273cabdff1aSopenharmony_ci{
274cabdff1aSopenharmony_ci    int i, n, total_non_cc_elements;
275cabdff1aSopenharmony_ci    struct elem_to_channel e2c_vec[4 * MAX_ELEM_ID] = { { 0 } };
276cabdff1aSopenharmony_ci    int num_front_channels, num_side_channels, num_back_channels;
277cabdff1aSopenharmony_ci    uint64_t layout = 0;
278cabdff1aSopenharmony_ci
279cabdff1aSopenharmony_ci    if (FF_ARRAY_ELEMS(e2c_vec) < tags)
280cabdff1aSopenharmony_ci        return 0;
281cabdff1aSopenharmony_ci
282cabdff1aSopenharmony_ci    i = 0;
283cabdff1aSopenharmony_ci    num_front_channels =
284cabdff1aSopenharmony_ci        count_paired_channels(layout_map, tags, AAC_CHANNEL_FRONT, &i);
285cabdff1aSopenharmony_ci    if (num_front_channels < 0)
286cabdff1aSopenharmony_ci        return 0;
287cabdff1aSopenharmony_ci    num_side_channels =
288cabdff1aSopenharmony_ci        count_paired_channels(layout_map, tags, AAC_CHANNEL_SIDE, &i);
289cabdff1aSopenharmony_ci    if (num_side_channels < 0)
290cabdff1aSopenharmony_ci        return 0;
291cabdff1aSopenharmony_ci    num_back_channels =
292cabdff1aSopenharmony_ci        count_paired_channels(layout_map, tags, AAC_CHANNEL_BACK, &i);
293cabdff1aSopenharmony_ci    if (num_back_channels < 0)
294cabdff1aSopenharmony_ci        return 0;
295cabdff1aSopenharmony_ci
296cabdff1aSopenharmony_ci    if (num_side_channels == 0 && num_back_channels >= 4) {
297cabdff1aSopenharmony_ci        num_side_channels = 2;
298cabdff1aSopenharmony_ci        num_back_channels -= 2;
299cabdff1aSopenharmony_ci    }
300cabdff1aSopenharmony_ci
301cabdff1aSopenharmony_ci    i = 0;
302cabdff1aSopenharmony_ci    if (num_front_channels & 1) {
303cabdff1aSopenharmony_ci        e2c_vec[i] = (struct elem_to_channel) {
304cabdff1aSopenharmony_ci            .av_position  = AV_CH_FRONT_CENTER,
305cabdff1aSopenharmony_ci            .syn_ele      = TYPE_SCE,
306cabdff1aSopenharmony_ci            .elem_id      = layout_map[i][1],
307cabdff1aSopenharmony_ci            .aac_position = AAC_CHANNEL_FRONT
308cabdff1aSopenharmony_ci        };
309cabdff1aSopenharmony_ci        layout |= e2c_vec[i].av_position;
310cabdff1aSopenharmony_ci        i++;
311cabdff1aSopenharmony_ci        num_front_channels--;
312cabdff1aSopenharmony_ci    }
313cabdff1aSopenharmony_ci    if (num_front_channels >= 4) {
314cabdff1aSopenharmony_ci        i += assign_pair(e2c_vec, layout_map, i,
315cabdff1aSopenharmony_ci                         AV_CH_FRONT_LEFT_OF_CENTER,
316cabdff1aSopenharmony_ci                         AV_CH_FRONT_RIGHT_OF_CENTER,
317cabdff1aSopenharmony_ci                         AAC_CHANNEL_FRONT, &layout);
318cabdff1aSopenharmony_ci        num_front_channels -= 2;
319cabdff1aSopenharmony_ci    }
320cabdff1aSopenharmony_ci    if (num_front_channels >= 2) {
321cabdff1aSopenharmony_ci        i += assign_pair(e2c_vec, layout_map, i,
322cabdff1aSopenharmony_ci                         AV_CH_FRONT_LEFT,
323cabdff1aSopenharmony_ci                         AV_CH_FRONT_RIGHT,
324cabdff1aSopenharmony_ci                         AAC_CHANNEL_FRONT, &layout);
325cabdff1aSopenharmony_ci        num_front_channels -= 2;
326cabdff1aSopenharmony_ci    }
327cabdff1aSopenharmony_ci    while (num_front_channels >= 2) {
328cabdff1aSopenharmony_ci        i += assign_pair(e2c_vec, layout_map, i,
329cabdff1aSopenharmony_ci                         UINT64_MAX,
330cabdff1aSopenharmony_ci                         UINT64_MAX,
331cabdff1aSopenharmony_ci                         AAC_CHANNEL_FRONT, &layout);
332cabdff1aSopenharmony_ci        num_front_channels -= 2;
333cabdff1aSopenharmony_ci    }
334cabdff1aSopenharmony_ci
335cabdff1aSopenharmony_ci    if (num_side_channels >= 2) {
336cabdff1aSopenharmony_ci        i += assign_pair(e2c_vec, layout_map, i,
337cabdff1aSopenharmony_ci                         AV_CH_SIDE_LEFT,
338cabdff1aSopenharmony_ci                         AV_CH_SIDE_RIGHT,
339cabdff1aSopenharmony_ci                         AAC_CHANNEL_FRONT, &layout);
340cabdff1aSopenharmony_ci        num_side_channels -= 2;
341cabdff1aSopenharmony_ci    }
342cabdff1aSopenharmony_ci    while (num_side_channels >= 2) {
343cabdff1aSopenharmony_ci        i += assign_pair(e2c_vec, layout_map, i,
344cabdff1aSopenharmony_ci                         UINT64_MAX,
345cabdff1aSopenharmony_ci                         UINT64_MAX,
346cabdff1aSopenharmony_ci                         AAC_CHANNEL_SIDE, &layout);
347cabdff1aSopenharmony_ci        num_side_channels -= 2;
348cabdff1aSopenharmony_ci    }
349cabdff1aSopenharmony_ci
350cabdff1aSopenharmony_ci    while (num_back_channels >= 4) {
351cabdff1aSopenharmony_ci        i += assign_pair(e2c_vec, layout_map, i,
352cabdff1aSopenharmony_ci                         UINT64_MAX,
353cabdff1aSopenharmony_ci                         UINT64_MAX,
354cabdff1aSopenharmony_ci                         AAC_CHANNEL_BACK, &layout);
355cabdff1aSopenharmony_ci        num_back_channels -= 2;
356cabdff1aSopenharmony_ci    }
357cabdff1aSopenharmony_ci    if (num_back_channels >= 2) {
358cabdff1aSopenharmony_ci        i += assign_pair(e2c_vec, layout_map, i,
359cabdff1aSopenharmony_ci                         AV_CH_BACK_LEFT,
360cabdff1aSopenharmony_ci                         AV_CH_BACK_RIGHT,
361cabdff1aSopenharmony_ci                         AAC_CHANNEL_BACK, &layout);
362cabdff1aSopenharmony_ci        num_back_channels -= 2;
363cabdff1aSopenharmony_ci    }
364cabdff1aSopenharmony_ci    if (num_back_channels) {
365cabdff1aSopenharmony_ci        e2c_vec[i] = (struct elem_to_channel) {
366cabdff1aSopenharmony_ci            .av_position  = AV_CH_BACK_CENTER,
367cabdff1aSopenharmony_ci            .syn_ele      = TYPE_SCE,
368cabdff1aSopenharmony_ci            .elem_id      = layout_map[i][1],
369cabdff1aSopenharmony_ci            .aac_position = AAC_CHANNEL_BACK
370cabdff1aSopenharmony_ci        };
371cabdff1aSopenharmony_ci        layout |= e2c_vec[i].av_position;
372cabdff1aSopenharmony_ci        i++;
373cabdff1aSopenharmony_ci        num_back_channels--;
374cabdff1aSopenharmony_ci    }
375cabdff1aSopenharmony_ci
376cabdff1aSopenharmony_ci    if (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) {
377cabdff1aSopenharmony_ci        e2c_vec[i] = (struct elem_to_channel) {
378cabdff1aSopenharmony_ci            .av_position  = AV_CH_LOW_FREQUENCY,
379cabdff1aSopenharmony_ci            .syn_ele      = TYPE_LFE,
380cabdff1aSopenharmony_ci            .elem_id      = layout_map[i][1],
381cabdff1aSopenharmony_ci            .aac_position = AAC_CHANNEL_LFE
382cabdff1aSopenharmony_ci        };
383cabdff1aSopenharmony_ci        layout |= e2c_vec[i].av_position;
384cabdff1aSopenharmony_ci        i++;
385cabdff1aSopenharmony_ci    }
386cabdff1aSopenharmony_ci    if (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) {
387cabdff1aSopenharmony_ci        e2c_vec[i] = (struct elem_to_channel) {
388cabdff1aSopenharmony_ci            .av_position  = AV_CH_LOW_FREQUENCY_2,
389cabdff1aSopenharmony_ci            .syn_ele      = TYPE_LFE,
390cabdff1aSopenharmony_ci            .elem_id      = layout_map[i][1],
391cabdff1aSopenharmony_ci            .aac_position = AAC_CHANNEL_LFE
392cabdff1aSopenharmony_ci        };
393cabdff1aSopenharmony_ci        layout |= e2c_vec[i].av_position;
394cabdff1aSopenharmony_ci        i++;
395cabdff1aSopenharmony_ci    }
396cabdff1aSopenharmony_ci    while (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) {
397cabdff1aSopenharmony_ci        e2c_vec[i] = (struct elem_to_channel) {
398cabdff1aSopenharmony_ci            .av_position  = UINT64_MAX,
399cabdff1aSopenharmony_ci            .syn_ele      = TYPE_LFE,
400cabdff1aSopenharmony_ci            .elem_id      = layout_map[i][1],
401cabdff1aSopenharmony_ci            .aac_position = AAC_CHANNEL_LFE
402cabdff1aSopenharmony_ci        };
403cabdff1aSopenharmony_ci        i++;
404cabdff1aSopenharmony_ci    }
405cabdff1aSopenharmony_ci
406cabdff1aSopenharmony_ci    // The previous checks would end up at 8 at this point for 22.2
407cabdff1aSopenharmony_ci    if (layout == PREFIX_FOR_22POINT2 && tags == 16 && i == 8) {
408cabdff1aSopenharmony_ci        const uint8_t (*reference_layout_map)[3] = aac_channel_layout_map[12];
409cabdff1aSopenharmony_ci        for (int j = 0; j < tags; j++) {
410cabdff1aSopenharmony_ci            if (layout_map[j][0] != reference_layout_map[j][0] ||
411cabdff1aSopenharmony_ci                layout_map[j][2] != reference_layout_map[j][2])
412cabdff1aSopenharmony_ci                goto end_of_layout_definition;
413cabdff1aSopenharmony_ci        }
414cabdff1aSopenharmony_ci
415cabdff1aSopenharmony_ci        e2c_vec[i] = (struct elem_to_channel) {
416cabdff1aSopenharmony_ci            .av_position  = AV_CH_TOP_FRONT_CENTER,
417cabdff1aSopenharmony_ci            .syn_ele      = layout_map[i][0],
418cabdff1aSopenharmony_ci            .elem_id      = layout_map[i][1],
419cabdff1aSopenharmony_ci            .aac_position = layout_map[i][2]
420cabdff1aSopenharmony_ci        }; layout |= e2c_vec[i].av_position; i++;
421cabdff1aSopenharmony_ci        i += assign_pair(e2c_vec, layout_map, i,
422cabdff1aSopenharmony_ci                         AV_CH_TOP_FRONT_LEFT,
423cabdff1aSopenharmony_ci                         AV_CH_TOP_FRONT_RIGHT,
424cabdff1aSopenharmony_ci                         AAC_CHANNEL_FRONT,
425cabdff1aSopenharmony_ci                         &layout);
426cabdff1aSopenharmony_ci        i += assign_pair(e2c_vec, layout_map, i,
427cabdff1aSopenharmony_ci                         AV_CH_TOP_SIDE_LEFT,
428cabdff1aSopenharmony_ci                         AV_CH_TOP_SIDE_RIGHT,
429cabdff1aSopenharmony_ci                         AAC_CHANNEL_SIDE,
430cabdff1aSopenharmony_ci                         &layout);
431cabdff1aSopenharmony_ci        e2c_vec[i] = (struct elem_to_channel) {
432cabdff1aSopenharmony_ci            .av_position  = AV_CH_TOP_CENTER,
433cabdff1aSopenharmony_ci            .syn_ele      = layout_map[i][0],
434cabdff1aSopenharmony_ci            .elem_id      = layout_map[i][1],
435cabdff1aSopenharmony_ci            .aac_position = layout_map[i][2]
436cabdff1aSopenharmony_ci        }; layout |= e2c_vec[i].av_position; i++;
437cabdff1aSopenharmony_ci        i += assign_pair(e2c_vec, layout_map, i,
438cabdff1aSopenharmony_ci                         AV_CH_TOP_BACK_LEFT,
439cabdff1aSopenharmony_ci                         AV_CH_TOP_BACK_RIGHT,
440cabdff1aSopenharmony_ci                         AAC_CHANNEL_BACK,
441cabdff1aSopenharmony_ci                         &layout);
442cabdff1aSopenharmony_ci        e2c_vec[i] = (struct elem_to_channel) {
443cabdff1aSopenharmony_ci            .av_position  = AV_CH_TOP_BACK_CENTER,
444cabdff1aSopenharmony_ci            .syn_ele      = layout_map[i][0],
445cabdff1aSopenharmony_ci            .elem_id      = layout_map[i][1],
446cabdff1aSopenharmony_ci            .aac_position = layout_map[i][2]
447cabdff1aSopenharmony_ci        }; layout |= e2c_vec[i].av_position; i++;
448cabdff1aSopenharmony_ci        e2c_vec[i] = (struct elem_to_channel) {
449cabdff1aSopenharmony_ci            .av_position  = AV_CH_BOTTOM_FRONT_CENTER,
450cabdff1aSopenharmony_ci            .syn_ele      = layout_map[i][0],
451cabdff1aSopenharmony_ci            .elem_id      = layout_map[i][1],
452cabdff1aSopenharmony_ci            .aac_position = layout_map[i][2]
453cabdff1aSopenharmony_ci        }; layout |= e2c_vec[i].av_position; i++;
454cabdff1aSopenharmony_ci        i += assign_pair(e2c_vec, layout_map, i,
455cabdff1aSopenharmony_ci                         AV_CH_BOTTOM_FRONT_LEFT,
456cabdff1aSopenharmony_ci                         AV_CH_BOTTOM_FRONT_RIGHT,
457cabdff1aSopenharmony_ci                         AAC_CHANNEL_FRONT,
458cabdff1aSopenharmony_ci                         &layout);
459cabdff1aSopenharmony_ci    }
460cabdff1aSopenharmony_ci
461cabdff1aSopenharmony_ciend_of_layout_definition:
462cabdff1aSopenharmony_ci
463cabdff1aSopenharmony_ci    total_non_cc_elements = n = i;
464cabdff1aSopenharmony_ci
465cabdff1aSopenharmony_ci    if (layout == AV_CH_LAYOUT_22POINT2) {
466cabdff1aSopenharmony_ci        // For 22.2 reorder the result as needed
467cabdff1aSopenharmony_ci        FFSWAP(struct elem_to_channel, e2c_vec[2], e2c_vec[0]);   // FL & FR first (final), FC third
468cabdff1aSopenharmony_ci        FFSWAP(struct elem_to_channel, e2c_vec[2], e2c_vec[1]);   // FC second (final), FLc & FRc third
469cabdff1aSopenharmony_ci        FFSWAP(struct elem_to_channel, e2c_vec[6], e2c_vec[2]);   // LFE1 third (final), FLc & FRc seventh
470cabdff1aSopenharmony_ci        FFSWAP(struct elem_to_channel, e2c_vec[4], e2c_vec[3]);   // BL & BR fourth (final), SiL & SiR fifth
471cabdff1aSopenharmony_ci        FFSWAP(struct elem_to_channel, e2c_vec[6], e2c_vec[4]);   // FLc & FRc fifth (final), SiL & SiR seventh
472cabdff1aSopenharmony_ci        FFSWAP(struct elem_to_channel, e2c_vec[7], e2c_vec[6]);   // LFE2 seventh (final), SiL & SiR eight (final)
473cabdff1aSopenharmony_ci        FFSWAP(struct elem_to_channel, e2c_vec[9], e2c_vec[8]);   // TpFL & TpFR ninth (final), TFC tenth (final)
474cabdff1aSopenharmony_ci        FFSWAP(struct elem_to_channel, e2c_vec[11], e2c_vec[10]); // TC eleventh (final), TpSiL & TpSiR twelth
475cabdff1aSopenharmony_ci        FFSWAP(struct elem_to_channel, e2c_vec[12], e2c_vec[11]); // TpBL & TpBR twelth (final), TpSiL & TpSiR thirteenth (final)
476cabdff1aSopenharmony_ci    } else {
477cabdff1aSopenharmony_ci        // For everything else, utilize the AV channel position define as a
478cabdff1aSopenharmony_ci        // stable sort.
479cabdff1aSopenharmony_ci        do {
480cabdff1aSopenharmony_ci            int next_n = 0;
481cabdff1aSopenharmony_ci            for (i = 1; i < n; i++)
482cabdff1aSopenharmony_ci                if (e2c_vec[i - 1].av_position > e2c_vec[i].av_position) {
483cabdff1aSopenharmony_ci                    FFSWAP(struct elem_to_channel, e2c_vec[i - 1], e2c_vec[i]);
484cabdff1aSopenharmony_ci                    next_n = i;
485cabdff1aSopenharmony_ci                }
486cabdff1aSopenharmony_ci            n = next_n;
487cabdff1aSopenharmony_ci        } while (n > 0);
488cabdff1aSopenharmony_ci
489cabdff1aSopenharmony_ci    }
490cabdff1aSopenharmony_ci
491cabdff1aSopenharmony_ci    for (i = 0; i < total_non_cc_elements; i++) {
492cabdff1aSopenharmony_ci        layout_map[i][0] = e2c_vec[i].syn_ele;
493cabdff1aSopenharmony_ci        layout_map[i][1] = e2c_vec[i].elem_id;
494cabdff1aSopenharmony_ci        layout_map[i][2] = e2c_vec[i].aac_position;
495cabdff1aSopenharmony_ci    }
496cabdff1aSopenharmony_ci
497cabdff1aSopenharmony_ci    return layout;
498cabdff1aSopenharmony_ci}
499cabdff1aSopenharmony_ci
500cabdff1aSopenharmony_ci/**
501cabdff1aSopenharmony_ci * Save current output configuration if and only if it has been locked.
502cabdff1aSopenharmony_ci */
503cabdff1aSopenharmony_cistatic int push_output_configuration(AACContext *ac) {
504cabdff1aSopenharmony_ci    int pushed = 0;
505cabdff1aSopenharmony_ci
506cabdff1aSopenharmony_ci    if (ac->oc[1].status == OC_LOCKED || ac->oc[0].status == OC_NONE) {
507cabdff1aSopenharmony_ci        ac->oc[0] = ac->oc[1];
508cabdff1aSopenharmony_ci        pushed = 1;
509cabdff1aSopenharmony_ci    }
510cabdff1aSopenharmony_ci    ac->oc[1].status = OC_NONE;
511cabdff1aSopenharmony_ci    return pushed;
512cabdff1aSopenharmony_ci}
513cabdff1aSopenharmony_ci
514cabdff1aSopenharmony_ci/**
515cabdff1aSopenharmony_ci * Restore the previous output configuration if and only if the current
516cabdff1aSopenharmony_ci * configuration is unlocked.
517cabdff1aSopenharmony_ci */
518cabdff1aSopenharmony_cistatic void pop_output_configuration(AACContext *ac) {
519cabdff1aSopenharmony_ci    if (ac->oc[1].status != OC_LOCKED && ac->oc[0].status != OC_NONE) {
520cabdff1aSopenharmony_ci        ac->oc[1] = ac->oc[0];
521cabdff1aSopenharmony_ci        ac->avctx->ch_layout = ac->oc[1].ch_layout;
522cabdff1aSopenharmony_ci        output_configure(ac, ac->oc[1].layout_map, ac->oc[1].layout_map_tags,
523cabdff1aSopenharmony_ci                         ac->oc[1].status, 0);
524cabdff1aSopenharmony_ci    }
525cabdff1aSopenharmony_ci}
526cabdff1aSopenharmony_ci
527cabdff1aSopenharmony_ci/**
528cabdff1aSopenharmony_ci * Configure output channel order based on the current program
529cabdff1aSopenharmony_ci * configuration element.
530cabdff1aSopenharmony_ci *
531cabdff1aSopenharmony_ci * @return  Returns error status. 0 - OK, !0 - error
532cabdff1aSopenharmony_ci */
533cabdff1aSopenharmony_cistatic int output_configure(AACContext *ac,
534cabdff1aSopenharmony_ci                            uint8_t layout_map[MAX_ELEM_ID * 4][3], int tags,
535cabdff1aSopenharmony_ci                            enum OCStatus oc_type, int get_new_frame)
536cabdff1aSopenharmony_ci{
537cabdff1aSopenharmony_ci    AVCodecContext *avctx = ac->avctx;
538cabdff1aSopenharmony_ci    int i, channels = 0, ret;
539cabdff1aSopenharmony_ci    uint64_t layout = 0;
540cabdff1aSopenharmony_ci    uint8_t id_map[TYPE_END][MAX_ELEM_ID] = {{ 0 }};
541cabdff1aSopenharmony_ci    uint8_t type_counts[TYPE_END] = { 0 };
542cabdff1aSopenharmony_ci
543cabdff1aSopenharmony_ci    if (ac->oc[1].layout_map != layout_map) {
544cabdff1aSopenharmony_ci        memcpy(ac->oc[1].layout_map, layout_map, tags * sizeof(layout_map[0]));
545cabdff1aSopenharmony_ci        ac->oc[1].layout_map_tags = tags;
546cabdff1aSopenharmony_ci    }
547cabdff1aSopenharmony_ci    for (i = 0; i < tags; i++) {
548cabdff1aSopenharmony_ci        int type =         layout_map[i][0];
549cabdff1aSopenharmony_ci        int id =           layout_map[i][1];
550cabdff1aSopenharmony_ci        id_map[type][id] = type_counts[type]++;
551cabdff1aSopenharmony_ci        if (id_map[type][id] >= MAX_ELEM_ID) {
552cabdff1aSopenharmony_ci            avpriv_request_sample(ac->avctx, "Too large remapped id");
553cabdff1aSopenharmony_ci            return AVERROR_PATCHWELCOME;
554cabdff1aSopenharmony_ci        }
555cabdff1aSopenharmony_ci    }
556cabdff1aSopenharmony_ci    // Try to sniff a reasonable channel order, otherwise output the
557cabdff1aSopenharmony_ci    // channels in the order the PCE declared them.
558cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT
559cabdff1aSopenharmony_ciFF_DISABLE_DEPRECATION_WARNINGS
560cabdff1aSopenharmony_ci    if (avctx->request_channel_layout == AV_CH_LAYOUT_NATIVE)
561cabdff1aSopenharmony_ci        ac->output_channel_order = CHANNEL_ORDER_CODED;
562cabdff1aSopenharmony_ciFF_ENABLE_DEPRECATION_WARNINGS
563cabdff1aSopenharmony_ci#endif
564cabdff1aSopenharmony_ci
565cabdff1aSopenharmony_ci    if (ac->output_channel_order == CHANNEL_ORDER_DEFAULT)
566cabdff1aSopenharmony_ci        layout = sniff_channel_order(layout_map, tags);
567cabdff1aSopenharmony_ci    for (i = 0; i < tags; i++) {
568cabdff1aSopenharmony_ci        int type =     layout_map[i][0];
569cabdff1aSopenharmony_ci        int id =       layout_map[i][1];
570cabdff1aSopenharmony_ci        int iid =      id_map[type][id];
571cabdff1aSopenharmony_ci        int position = layout_map[i][2];
572cabdff1aSopenharmony_ci        // Allocate or free elements depending on if they are in the
573cabdff1aSopenharmony_ci        // current program configuration.
574cabdff1aSopenharmony_ci        ret = che_configure(ac, position, type, iid, &channels);
575cabdff1aSopenharmony_ci        if (ret < 0)
576cabdff1aSopenharmony_ci            return ret;
577cabdff1aSopenharmony_ci        ac->tag_che_map[type][id] = ac->che[type][iid];
578cabdff1aSopenharmony_ci    }
579cabdff1aSopenharmony_ci    if (ac->oc[1].m4ac.ps == 1 && channels == 2) {
580cabdff1aSopenharmony_ci        if (layout == AV_CH_FRONT_CENTER) {
581cabdff1aSopenharmony_ci            layout = AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT;
582cabdff1aSopenharmony_ci        } else {
583cabdff1aSopenharmony_ci            layout = 0;
584cabdff1aSopenharmony_ci        }
585cabdff1aSopenharmony_ci    }
586cabdff1aSopenharmony_ci
587cabdff1aSopenharmony_ci    av_channel_layout_uninit(&ac->oc[1].ch_layout);
588cabdff1aSopenharmony_ci    if (layout)
589cabdff1aSopenharmony_ci        av_channel_layout_from_mask(&ac->oc[1].ch_layout, layout);
590cabdff1aSopenharmony_ci    else {
591cabdff1aSopenharmony_ci        ac->oc[1].ch_layout.order       = AV_CHANNEL_ORDER_UNSPEC;
592cabdff1aSopenharmony_ci        ac->oc[1].ch_layout.nb_channels = channels;
593cabdff1aSopenharmony_ci    }
594cabdff1aSopenharmony_ci
595cabdff1aSopenharmony_ci    av_channel_layout_copy(&avctx->ch_layout, &ac->oc[1].ch_layout);
596cabdff1aSopenharmony_ci    ac->oc[1].status = oc_type;
597cabdff1aSopenharmony_ci
598cabdff1aSopenharmony_ci    if (get_new_frame) {
599cabdff1aSopenharmony_ci        if ((ret = frame_configure_elements(ac->avctx)) < 0)
600cabdff1aSopenharmony_ci            return ret;
601cabdff1aSopenharmony_ci    }
602cabdff1aSopenharmony_ci
603cabdff1aSopenharmony_ci    return 0;
604cabdff1aSopenharmony_ci}
605cabdff1aSopenharmony_ci
606cabdff1aSopenharmony_cistatic void flush(AVCodecContext *avctx)
607cabdff1aSopenharmony_ci{
608cabdff1aSopenharmony_ci    AACContext *ac= avctx->priv_data;
609cabdff1aSopenharmony_ci    int type, i, j;
610cabdff1aSopenharmony_ci
611cabdff1aSopenharmony_ci    for (type = 3; type >= 0; type--) {
612cabdff1aSopenharmony_ci        for (i = 0; i < MAX_ELEM_ID; i++) {
613cabdff1aSopenharmony_ci            ChannelElement *che = ac->che[type][i];
614cabdff1aSopenharmony_ci            if (che) {
615cabdff1aSopenharmony_ci                for (j = 0; j <= 1; j++) {
616cabdff1aSopenharmony_ci                    memset(che->ch[j].saved, 0, sizeof(che->ch[j].saved));
617cabdff1aSopenharmony_ci                }
618cabdff1aSopenharmony_ci            }
619cabdff1aSopenharmony_ci        }
620cabdff1aSopenharmony_ci    }
621cabdff1aSopenharmony_ci}
622cabdff1aSopenharmony_ci
623cabdff1aSopenharmony_ci/**
624cabdff1aSopenharmony_ci * Set up channel positions based on a default channel configuration
625cabdff1aSopenharmony_ci * as specified in table 1.17.
626cabdff1aSopenharmony_ci *
627cabdff1aSopenharmony_ci * @return  Returns error status. 0 - OK, !0 - error
628cabdff1aSopenharmony_ci */
629cabdff1aSopenharmony_cistatic int set_default_channel_config(AACContext *ac, AVCodecContext *avctx,
630cabdff1aSopenharmony_ci                                      uint8_t (*layout_map)[3],
631cabdff1aSopenharmony_ci                                      int *tags,
632cabdff1aSopenharmony_ci                                      int channel_config)
633cabdff1aSopenharmony_ci{
634cabdff1aSopenharmony_ci    if (channel_config < 1 || (channel_config > 7 && channel_config < 11) ||
635cabdff1aSopenharmony_ci        channel_config > 13) {
636cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR,
637cabdff1aSopenharmony_ci               "invalid default channel configuration (%d)\n",
638cabdff1aSopenharmony_ci               channel_config);
639cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
640cabdff1aSopenharmony_ci    }
641cabdff1aSopenharmony_ci    *tags = tags_per_config[channel_config];
642cabdff1aSopenharmony_ci    memcpy(layout_map, aac_channel_layout_map[channel_config - 1],
643cabdff1aSopenharmony_ci           *tags * sizeof(*layout_map));
644cabdff1aSopenharmony_ci
645cabdff1aSopenharmony_ci    /*
646cabdff1aSopenharmony_ci     * AAC specification has 7.1(wide) as a default layout for 8-channel streams.
647cabdff1aSopenharmony_ci     * However, at least Nero AAC encoder encodes 7.1 streams using the default
648cabdff1aSopenharmony_ci     * channel config 7, mapping the side channels of the original audio stream
649cabdff1aSopenharmony_ci     * to the second AAC_CHANNEL_FRONT pair in the AAC stream. Similarly, e.g. FAAD
650cabdff1aSopenharmony_ci     * decodes the second AAC_CHANNEL_FRONT pair as side channels, therefore decoding
651cabdff1aSopenharmony_ci     * the incorrect streams as if they were correct (and as the encoder intended).
652cabdff1aSopenharmony_ci     *
653cabdff1aSopenharmony_ci     * As actual intended 7.1(wide) streams are very rare, default to assuming a
654cabdff1aSopenharmony_ci     * 7.1 layout was intended.
655cabdff1aSopenharmony_ci     */
656cabdff1aSopenharmony_ci    if (channel_config == 7 && avctx->strict_std_compliance < FF_COMPLIANCE_STRICT) {
657cabdff1aSopenharmony_ci        layout_map[2][2] = AAC_CHANNEL_SIDE;
658cabdff1aSopenharmony_ci
659cabdff1aSopenharmony_ci        if (!ac || !ac->warned_71_wide++) {
660cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_INFO, "Assuming an incorrectly encoded 7.1 channel layout"
661cabdff1aSopenharmony_ci                   " instead of a spec-compliant 7.1(wide) layout, use -strict %d to decode"
662cabdff1aSopenharmony_ci                   " according to the specification instead.\n", FF_COMPLIANCE_STRICT);
663cabdff1aSopenharmony_ci        }
664cabdff1aSopenharmony_ci    }
665cabdff1aSopenharmony_ci
666cabdff1aSopenharmony_ci    return 0;
667cabdff1aSopenharmony_ci}
668cabdff1aSopenharmony_ci
669cabdff1aSopenharmony_cistatic ChannelElement *get_che(AACContext *ac, int type, int elem_id)
670cabdff1aSopenharmony_ci{
671cabdff1aSopenharmony_ci    /* For PCE based channel configurations map the channels solely based
672cabdff1aSopenharmony_ci     * on tags. */
673cabdff1aSopenharmony_ci    if (!ac->oc[1].m4ac.chan_config) {
674cabdff1aSopenharmony_ci        return ac->tag_che_map[type][elem_id];
675cabdff1aSopenharmony_ci    }
676cabdff1aSopenharmony_ci    // Allow single CPE stereo files to be signalled with mono configuration.
677cabdff1aSopenharmony_ci    if (!ac->tags_mapped && type == TYPE_CPE &&
678cabdff1aSopenharmony_ci        ac->oc[1].m4ac.chan_config == 1) {
679cabdff1aSopenharmony_ci        uint8_t layout_map[MAX_ELEM_ID*4][3];
680cabdff1aSopenharmony_ci        int layout_map_tags;
681cabdff1aSopenharmony_ci        push_output_configuration(ac);
682cabdff1aSopenharmony_ci
683cabdff1aSopenharmony_ci        av_log(ac->avctx, AV_LOG_DEBUG, "mono with CPE\n");
684cabdff1aSopenharmony_ci
685cabdff1aSopenharmony_ci        if (set_default_channel_config(ac, ac->avctx, layout_map,
686cabdff1aSopenharmony_ci                                       &layout_map_tags, 2) < 0)
687cabdff1aSopenharmony_ci            return NULL;
688cabdff1aSopenharmony_ci        if (output_configure(ac, layout_map, layout_map_tags,
689cabdff1aSopenharmony_ci                             OC_TRIAL_FRAME, 1) < 0)
690cabdff1aSopenharmony_ci            return NULL;
691cabdff1aSopenharmony_ci
692cabdff1aSopenharmony_ci        ac->oc[1].m4ac.chan_config = 2;
693cabdff1aSopenharmony_ci        ac->oc[1].m4ac.ps = 0;
694cabdff1aSopenharmony_ci    }
695cabdff1aSopenharmony_ci    // And vice-versa
696cabdff1aSopenharmony_ci    if (!ac->tags_mapped && type == TYPE_SCE &&
697cabdff1aSopenharmony_ci        ac->oc[1].m4ac.chan_config == 2) {
698cabdff1aSopenharmony_ci        uint8_t layout_map[MAX_ELEM_ID * 4][3];
699cabdff1aSopenharmony_ci        int layout_map_tags;
700cabdff1aSopenharmony_ci        push_output_configuration(ac);
701cabdff1aSopenharmony_ci
702cabdff1aSopenharmony_ci        av_log(ac->avctx, AV_LOG_DEBUG, "stereo with SCE\n");
703cabdff1aSopenharmony_ci
704cabdff1aSopenharmony_ci        layout_map_tags = 2;
705cabdff1aSopenharmony_ci        layout_map[0][0] = layout_map[1][0] = TYPE_SCE;
706cabdff1aSopenharmony_ci        layout_map[0][2] = layout_map[1][2] = AAC_CHANNEL_FRONT;
707cabdff1aSopenharmony_ci        layout_map[0][1] = 0;
708cabdff1aSopenharmony_ci        layout_map[1][1] = 1;
709cabdff1aSopenharmony_ci        if (output_configure(ac, layout_map, layout_map_tags,
710cabdff1aSopenharmony_ci                             OC_TRIAL_FRAME, 1) < 0)
711cabdff1aSopenharmony_ci            return NULL;
712cabdff1aSopenharmony_ci
713cabdff1aSopenharmony_ci        if (ac->oc[1].m4ac.sbr)
714cabdff1aSopenharmony_ci            ac->oc[1].m4ac.ps = -1;
715cabdff1aSopenharmony_ci    }
716cabdff1aSopenharmony_ci    /* For indexed channel configurations map the channels solely based
717cabdff1aSopenharmony_ci     * on position. */
718cabdff1aSopenharmony_ci    switch (ac->oc[1].m4ac.chan_config) {
719cabdff1aSopenharmony_ci    case 13:
720cabdff1aSopenharmony_ci        if (ac->tags_mapped > 3 && ((type == TYPE_CPE && elem_id < 8) ||
721cabdff1aSopenharmony_ci                                    (type == TYPE_SCE && elem_id < 6) ||
722cabdff1aSopenharmony_ci                                    (type == TYPE_LFE && elem_id < 2))) {
723cabdff1aSopenharmony_ci            ac->tags_mapped++;
724cabdff1aSopenharmony_ci            return ac->tag_che_map[type][elem_id] = ac->che[type][elem_id];
725cabdff1aSopenharmony_ci        }
726cabdff1aSopenharmony_ci    case 12:
727cabdff1aSopenharmony_ci    case 7:
728cabdff1aSopenharmony_ci        if (ac->tags_mapped == 3 && type == TYPE_CPE) {
729cabdff1aSopenharmony_ci            ac->tags_mapped++;
730cabdff1aSopenharmony_ci            return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][2];
731cabdff1aSopenharmony_ci        }
732cabdff1aSopenharmony_ci    case 11:
733cabdff1aSopenharmony_ci        if (ac->tags_mapped == 3 && type == TYPE_SCE) {
734cabdff1aSopenharmony_ci            ac->tags_mapped++;
735cabdff1aSopenharmony_ci            return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][1];
736cabdff1aSopenharmony_ci        }
737cabdff1aSopenharmony_ci    case 6:
738cabdff1aSopenharmony_ci        /* Some streams incorrectly code 5.1 audio as
739cabdff1aSopenharmony_ci         * SCE[0] CPE[0] CPE[1] SCE[1]
740cabdff1aSopenharmony_ci         * instead of
741cabdff1aSopenharmony_ci         * SCE[0] CPE[0] CPE[1] LFE[0].
742cabdff1aSopenharmony_ci         * If we seem to have encountered such a stream, transfer
743cabdff1aSopenharmony_ci         * the LFE[0] element to the SCE[1]'s mapping */
744cabdff1aSopenharmony_ci        if (ac->tags_mapped == tags_per_config[ac->oc[1].m4ac.chan_config] - 1 && (type == TYPE_LFE || type == TYPE_SCE)) {
745cabdff1aSopenharmony_ci            if (!ac->warned_remapping_once && (type != TYPE_LFE || elem_id != 0)) {
746cabdff1aSopenharmony_ci                av_log(ac->avctx, AV_LOG_WARNING,
747cabdff1aSopenharmony_ci                   "This stream seems to incorrectly report its last channel as %s[%d], mapping to LFE[0]\n",
748cabdff1aSopenharmony_ci                   type == TYPE_SCE ? "SCE" : "LFE", elem_id);
749cabdff1aSopenharmony_ci                ac->warned_remapping_once++;
750cabdff1aSopenharmony_ci            }
751cabdff1aSopenharmony_ci            ac->tags_mapped++;
752cabdff1aSopenharmony_ci            return ac->tag_che_map[type][elem_id] = ac->che[TYPE_LFE][0];
753cabdff1aSopenharmony_ci        }
754cabdff1aSopenharmony_ci    case 5:
755cabdff1aSopenharmony_ci        if (ac->tags_mapped == 2 && type == TYPE_CPE) {
756cabdff1aSopenharmony_ci            ac->tags_mapped++;
757cabdff1aSopenharmony_ci            return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][1];
758cabdff1aSopenharmony_ci        }
759cabdff1aSopenharmony_ci    case 4:
760cabdff1aSopenharmony_ci        /* Some streams incorrectly code 4.0 audio as
761cabdff1aSopenharmony_ci         * SCE[0] CPE[0] LFE[0]
762cabdff1aSopenharmony_ci         * instead of
763cabdff1aSopenharmony_ci         * SCE[0] CPE[0] SCE[1].
764cabdff1aSopenharmony_ci         * If we seem to have encountered such a stream, transfer
765cabdff1aSopenharmony_ci         * the SCE[1] element to the LFE[0]'s mapping */
766cabdff1aSopenharmony_ci        if (ac->tags_mapped == tags_per_config[ac->oc[1].m4ac.chan_config] - 1 && (type == TYPE_LFE || type == TYPE_SCE)) {
767cabdff1aSopenharmony_ci            if (!ac->warned_remapping_once && (type != TYPE_SCE || elem_id != 1)) {
768cabdff1aSopenharmony_ci                av_log(ac->avctx, AV_LOG_WARNING,
769cabdff1aSopenharmony_ci                   "This stream seems to incorrectly report its last channel as %s[%d], mapping to SCE[1]\n",
770cabdff1aSopenharmony_ci                   type == TYPE_SCE ? "SCE" : "LFE", elem_id);
771cabdff1aSopenharmony_ci                ac->warned_remapping_once++;
772cabdff1aSopenharmony_ci            }
773cabdff1aSopenharmony_ci            ac->tags_mapped++;
774cabdff1aSopenharmony_ci            return ac->tag_che_map[type][elem_id] = ac->che[TYPE_SCE][1];
775cabdff1aSopenharmony_ci        }
776cabdff1aSopenharmony_ci        if (ac->tags_mapped == 2 &&
777cabdff1aSopenharmony_ci            ac->oc[1].m4ac.chan_config == 4 &&
778cabdff1aSopenharmony_ci            type == TYPE_SCE) {
779cabdff1aSopenharmony_ci            ac->tags_mapped++;
780cabdff1aSopenharmony_ci            return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][1];
781cabdff1aSopenharmony_ci        }
782cabdff1aSopenharmony_ci    case 3:
783cabdff1aSopenharmony_ci    case 2:
784cabdff1aSopenharmony_ci        if (ac->tags_mapped == (ac->oc[1].m4ac.chan_config != 2) &&
785cabdff1aSopenharmony_ci            type == TYPE_CPE) {
786cabdff1aSopenharmony_ci            ac->tags_mapped++;
787cabdff1aSopenharmony_ci            return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][0];
788cabdff1aSopenharmony_ci        } else if (ac->tags_mapped == 1 && ac->oc[1].m4ac.chan_config == 2 &&
789cabdff1aSopenharmony_ci            type == TYPE_SCE) {
790cabdff1aSopenharmony_ci            ac->tags_mapped++;
791cabdff1aSopenharmony_ci            return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][1];
792cabdff1aSopenharmony_ci        }
793cabdff1aSopenharmony_ci    case 1:
794cabdff1aSopenharmony_ci        if (!ac->tags_mapped && type == TYPE_SCE) {
795cabdff1aSopenharmony_ci            ac->tags_mapped++;
796cabdff1aSopenharmony_ci            return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][0];
797cabdff1aSopenharmony_ci        }
798cabdff1aSopenharmony_ci    default:
799cabdff1aSopenharmony_ci        return NULL;
800cabdff1aSopenharmony_ci    }
801cabdff1aSopenharmony_ci}
802cabdff1aSopenharmony_ci
803cabdff1aSopenharmony_ci/**
804cabdff1aSopenharmony_ci * Decode an array of 4 bit element IDs, optionally interleaved with a
805cabdff1aSopenharmony_ci * stereo/mono switching bit.
806cabdff1aSopenharmony_ci *
807cabdff1aSopenharmony_ci * @param type speaker type/position for these channels
808cabdff1aSopenharmony_ci */
809cabdff1aSopenharmony_cistatic void decode_channel_map(uint8_t layout_map[][3],
810cabdff1aSopenharmony_ci                               enum ChannelPosition type,
811cabdff1aSopenharmony_ci                               GetBitContext *gb, int n)
812cabdff1aSopenharmony_ci{
813cabdff1aSopenharmony_ci    while (n--) {
814cabdff1aSopenharmony_ci        enum RawDataBlockType syn_ele;
815cabdff1aSopenharmony_ci        switch (type) {
816cabdff1aSopenharmony_ci        case AAC_CHANNEL_FRONT:
817cabdff1aSopenharmony_ci        case AAC_CHANNEL_BACK:
818cabdff1aSopenharmony_ci        case AAC_CHANNEL_SIDE:
819cabdff1aSopenharmony_ci            syn_ele = get_bits1(gb);
820cabdff1aSopenharmony_ci            break;
821cabdff1aSopenharmony_ci        case AAC_CHANNEL_CC:
822cabdff1aSopenharmony_ci            skip_bits1(gb);
823cabdff1aSopenharmony_ci            syn_ele = TYPE_CCE;
824cabdff1aSopenharmony_ci            break;
825cabdff1aSopenharmony_ci        case AAC_CHANNEL_LFE:
826cabdff1aSopenharmony_ci            syn_ele = TYPE_LFE;
827cabdff1aSopenharmony_ci            break;
828cabdff1aSopenharmony_ci        default:
829cabdff1aSopenharmony_ci            // AAC_CHANNEL_OFF has no channel map
830cabdff1aSopenharmony_ci            av_assert0(0);
831cabdff1aSopenharmony_ci        }
832cabdff1aSopenharmony_ci        layout_map[0][0] = syn_ele;
833cabdff1aSopenharmony_ci        layout_map[0][1] = get_bits(gb, 4);
834cabdff1aSopenharmony_ci        layout_map[0][2] = type;
835cabdff1aSopenharmony_ci        layout_map++;
836cabdff1aSopenharmony_ci    }
837cabdff1aSopenharmony_ci}
838cabdff1aSopenharmony_ci
839cabdff1aSopenharmony_cistatic inline void relative_align_get_bits(GetBitContext *gb,
840cabdff1aSopenharmony_ci                                           int reference_position) {
841cabdff1aSopenharmony_ci    int n = (reference_position - get_bits_count(gb) & 7);
842cabdff1aSopenharmony_ci    if (n)
843cabdff1aSopenharmony_ci        skip_bits(gb, n);
844cabdff1aSopenharmony_ci}
845cabdff1aSopenharmony_ci
846cabdff1aSopenharmony_ci/**
847cabdff1aSopenharmony_ci * Decode program configuration element; reference: table 4.2.
848cabdff1aSopenharmony_ci *
849cabdff1aSopenharmony_ci * @return  Returns error status. 0 - OK, !0 - error
850cabdff1aSopenharmony_ci */
851cabdff1aSopenharmony_cistatic int decode_pce(AVCodecContext *avctx, MPEG4AudioConfig *m4ac,
852cabdff1aSopenharmony_ci                      uint8_t (*layout_map)[3],
853cabdff1aSopenharmony_ci                      GetBitContext *gb, int byte_align_ref)
854cabdff1aSopenharmony_ci{
855cabdff1aSopenharmony_ci    int num_front, num_side, num_back, num_lfe, num_assoc_data, num_cc;
856cabdff1aSopenharmony_ci    int sampling_index;
857cabdff1aSopenharmony_ci    int comment_len;
858cabdff1aSopenharmony_ci    int tags;
859cabdff1aSopenharmony_ci
860cabdff1aSopenharmony_ci    skip_bits(gb, 2);  // object_type
861cabdff1aSopenharmony_ci
862cabdff1aSopenharmony_ci    sampling_index = get_bits(gb, 4);
863cabdff1aSopenharmony_ci    if (m4ac->sampling_index != sampling_index)
864cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_WARNING,
865cabdff1aSopenharmony_ci               "Sample rate index in program config element does not "
866cabdff1aSopenharmony_ci               "match the sample rate index configured by the container.\n");
867cabdff1aSopenharmony_ci
868cabdff1aSopenharmony_ci    num_front       = get_bits(gb, 4);
869cabdff1aSopenharmony_ci    num_side        = get_bits(gb, 4);
870cabdff1aSopenharmony_ci    num_back        = get_bits(gb, 4);
871cabdff1aSopenharmony_ci    num_lfe         = get_bits(gb, 2);
872cabdff1aSopenharmony_ci    num_assoc_data  = get_bits(gb, 3);
873cabdff1aSopenharmony_ci    num_cc          = get_bits(gb, 4);
874cabdff1aSopenharmony_ci
875cabdff1aSopenharmony_ci    if (get_bits1(gb))
876cabdff1aSopenharmony_ci        skip_bits(gb, 4); // mono_mixdown_tag
877cabdff1aSopenharmony_ci    if (get_bits1(gb))
878cabdff1aSopenharmony_ci        skip_bits(gb, 4); // stereo_mixdown_tag
879cabdff1aSopenharmony_ci
880cabdff1aSopenharmony_ci    if (get_bits1(gb))
881cabdff1aSopenharmony_ci        skip_bits(gb, 3); // mixdown_coeff_index and pseudo_surround
882cabdff1aSopenharmony_ci
883cabdff1aSopenharmony_ci    if (get_bits_left(gb) < 5 * (num_front + num_side + num_back + num_cc) + 4 *(num_lfe + num_assoc_data + num_cc)) {
884cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "decode_pce: " overread_err);
885cabdff1aSopenharmony_ci        return -1;
886cabdff1aSopenharmony_ci    }
887cabdff1aSopenharmony_ci    decode_channel_map(layout_map       , AAC_CHANNEL_FRONT, gb, num_front);
888cabdff1aSopenharmony_ci    tags = num_front;
889cabdff1aSopenharmony_ci    decode_channel_map(layout_map + tags, AAC_CHANNEL_SIDE,  gb, num_side);
890cabdff1aSopenharmony_ci    tags += num_side;
891cabdff1aSopenharmony_ci    decode_channel_map(layout_map + tags, AAC_CHANNEL_BACK,  gb, num_back);
892cabdff1aSopenharmony_ci    tags += num_back;
893cabdff1aSopenharmony_ci    decode_channel_map(layout_map + tags, AAC_CHANNEL_LFE,   gb, num_lfe);
894cabdff1aSopenharmony_ci    tags += num_lfe;
895cabdff1aSopenharmony_ci
896cabdff1aSopenharmony_ci    skip_bits_long(gb, 4 * num_assoc_data);
897cabdff1aSopenharmony_ci
898cabdff1aSopenharmony_ci    decode_channel_map(layout_map + tags, AAC_CHANNEL_CC,    gb, num_cc);
899cabdff1aSopenharmony_ci    tags += num_cc;
900cabdff1aSopenharmony_ci
901cabdff1aSopenharmony_ci    relative_align_get_bits(gb, byte_align_ref);
902cabdff1aSopenharmony_ci
903cabdff1aSopenharmony_ci    /* comment field, first byte is length */
904cabdff1aSopenharmony_ci    comment_len = get_bits(gb, 8) * 8;
905cabdff1aSopenharmony_ci    if (get_bits_left(gb) < comment_len) {
906cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "decode_pce: " overread_err);
907cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
908cabdff1aSopenharmony_ci    }
909cabdff1aSopenharmony_ci    skip_bits_long(gb, comment_len);
910cabdff1aSopenharmony_ci    return tags;
911cabdff1aSopenharmony_ci}
912cabdff1aSopenharmony_ci
913cabdff1aSopenharmony_ci/**
914cabdff1aSopenharmony_ci * Decode GA "General Audio" specific configuration; reference: table 4.1.
915cabdff1aSopenharmony_ci *
916cabdff1aSopenharmony_ci * @param   ac          pointer to AACContext, may be null
917cabdff1aSopenharmony_ci * @param   avctx       pointer to AVCCodecContext, used for logging
918cabdff1aSopenharmony_ci *
919cabdff1aSopenharmony_ci * @return  Returns error status. 0 - OK, !0 - error
920cabdff1aSopenharmony_ci */
921cabdff1aSopenharmony_cistatic int decode_ga_specific_config(AACContext *ac, AVCodecContext *avctx,
922cabdff1aSopenharmony_ci                                     GetBitContext *gb,
923cabdff1aSopenharmony_ci                                     int get_bit_alignment,
924cabdff1aSopenharmony_ci                                     MPEG4AudioConfig *m4ac,
925cabdff1aSopenharmony_ci                                     int channel_config)
926cabdff1aSopenharmony_ci{
927cabdff1aSopenharmony_ci    int extension_flag, ret, ep_config, res_flags;
928cabdff1aSopenharmony_ci    uint8_t layout_map[MAX_ELEM_ID*4][3];
929cabdff1aSopenharmony_ci    int tags = 0;
930cabdff1aSopenharmony_ci
931cabdff1aSopenharmony_ci#if USE_FIXED
932cabdff1aSopenharmony_ci    if (get_bits1(gb)) { // frameLengthFlag
933cabdff1aSopenharmony_ci        avpriv_report_missing_feature(avctx, "Fixed point 960/120 MDCT window");
934cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
935cabdff1aSopenharmony_ci    }
936cabdff1aSopenharmony_ci    m4ac->frame_length_short = 0;
937cabdff1aSopenharmony_ci#else
938cabdff1aSopenharmony_ci    m4ac->frame_length_short = get_bits1(gb);
939cabdff1aSopenharmony_ci    if (m4ac->frame_length_short && m4ac->sbr == 1) {
940cabdff1aSopenharmony_ci      avpriv_report_missing_feature(avctx, "SBR with 960 frame length");
941cabdff1aSopenharmony_ci      if (ac) ac->warned_960_sbr = 1;
942cabdff1aSopenharmony_ci      m4ac->sbr = 0;
943cabdff1aSopenharmony_ci      m4ac->ps = 0;
944cabdff1aSopenharmony_ci    }
945cabdff1aSopenharmony_ci#endif
946cabdff1aSopenharmony_ci
947cabdff1aSopenharmony_ci    if (get_bits1(gb))       // dependsOnCoreCoder
948cabdff1aSopenharmony_ci        skip_bits(gb, 14);   // coreCoderDelay
949cabdff1aSopenharmony_ci    extension_flag = get_bits1(gb);
950cabdff1aSopenharmony_ci
951cabdff1aSopenharmony_ci    if (m4ac->object_type == AOT_AAC_SCALABLE ||
952cabdff1aSopenharmony_ci        m4ac->object_type == AOT_ER_AAC_SCALABLE)
953cabdff1aSopenharmony_ci        skip_bits(gb, 3);     // layerNr
954cabdff1aSopenharmony_ci
955cabdff1aSopenharmony_ci    if (channel_config == 0) {
956cabdff1aSopenharmony_ci        skip_bits(gb, 4);  // element_instance_tag
957cabdff1aSopenharmony_ci        tags = decode_pce(avctx, m4ac, layout_map, gb, get_bit_alignment);
958cabdff1aSopenharmony_ci        if (tags < 0)
959cabdff1aSopenharmony_ci            return tags;
960cabdff1aSopenharmony_ci    } else {
961cabdff1aSopenharmony_ci        if ((ret = set_default_channel_config(ac, avctx, layout_map,
962cabdff1aSopenharmony_ci                                              &tags, channel_config)))
963cabdff1aSopenharmony_ci            return ret;
964cabdff1aSopenharmony_ci    }
965cabdff1aSopenharmony_ci
966cabdff1aSopenharmony_ci    if (count_channels(layout_map, tags) > 1) {
967cabdff1aSopenharmony_ci        m4ac->ps = 0;
968cabdff1aSopenharmony_ci    } else if (m4ac->sbr == 1 && m4ac->ps == -1)
969cabdff1aSopenharmony_ci        m4ac->ps = 1;
970cabdff1aSopenharmony_ci
971cabdff1aSopenharmony_ci    if (ac && (ret = output_configure(ac, layout_map, tags, OC_GLOBAL_HDR, 0)))
972cabdff1aSopenharmony_ci        return ret;
973cabdff1aSopenharmony_ci
974cabdff1aSopenharmony_ci    if (extension_flag) {
975cabdff1aSopenharmony_ci        switch (m4ac->object_type) {
976cabdff1aSopenharmony_ci        case AOT_ER_BSAC:
977cabdff1aSopenharmony_ci            skip_bits(gb, 5);    // numOfSubFrame
978cabdff1aSopenharmony_ci            skip_bits(gb, 11);   // layer_length
979cabdff1aSopenharmony_ci            break;
980cabdff1aSopenharmony_ci        case AOT_ER_AAC_LC:
981cabdff1aSopenharmony_ci        case AOT_ER_AAC_LTP:
982cabdff1aSopenharmony_ci        case AOT_ER_AAC_SCALABLE:
983cabdff1aSopenharmony_ci        case AOT_ER_AAC_LD:
984cabdff1aSopenharmony_ci            res_flags = get_bits(gb, 3);
985cabdff1aSopenharmony_ci            if (res_flags) {
986cabdff1aSopenharmony_ci                avpriv_report_missing_feature(avctx,
987cabdff1aSopenharmony_ci                                              "AAC data resilience (flags %x)",
988cabdff1aSopenharmony_ci                                              res_flags);
989cabdff1aSopenharmony_ci                return AVERROR_PATCHWELCOME;
990cabdff1aSopenharmony_ci            }
991cabdff1aSopenharmony_ci            break;
992cabdff1aSopenharmony_ci        }
993cabdff1aSopenharmony_ci        skip_bits1(gb);    // extensionFlag3 (TBD in version 3)
994cabdff1aSopenharmony_ci    }
995cabdff1aSopenharmony_ci    switch (m4ac->object_type) {
996cabdff1aSopenharmony_ci    case AOT_ER_AAC_LC:
997cabdff1aSopenharmony_ci    case AOT_ER_AAC_LTP:
998cabdff1aSopenharmony_ci    case AOT_ER_AAC_SCALABLE:
999cabdff1aSopenharmony_ci    case AOT_ER_AAC_LD:
1000cabdff1aSopenharmony_ci        ep_config = get_bits(gb, 2);
1001cabdff1aSopenharmony_ci        if (ep_config) {
1002cabdff1aSopenharmony_ci            avpriv_report_missing_feature(avctx,
1003cabdff1aSopenharmony_ci                                          "epConfig %d", ep_config);
1004cabdff1aSopenharmony_ci            return AVERROR_PATCHWELCOME;
1005cabdff1aSopenharmony_ci        }
1006cabdff1aSopenharmony_ci    }
1007cabdff1aSopenharmony_ci    return 0;
1008cabdff1aSopenharmony_ci}
1009cabdff1aSopenharmony_ci
1010cabdff1aSopenharmony_cistatic int decode_eld_specific_config(AACContext *ac, AVCodecContext *avctx,
1011cabdff1aSopenharmony_ci                                     GetBitContext *gb,
1012cabdff1aSopenharmony_ci                                     MPEG4AudioConfig *m4ac,
1013cabdff1aSopenharmony_ci                                     int channel_config)
1014cabdff1aSopenharmony_ci{
1015cabdff1aSopenharmony_ci    int ret, ep_config, res_flags;
1016cabdff1aSopenharmony_ci    uint8_t layout_map[MAX_ELEM_ID*4][3];
1017cabdff1aSopenharmony_ci    int tags = 0;
1018cabdff1aSopenharmony_ci    const int ELDEXT_TERM = 0;
1019cabdff1aSopenharmony_ci
1020cabdff1aSopenharmony_ci    m4ac->ps  = 0;
1021cabdff1aSopenharmony_ci    m4ac->sbr = 0;
1022cabdff1aSopenharmony_ci#if USE_FIXED
1023cabdff1aSopenharmony_ci    if (get_bits1(gb)) { // frameLengthFlag
1024cabdff1aSopenharmony_ci        avpriv_request_sample(avctx, "960/120 MDCT window");
1025cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
1026cabdff1aSopenharmony_ci    }
1027cabdff1aSopenharmony_ci#else
1028cabdff1aSopenharmony_ci    m4ac->frame_length_short = get_bits1(gb);
1029cabdff1aSopenharmony_ci#endif
1030cabdff1aSopenharmony_ci    res_flags = get_bits(gb, 3);
1031cabdff1aSopenharmony_ci    if (res_flags) {
1032cabdff1aSopenharmony_ci        avpriv_report_missing_feature(avctx,
1033cabdff1aSopenharmony_ci                                      "AAC data resilience (flags %x)",
1034cabdff1aSopenharmony_ci                                      res_flags);
1035cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
1036cabdff1aSopenharmony_ci    }
1037cabdff1aSopenharmony_ci
1038cabdff1aSopenharmony_ci    if (get_bits1(gb)) { // ldSbrPresentFlag
1039cabdff1aSopenharmony_ci        avpriv_report_missing_feature(avctx,
1040cabdff1aSopenharmony_ci                                      "Low Delay SBR");
1041cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
1042cabdff1aSopenharmony_ci    }
1043cabdff1aSopenharmony_ci
1044cabdff1aSopenharmony_ci    while (get_bits(gb, 4) != ELDEXT_TERM) {
1045cabdff1aSopenharmony_ci        int len = get_bits(gb, 4);
1046cabdff1aSopenharmony_ci        if (len == 15)
1047cabdff1aSopenharmony_ci            len += get_bits(gb, 8);
1048cabdff1aSopenharmony_ci        if (len == 15 + 255)
1049cabdff1aSopenharmony_ci            len += get_bits(gb, 16);
1050cabdff1aSopenharmony_ci        if (get_bits_left(gb) < len * 8 + 4) {
1051cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, overread_err);
1052cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1053cabdff1aSopenharmony_ci        }
1054cabdff1aSopenharmony_ci        skip_bits_long(gb, 8 * len);
1055cabdff1aSopenharmony_ci    }
1056cabdff1aSopenharmony_ci
1057cabdff1aSopenharmony_ci    if ((ret = set_default_channel_config(ac, avctx, layout_map,
1058cabdff1aSopenharmony_ci                                          &tags, channel_config)))
1059cabdff1aSopenharmony_ci        return ret;
1060cabdff1aSopenharmony_ci
1061cabdff1aSopenharmony_ci    if (ac && (ret = output_configure(ac, layout_map, tags, OC_GLOBAL_HDR, 0)))
1062cabdff1aSopenharmony_ci        return ret;
1063cabdff1aSopenharmony_ci
1064cabdff1aSopenharmony_ci    ep_config = get_bits(gb, 2);
1065cabdff1aSopenharmony_ci    if (ep_config) {
1066cabdff1aSopenharmony_ci        avpriv_report_missing_feature(avctx,
1067cabdff1aSopenharmony_ci                                      "epConfig %d", ep_config);
1068cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
1069cabdff1aSopenharmony_ci    }
1070cabdff1aSopenharmony_ci    return 0;
1071cabdff1aSopenharmony_ci}
1072cabdff1aSopenharmony_ci
1073cabdff1aSopenharmony_ci/**
1074cabdff1aSopenharmony_ci * Decode audio specific configuration; reference: table 1.13.
1075cabdff1aSopenharmony_ci *
1076cabdff1aSopenharmony_ci * @param   ac          pointer to AACContext, may be null
1077cabdff1aSopenharmony_ci * @param   avctx       pointer to AVCCodecContext, used for logging
1078cabdff1aSopenharmony_ci * @param   m4ac        pointer to MPEG4AudioConfig, used for parsing
1079cabdff1aSopenharmony_ci * @param   gb          buffer holding an audio specific config
1080cabdff1aSopenharmony_ci * @param   get_bit_alignment relative alignment for byte align operations
1081cabdff1aSopenharmony_ci * @param   sync_extension look for an appended sync extension
1082cabdff1aSopenharmony_ci *
1083cabdff1aSopenharmony_ci * @return  Returns error status or number of consumed bits. <0 - error
1084cabdff1aSopenharmony_ci */
1085cabdff1aSopenharmony_cistatic int decode_audio_specific_config_gb(AACContext *ac,
1086cabdff1aSopenharmony_ci                                           AVCodecContext *avctx,
1087cabdff1aSopenharmony_ci                                           MPEG4AudioConfig *m4ac,
1088cabdff1aSopenharmony_ci                                           GetBitContext *gb,
1089cabdff1aSopenharmony_ci                                           int get_bit_alignment,
1090cabdff1aSopenharmony_ci                                           int sync_extension)
1091cabdff1aSopenharmony_ci{
1092cabdff1aSopenharmony_ci    int i, ret;
1093cabdff1aSopenharmony_ci    GetBitContext gbc = *gb;
1094cabdff1aSopenharmony_ci    MPEG4AudioConfig m4ac_bak = *m4ac;
1095cabdff1aSopenharmony_ci
1096cabdff1aSopenharmony_ci    if ((i = ff_mpeg4audio_get_config_gb(m4ac, &gbc, sync_extension, avctx)) < 0) {
1097cabdff1aSopenharmony_ci        *m4ac = m4ac_bak;
1098cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1099cabdff1aSopenharmony_ci    }
1100cabdff1aSopenharmony_ci
1101cabdff1aSopenharmony_ci    if (m4ac->sampling_index > 12) {
1102cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR,
1103cabdff1aSopenharmony_ci               "invalid sampling rate index %d\n",
1104cabdff1aSopenharmony_ci               m4ac->sampling_index);
1105cabdff1aSopenharmony_ci        *m4ac = m4ac_bak;
1106cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1107cabdff1aSopenharmony_ci    }
1108cabdff1aSopenharmony_ci    if (m4ac->object_type == AOT_ER_AAC_LD &&
1109cabdff1aSopenharmony_ci        (m4ac->sampling_index < 3 || m4ac->sampling_index > 7)) {
1110cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR,
1111cabdff1aSopenharmony_ci               "invalid low delay sampling rate index %d\n",
1112cabdff1aSopenharmony_ci               m4ac->sampling_index);
1113cabdff1aSopenharmony_ci        *m4ac = m4ac_bak;
1114cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1115cabdff1aSopenharmony_ci    }
1116cabdff1aSopenharmony_ci
1117cabdff1aSopenharmony_ci    skip_bits_long(gb, i);
1118cabdff1aSopenharmony_ci
1119cabdff1aSopenharmony_ci    switch (m4ac->object_type) {
1120cabdff1aSopenharmony_ci    case AOT_AAC_MAIN:
1121cabdff1aSopenharmony_ci    case AOT_AAC_LC:
1122cabdff1aSopenharmony_ci    case AOT_AAC_SSR:
1123cabdff1aSopenharmony_ci    case AOT_AAC_LTP:
1124cabdff1aSopenharmony_ci    case AOT_ER_AAC_LC:
1125cabdff1aSopenharmony_ci    case AOT_ER_AAC_LD:
1126cabdff1aSopenharmony_ci        if ((ret = decode_ga_specific_config(ac, avctx, gb, get_bit_alignment,
1127cabdff1aSopenharmony_ci                                            m4ac, m4ac->chan_config)) < 0)
1128cabdff1aSopenharmony_ci            return ret;
1129cabdff1aSopenharmony_ci        break;
1130cabdff1aSopenharmony_ci    case AOT_ER_AAC_ELD:
1131cabdff1aSopenharmony_ci        if ((ret = decode_eld_specific_config(ac, avctx, gb,
1132cabdff1aSopenharmony_ci                                              m4ac, m4ac->chan_config)) < 0)
1133cabdff1aSopenharmony_ci            return ret;
1134cabdff1aSopenharmony_ci        break;
1135cabdff1aSopenharmony_ci    default:
1136cabdff1aSopenharmony_ci        avpriv_report_missing_feature(avctx,
1137cabdff1aSopenharmony_ci                                      "Audio object type %s%d",
1138cabdff1aSopenharmony_ci                                      m4ac->sbr == 1 ? "SBR+" : "",
1139cabdff1aSopenharmony_ci                                      m4ac->object_type);
1140cabdff1aSopenharmony_ci        return AVERROR(ENOSYS);
1141cabdff1aSopenharmony_ci    }
1142cabdff1aSopenharmony_ci
1143cabdff1aSopenharmony_ci    ff_dlog(avctx,
1144cabdff1aSopenharmony_ci            "AOT %d chan config %d sampling index %d (%d) SBR %d PS %d\n",
1145cabdff1aSopenharmony_ci            m4ac->object_type, m4ac->chan_config, m4ac->sampling_index,
1146cabdff1aSopenharmony_ci            m4ac->sample_rate, m4ac->sbr,
1147cabdff1aSopenharmony_ci            m4ac->ps);
1148cabdff1aSopenharmony_ci
1149cabdff1aSopenharmony_ci    return get_bits_count(gb);
1150cabdff1aSopenharmony_ci}
1151cabdff1aSopenharmony_ci
1152cabdff1aSopenharmony_cistatic int decode_audio_specific_config(AACContext *ac,
1153cabdff1aSopenharmony_ci                                        AVCodecContext *avctx,
1154cabdff1aSopenharmony_ci                                        MPEG4AudioConfig *m4ac,
1155cabdff1aSopenharmony_ci                                        const uint8_t *data, int64_t bit_size,
1156cabdff1aSopenharmony_ci                                        int sync_extension)
1157cabdff1aSopenharmony_ci{
1158cabdff1aSopenharmony_ci    int i, ret;
1159cabdff1aSopenharmony_ci    GetBitContext gb;
1160cabdff1aSopenharmony_ci
1161cabdff1aSopenharmony_ci    if (bit_size < 0 || bit_size > INT_MAX) {
1162cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Audio specific config size is invalid\n");
1163cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1164cabdff1aSopenharmony_ci    }
1165cabdff1aSopenharmony_ci
1166cabdff1aSopenharmony_ci    ff_dlog(avctx, "audio specific config size %d\n", (int)bit_size >> 3);
1167cabdff1aSopenharmony_ci    for (i = 0; i < bit_size >> 3; i++)
1168cabdff1aSopenharmony_ci        ff_dlog(avctx, "%02x ", data[i]);
1169cabdff1aSopenharmony_ci    ff_dlog(avctx, "\n");
1170cabdff1aSopenharmony_ci
1171cabdff1aSopenharmony_ci    if ((ret = init_get_bits(&gb, data, bit_size)) < 0)
1172cabdff1aSopenharmony_ci        return ret;
1173cabdff1aSopenharmony_ci
1174cabdff1aSopenharmony_ci    return decode_audio_specific_config_gb(ac, avctx, m4ac, &gb, 0,
1175cabdff1aSopenharmony_ci                                           sync_extension);
1176cabdff1aSopenharmony_ci}
1177cabdff1aSopenharmony_ci
1178cabdff1aSopenharmony_ci/**
1179cabdff1aSopenharmony_ci * linear congruential pseudorandom number generator
1180cabdff1aSopenharmony_ci *
1181cabdff1aSopenharmony_ci * @param   previous_val    pointer to the current state of the generator
1182cabdff1aSopenharmony_ci *
1183cabdff1aSopenharmony_ci * @return  Returns a 32-bit pseudorandom integer
1184cabdff1aSopenharmony_ci */
1185cabdff1aSopenharmony_cistatic av_always_inline int lcg_random(unsigned previous_val)
1186cabdff1aSopenharmony_ci{
1187cabdff1aSopenharmony_ci    union { unsigned u; int s; } v = { previous_val * 1664525u + 1013904223 };
1188cabdff1aSopenharmony_ci    return v.s;
1189cabdff1aSopenharmony_ci}
1190cabdff1aSopenharmony_ci
1191cabdff1aSopenharmony_cistatic void reset_all_predictors(PredictorState *ps)
1192cabdff1aSopenharmony_ci{
1193cabdff1aSopenharmony_ci    int i;
1194cabdff1aSopenharmony_ci    for (i = 0; i < MAX_PREDICTORS; i++)
1195cabdff1aSopenharmony_ci        reset_predict_state(&ps[i]);
1196cabdff1aSopenharmony_ci}
1197cabdff1aSopenharmony_ci
1198cabdff1aSopenharmony_cistatic int sample_rate_idx (int rate)
1199cabdff1aSopenharmony_ci{
1200cabdff1aSopenharmony_ci         if (92017 <= rate) return 0;
1201cabdff1aSopenharmony_ci    else if (75132 <= rate) return 1;
1202cabdff1aSopenharmony_ci    else if (55426 <= rate) return 2;
1203cabdff1aSopenharmony_ci    else if (46009 <= rate) return 3;
1204cabdff1aSopenharmony_ci    else if (37566 <= rate) return 4;
1205cabdff1aSopenharmony_ci    else if (27713 <= rate) return 5;
1206cabdff1aSopenharmony_ci    else if (23004 <= rate) return 6;
1207cabdff1aSopenharmony_ci    else if (18783 <= rate) return 7;
1208cabdff1aSopenharmony_ci    else if (13856 <= rate) return 8;
1209cabdff1aSopenharmony_ci    else if (11502 <= rate) return 9;
1210cabdff1aSopenharmony_ci    else if (9391  <= rate) return 10;
1211cabdff1aSopenharmony_ci    else                    return 11;
1212cabdff1aSopenharmony_ci}
1213cabdff1aSopenharmony_ci
1214cabdff1aSopenharmony_cistatic void reset_predictor_group(PredictorState *ps, int group_num)
1215cabdff1aSopenharmony_ci{
1216cabdff1aSopenharmony_ci    int i;
1217cabdff1aSopenharmony_ci    for (i = group_num - 1; i < MAX_PREDICTORS; i += 30)
1218cabdff1aSopenharmony_ci        reset_predict_state(&ps[i]);
1219cabdff1aSopenharmony_ci}
1220cabdff1aSopenharmony_ci
1221cabdff1aSopenharmony_cistatic void aacdec_init(AACContext *ac);
1222cabdff1aSopenharmony_ci
1223cabdff1aSopenharmony_cistatic av_cold void aac_static_table_init(void)
1224cabdff1aSopenharmony_ci{
1225cabdff1aSopenharmony_ci    static VLCElem vlc_buf[304 + 270 + 550 + 300 + 328 +
1226cabdff1aSopenharmony_ci                           294 + 306 + 268 + 510 + 366 + 462];
1227cabdff1aSopenharmony_ci    for (unsigned i = 0, offset = 0; i < 11; i++) {
1228cabdff1aSopenharmony_ci        vlc_spectral[i].table           = &vlc_buf[offset];
1229cabdff1aSopenharmony_ci        vlc_spectral[i].table_allocated = FF_ARRAY_ELEMS(vlc_buf) - offset;
1230cabdff1aSopenharmony_ci        ff_init_vlc_sparse(&vlc_spectral[i], 8, ff_aac_spectral_sizes[i],
1231cabdff1aSopenharmony_ci                           ff_aac_spectral_bits[i],       sizeof(ff_aac_spectral_bits[i][0]),
1232cabdff1aSopenharmony_ci                                                          sizeof(ff_aac_spectral_bits[i][0]),
1233cabdff1aSopenharmony_ci                           ff_aac_spectral_codes[i],      sizeof(ff_aac_spectral_codes[i][0]),
1234cabdff1aSopenharmony_ci                                                          sizeof(ff_aac_spectral_codes[i][0]),
1235cabdff1aSopenharmony_ci                           ff_aac_codebook_vector_idx[i], sizeof(ff_aac_codebook_vector_idx[i][0]),
1236cabdff1aSopenharmony_ci                                                          sizeof(ff_aac_codebook_vector_idx[i][0]),
1237cabdff1aSopenharmony_ci                 INIT_VLC_STATIC_OVERLONG);
1238cabdff1aSopenharmony_ci        offset += vlc_spectral[i].table_size;
1239cabdff1aSopenharmony_ci    }
1240cabdff1aSopenharmony_ci
1241cabdff1aSopenharmony_ci    AAC_RENAME(ff_aac_sbr_init)();
1242cabdff1aSopenharmony_ci
1243cabdff1aSopenharmony_ci    ff_aac_tableinit();
1244cabdff1aSopenharmony_ci
1245cabdff1aSopenharmony_ci    INIT_VLC_STATIC(&vlc_scalefactors, 7,
1246cabdff1aSopenharmony_ci                    FF_ARRAY_ELEMS(ff_aac_scalefactor_code),
1247cabdff1aSopenharmony_ci                    ff_aac_scalefactor_bits,
1248cabdff1aSopenharmony_ci                    sizeof(ff_aac_scalefactor_bits[0]),
1249cabdff1aSopenharmony_ci                    sizeof(ff_aac_scalefactor_bits[0]),
1250cabdff1aSopenharmony_ci                    ff_aac_scalefactor_code,
1251cabdff1aSopenharmony_ci                    sizeof(ff_aac_scalefactor_code[0]),
1252cabdff1aSopenharmony_ci                    sizeof(ff_aac_scalefactor_code[0]),
1253cabdff1aSopenharmony_ci                    352);
1254cabdff1aSopenharmony_ci
1255cabdff1aSopenharmony_ci    // window initialization
1256cabdff1aSopenharmony_ci#if !USE_FIXED
1257cabdff1aSopenharmony_ci    AAC_RENAME(ff_kbd_window_init)(AAC_RENAME(aac_kbd_long_960), 4.0, 960);
1258cabdff1aSopenharmony_ci    AAC_RENAME(ff_kbd_window_init)(AAC_RENAME(aac_kbd_short_120), 6.0, 120);
1259cabdff1aSopenharmony_ci    AAC_RENAME(ff_sine_window_init)(AAC_RENAME(sine_960), 960);
1260cabdff1aSopenharmony_ci    AAC_RENAME(ff_sine_window_init)(AAC_RENAME(sine_120), 120);
1261cabdff1aSopenharmony_ci    AAC_RENAME(ff_init_ff_sine_windows)(9);
1262cabdff1aSopenharmony_ci    ff_aac_float_common_init();
1263cabdff1aSopenharmony_ci#else
1264cabdff1aSopenharmony_ci    AAC_RENAME(ff_kbd_window_init)(AAC_RENAME2(aac_kbd_long_1024), 4.0, 1024);
1265cabdff1aSopenharmony_ci    AAC_RENAME(ff_kbd_window_init)(AAC_RENAME2(aac_kbd_short_128), 6.0, 128);
1266cabdff1aSopenharmony_ci    init_sine_windows_fixed();
1267cabdff1aSopenharmony_ci#endif
1268cabdff1aSopenharmony_ci
1269cabdff1aSopenharmony_ci    AAC_RENAME(ff_cbrt_tableinit)();
1270cabdff1aSopenharmony_ci}
1271cabdff1aSopenharmony_ci
1272cabdff1aSopenharmony_cistatic AVOnce aac_table_init = AV_ONCE_INIT;
1273cabdff1aSopenharmony_ci
1274cabdff1aSopenharmony_cistatic av_cold int aac_decode_init(AVCodecContext *avctx)
1275cabdff1aSopenharmony_ci{
1276cabdff1aSopenharmony_ci    AACContext *ac = avctx->priv_data;
1277cabdff1aSopenharmony_ci    int ret;
1278cabdff1aSopenharmony_ci
1279cabdff1aSopenharmony_ci    if (avctx->sample_rate > 96000)
1280cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1281cabdff1aSopenharmony_ci
1282cabdff1aSopenharmony_ci    ret = ff_thread_once(&aac_table_init, &aac_static_table_init);
1283cabdff1aSopenharmony_ci    if (ret != 0)
1284cabdff1aSopenharmony_ci        return AVERROR_UNKNOWN;
1285cabdff1aSopenharmony_ci
1286cabdff1aSopenharmony_ci    ac->avctx = avctx;
1287cabdff1aSopenharmony_ci    ac->oc[1].m4ac.sample_rate = avctx->sample_rate;
1288cabdff1aSopenharmony_ci
1289cabdff1aSopenharmony_ci    aacdec_init(ac);
1290cabdff1aSopenharmony_ci#if USE_FIXED
1291cabdff1aSopenharmony_ci    avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
1292cabdff1aSopenharmony_ci#else
1293cabdff1aSopenharmony_ci    avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
1294cabdff1aSopenharmony_ci#endif /* USE_FIXED */
1295cabdff1aSopenharmony_ci
1296cabdff1aSopenharmony_ci    if (avctx->extradata_size > 0) {
1297cabdff1aSopenharmony_ci        if ((ret = decode_audio_specific_config(ac, ac->avctx, &ac->oc[1].m4ac,
1298cabdff1aSopenharmony_ci                                                avctx->extradata,
1299cabdff1aSopenharmony_ci                                                avctx->extradata_size * 8LL,
1300cabdff1aSopenharmony_ci                                                1)) < 0)
1301cabdff1aSopenharmony_ci            return ret;
1302cabdff1aSopenharmony_ci    } else {
1303cabdff1aSopenharmony_ci        int sr, i;
1304cabdff1aSopenharmony_ci        uint8_t layout_map[MAX_ELEM_ID*4][3];
1305cabdff1aSopenharmony_ci        int layout_map_tags;
1306cabdff1aSopenharmony_ci
1307cabdff1aSopenharmony_ci        sr = sample_rate_idx(avctx->sample_rate);
1308cabdff1aSopenharmony_ci        ac->oc[1].m4ac.sampling_index = sr;
1309cabdff1aSopenharmony_ci        ac->oc[1].m4ac.channels = avctx->ch_layout.nb_channels;
1310cabdff1aSopenharmony_ci        ac->oc[1].m4ac.sbr = -1;
1311cabdff1aSopenharmony_ci        ac->oc[1].m4ac.ps = -1;
1312cabdff1aSopenharmony_ci
1313cabdff1aSopenharmony_ci        for (i = 0; i < FF_ARRAY_ELEMS(ff_mpeg4audio_channels); i++)
1314cabdff1aSopenharmony_ci            if (ff_mpeg4audio_channels[i] == avctx->ch_layout.nb_channels)
1315cabdff1aSopenharmony_ci                break;
1316cabdff1aSopenharmony_ci        if (i == FF_ARRAY_ELEMS(ff_mpeg4audio_channels)) {
1317cabdff1aSopenharmony_ci            i = 0;
1318cabdff1aSopenharmony_ci        }
1319cabdff1aSopenharmony_ci        ac->oc[1].m4ac.chan_config = i;
1320cabdff1aSopenharmony_ci
1321cabdff1aSopenharmony_ci        if (ac->oc[1].m4ac.chan_config) {
1322cabdff1aSopenharmony_ci            int ret = set_default_channel_config(ac, avctx, layout_map,
1323cabdff1aSopenharmony_ci                &layout_map_tags, ac->oc[1].m4ac.chan_config);
1324cabdff1aSopenharmony_ci            if (!ret)
1325cabdff1aSopenharmony_ci                output_configure(ac, layout_map, layout_map_tags,
1326cabdff1aSopenharmony_ci                                 OC_GLOBAL_HDR, 0);
1327cabdff1aSopenharmony_ci            else if (avctx->err_recognition & AV_EF_EXPLODE)
1328cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1329cabdff1aSopenharmony_ci        }
1330cabdff1aSopenharmony_ci    }
1331cabdff1aSopenharmony_ci
1332cabdff1aSopenharmony_ci    if (avctx->ch_layout.nb_channels > MAX_CHANNELS) {
1333cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Too many channels\n");
1334cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1335cabdff1aSopenharmony_ci    }
1336cabdff1aSopenharmony_ci
1337cabdff1aSopenharmony_ci#if USE_FIXED
1338cabdff1aSopenharmony_ci    ac->fdsp = avpriv_alloc_fixed_dsp(avctx->flags & AV_CODEC_FLAG_BITEXACT);
1339cabdff1aSopenharmony_ci#else
1340cabdff1aSopenharmony_ci    ac->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT);
1341cabdff1aSopenharmony_ci#endif /* USE_FIXED */
1342cabdff1aSopenharmony_ci    if (!ac->fdsp) {
1343cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
1344cabdff1aSopenharmony_ci    }
1345cabdff1aSopenharmony_ci
1346cabdff1aSopenharmony_ci    ac->random_state = 0x1f2e3d4c;
1347cabdff1aSopenharmony_ci
1348cabdff1aSopenharmony_ci    AAC_RENAME_32(ff_mdct_init)(&ac->mdct,       11, 1, 1.0 / RANGE15(1024.0));
1349cabdff1aSopenharmony_ci    AAC_RENAME_32(ff_mdct_init)(&ac->mdct_ld,    10, 1, 1.0 / RANGE15(512.0));
1350cabdff1aSopenharmony_ci    AAC_RENAME_32(ff_mdct_init)(&ac->mdct_small,  8, 1, 1.0 / RANGE15(128.0));
1351cabdff1aSopenharmony_ci    AAC_RENAME_32(ff_mdct_init)(&ac->mdct_ltp,   11, 0, RANGE15(-2.0));
1352cabdff1aSopenharmony_ci#if !USE_FIXED
1353cabdff1aSopenharmony_ci    ret = ff_mdct15_init(&ac->mdct120, 1, 3, 1.0f/(16*1024*120*2));
1354cabdff1aSopenharmony_ci    if (ret < 0)
1355cabdff1aSopenharmony_ci        return ret;
1356cabdff1aSopenharmony_ci    ret = ff_mdct15_init(&ac->mdct480, 1, 5, 1.0f/(16*1024*960));
1357cabdff1aSopenharmony_ci    if (ret < 0)
1358cabdff1aSopenharmony_ci        return ret;
1359cabdff1aSopenharmony_ci    ret = ff_mdct15_init(&ac->mdct960, 1, 6, 1.0f/(16*1024*960*2));
1360cabdff1aSopenharmony_ci    if (ret < 0)
1361cabdff1aSopenharmony_ci        return ret;
1362cabdff1aSopenharmony_ci#endif
1363cabdff1aSopenharmony_ci
1364cabdff1aSopenharmony_ci    return 0;
1365cabdff1aSopenharmony_ci}
1366cabdff1aSopenharmony_ci
1367cabdff1aSopenharmony_ci/**
1368cabdff1aSopenharmony_ci * Skip data_stream_element; reference: table 4.10.
1369cabdff1aSopenharmony_ci */
1370cabdff1aSopenharmony_cistatic int skip_data_stream_element(AACContext *ac, GetBitContext *gb)
1371cabdff1aSopenharmony_ci{
1372cabdff1aSopenharmony_ci    int byte_align = get_bits1(gb);
1373cabdff1aSopenharmony_ci    int count = get_bits(gb, 8);
1374cabdff1aSopenharmony_ci    if (count == 255)
1375cabdff1aSopenharmony_ci        count += get_bits(gb, 8);
1376cabdff1aSopenharmony_ci    if (byte_align)
1377cabdff1aSopenharmony_ci        align_get_bits(gb);
1378cabdff1aSopenharmony_ci
1379cabdff1aSopenharmony_ci    if (get_bits_left(gb) < 8 * count) {
1380cabdff1aSopenharmony_ci        av_log(ac->avctx, AV_LOG_ERROR, "skip_data_stream_element: "overread_err);
1381cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1382cabdff1aSopenharmony_ci    }
1383cabdff1aSopenharmony_ci    skip_bits_long(gb, 8 * count);
1384cabdff1aSopenharmony_ci    return 0;
1385cabdff1aSopenharmony_ci}
1386cabdff1aSopenharmony_ci
1387cabdff1aSopenharmony_cistatic int decode_prediction(AACContext *ac, IndividualChannelStream *ics,
1388cabdff1aSopenharmony_ci                             GetBitContext *gb)
1389cabdff1aSopenharmony_ci{
1390cabdff1aSopenharmony_ci    int sfb;
1391cabdff1aSopenharmony_ci    if (get_bits1(gb)) {
1392cabdff1aSopenharmony_ci        ics->predictor_reset_group = get_bits(gb, 5);
1393cabdff1aSopenharmony_ci        if (ics->predictor_reset_group == 0 ||
1394cabdff1aSopenharmony_ci            ics->predictor_reset_group > 30) {
1395cabdff1aSopenharmony_ci            av_log(ac->avctx, AV_LOG_ERROR,
1396cabdff1aSopenharmony_ci                   "Invalid Predictor Reset Group.\n");
1397cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1398cabdff1aSopenharmony_ci        }
1399cabdff1aSopenharmony_ci    }
1400cabdff1aSopenharmony_ci    for (sfb = 0; sfb < FFMIN(ics->max_sfb, ff_aac_pred_sfb_max[ac->oc[1].m4ac.sampling_index]); sfb++) {
1401cabdff1aSopenharmony_ci        ics->prediction_used[sfb] = get_bits1(gb);
1402cabdff1aSopenharmony_ci    }
1403cabdff1aSopenharmony_ci    return 0;
1404cabdff1aSopenharmony_ci}
1405cabdff1aSopenharmony_ci
1406cabdff1aSopenharmony_ci/**
1407cabdff1aSopenharmony_ci * Decode Long Term Prediction data; reference: table 4.xx.
1408cabdff1aSopenharmony_ci */
1409cabdff1aSopenharmony_cistatic void decode_ltp(LongTermPrediction *ltp,
1410cabdff1aSopenharmony_ci                       GetBitContext *gb, uint8_t max_sfb)
1411cabdff1aSopenharmony_ci{
1412cabdff1aSopenharmony_ci    int sfb;
1413cabdff1aSopenharmony_ci
1414cabdff1aSopenharmony_ci    ltp->lag  = get_bits(gb, 11);
1415cabdff1aSopenharmony_ci    ltp->coef = ltp_coef[get_bits(gb, 3)];
1416cabdff1aSopenharmony_ci    for (sfb = 0; sfb < FFMIN(max_sfb, MAX_LTP_LONG_SFB); sfb++)
1417cabdff1aSopenharmony_ci        ltp->used[sfb] = get_bits1(gb);
1418cabdff1aSopenharmony_ci}
1419cabdff1aSopenharmony_ci
1420cabdff1aSopenharmony_ci/**
1421cabdff1aSopenharmony_ci * Decode Individual Channel Stream info; reference: table 4.6.
1422cabdff1aSopenharmony_ci */
1423cabdff1aSopenharmony_cistatic int decode_ics_info(AACContext *ac, IndividualChannelStream *ics,
1424cabdff1aSopenharmony_ci                           GetBitContext *gb)
1425cabdff1aSopenharmony_ci{
1426cabdff1aSopenharmony_ci    const MPEG4AudioConfig *const m4ac = &ac->oc[1].m4ac;
1427cabdff1aSopenharmony_ci    const int aot = m4ac->object_type;
1428cabdff1aSopenharmony_ci    const int sampling_index = m4ac->sampling_index;
1429cabdff1aSopenharmony_ci    int ret_fail = AVERROR_INVALIDDATA;
1430cabdff1aSopenharmony_ci
1431cabdff1aSopenharmony_ci    if (aot != AOT_ER_AAC_ELD) {
1432cabdff1aSopenharmony_ci        if (get_bits1(gb)) {
1433cabdff1aSopenharmony_ci            av_log(ac->avctx, AV_LOG_ERROR, "Reserved bit set.\n");
1434cabdff1aSopenharmony_ci            if (ac->avctx->err_recognition & AV_EF_BITSTREAM)
1435cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1436cabdff1aSopenharmony_ci        }
1437cabdff1aSopenharmony_ci        ics->window_sequence[1] = ics->window_sequence[0];
1438cabdff1aSopenharmony_ci        ics->window_sequence[0] = get_bits(gb, 2);
1439cabdff1aSopenharmony_ci        if (aot == AOT_ER_AAC_LD &&
1440cabdff1aSopenharmony_ci            ics->window_sequence[0] != ONLY_LONG_SEQUENCE) {
1441cabdff1aSopenharmony_ci            av_log(ac->avctx, AV_LOG_ERROR,
1442cabdff1aSopenharmony_ci                   "AAC LD is only defined for ONLY_LONG_SEQUENCE but "
1443cabdff1aSopenharmony_ci                   "window sequence %d found.\n", ics->window_sequence[0]);
1444cabdff1aSopenharmony_ci            ics->window_sequence[0] = ONLY_LONG_SEQUENCE;
1445cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1446cabdff1aSopenharmony_ci        }
1447cabdff1aSopenharmony_ci        ics->use_kb_window[1]   = ics->use_kb_window[0];
1448cabdff1aSopenharmony_ci        ics->use_kb_window[0]   = get_bits1(gb);
1449cabdff1aSopenharmony_ci    }
1450cabdff1aSopenharmony_ci    ics->num_window_groups  = 1;
1451cabdff1aSopenharmony_ci    ics->group_len[0]       = 1;
1452cabdff1aSopenharmony_ci    if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
1453cabdff1aSopenharmony_ci        int i;
1454cabdff1aSopenharmony_ci        ics->max_sfb = get_bits(gb, 4);
1455cabdff1aSopenharmony_ci        for (i = 0; i < 7; i++) {
1456cabdff1aSopenharmony_ci            if (get_bits1(gb)) {
1457cabdff1aSopenharmony_ci                ics->group_len[ics->num_window_groups - 1]++;
1458cabdff1aSopenharmony_ci            } else {
1459cabdff1aSopenharmony_ci                ics->num_window_groups++;
1460cabdff1aSopenharmony_ci                ics->group_len[ics->num_window_groups - 1] = 1;
1461cabdff1aSopenharmony_ci            }
1462cabdff1aSopenharmony_ci        }
1463cabdff1aSopenharmony_ci        ics->num_windows       = 8;
1464cabdff1aSopenharmony_ci        if (m4ac->frame_length_short) {
1465cabdff1aSopenharmony_ci            ics->swb_offset    =  ff_swb_offset_120[sampling_index];
1466cabdff1aSopenharmony_ci            ics->num_swb       = ff_aac_num_swb_120[sampling_index];
1467cabdff1aSopenharmony_ci        } else {
1468cabdff1aSopenharmony_ci            ics->swb_offset    =  ff_swb_offset_128[sampling_index];
1469cabdff1aSopenharmony_ci            ics->num_swb       = ff_aac_num_swb_128[sampling_index];
1470cabdff1aSopenharmony_ci        }
1471cabdff1aSopenharmony_ci        ics->tns_max_bands     = ff_tns_max_bands_128[sampling_index];
1472cabdff1aSopenharmony_ci        ics->predictor_present = 0;
1473cabdff1aSopenharmony_ci    } else {
1474cabdff1aSopenharmony_ci        ics->max_sfb           = get_bits(gb, 6);
1475cabdff1aSopenharmony_ci        ics->num_windows       = 1;
1476cabdff1aSopenharmony_ci        if (aot == AOT_ER_AAC_LD || aot == AOT_ER_AAC_ELD) {
1477cabdff1aSopenharmony_ci            if (m4ac->frame_length_short) {
1478cabdff1aSopenharmony_ci                ics->swb_offset    =     ff_swb_offset_480[sampling_index];
1479cabdff1aSopenharmony_ci                ics->num_swb       =    ff_aac_num_swb_480[sampling_index];
1480cabdff1aSopenharmony_ci                ics->tns_max_bands =  ff_tns_max_bands_480[sampling_index];
1481cabdff1aSopenharmony_ci            } else {
1482cabdff1aSopenharmony_ci                ics->swb_offset    =     ff_swb_offset_512[sampling_index];
1483cabdff1aSopenharmony_ci                ics->num_swb       =    ff_aac_num_swb_512[sampling_index];
1484cabdff1aSopenharmony_ci                ics->tns_max_bands =  ff_tns_max_bands_512[sampling_index];
1485cabdff1aSopenharmony_ci            }
1486cabdff1aSopenharmony_ci            if (!ics->num_swb || !ics->swb_offset) {
1487cabdff1aSopenharmony_ci                ret_fail = AVERROR_BUG;
1488cabdff1aSopenharmony_ci                goto fail;
1489cabdff1aSopenharmony_ci            }
1490cabdff1aSopenharmony_ci        } else {
1491cabdff1aSopenharmony_ci            if (m4ac->frame_length_short) {
1492cabdff1aSopenharmony_ci                ics->num_swb    = ff_aac_num_swb_960[sampling_index];
1493cabdff1aSopenharmony_ci                ics->swb_offset = ff_swb_offset_960[sampling_index];
1494cabdff1aSopenharmony_ci            } else {
1495cabdff1aSopenharmony_ci                ics->num_swb    = ff_aac_num_swb_1024[sampling_index];
1496cabdff1aSopenharmony_ci                ics->swb_offset = ff_swb_offset_1024[sampling_index];
1497cabdff1aSopenharmony_ci            }
1498cabdff1aSopenharmony_ci            ics->tns_max_bands = ff_tns_max_bands_1024[sampling_index];
1499cabdff1aSopenharmony_ci        }
1500cabdff1aSopenharmony_ci        if (aot != AOT_ER_AAC_ELD) {
1501cabdff1aSopenharmony_ci            ics->predictor_present     = get_bits1(gb);
1502cabdff1aSopenharmony_ci            ics->predictor_reset_group = 0;
1503cabdff1aSopenharmony_ci        }
1504cabdff1aSopenharmony_ci        if (ics->predictor_present) {
1505cabdff1aSopenharmony_ci            if (aot == AOT_AAC_MAIN) {
1506cabdff1aSopenharmony_ci                if (decode_prediction(ac, ics, gb)) {
1507cabdff1aSopenharmony_ci                    goto fail;
1508cabdff1aSopenharmony_ci                }
1509cabdff1aSopenharmony_ci            } else if (aot == AOT_AAC_LC ||
1510cabdff1aSopenharmony_ci                       aot == AOT_ER_AAC_LC) {
1511cabdff1aSopenharmony_ci                av_log(ac->avctx, AV_LOG_ERROR,
1512cabdff1aSopenharmony_ci                       "Prediction is not allowed in AAC-LC.\n");
1513cabdff1aSopenharmony_ci                goto fail;
1514cabdff1aSopenharmony_ci            } else {
1515cabdff1aSopenharmony_ci                if (aot == AOT_ER_AAC_LD) {
1516cabdff1aSopenharmony_ci                    av_log(ac->avctx, AV_LOG_ERROR,
1517cabdff1aSopenharmony_ci                           "LTP in ER AAC LD not yet implemented.\n");
1518cabdff1aSopenharmony_ci                    ret_fail = AVERROR_PATCHWELCOME;
1519cabdff1aSopenharmony_ci                    goto fail;
1520cabdff1aSopenharmony_ci                }
1521cabdff1aSopenharmony_ci                if ((ics->ltp.present = get_bits(gb, 1)))
1522cabdff1aSopenharmony_ci                    decode_ltp(&ics->ltp, gb, ics->max_sfb);
1523cabdff1aSopenharmony_ci            }
1524cabdff1aSopenharmony_ci        }
1525cabdff1aSopenharmony_ci    }
1526cabdff1aSopenharmony_ci
1527cabdff1aSopenharmony_ci    if (ics->max_sfb > ics->num_swb) {
1528cabdff1aSopenharmony_ci        av_log(ac->avctx, AV_LOG_ERROR,
1529cabdff1aSopenharmony_ci               "Number of scalefactor bands in group (%d) "
1530cabdff1aSopenharmony_ci               "exceeds limit (%d).\n",
1531cabdff1aSopenharmony_ci               ics->max_sfb, ics->num_swb);
1532cabdff1aSopenharmony_ci        goto fail;
1533cabdff1aSopenharmony_ci    }
1534cabdff1aSopenharmony_ci
1535cabdff1aSopenharmony_ci    return 0;
1536cabdff1aSopenharmony_cifail:
1537cabdff1aSopenharmony_ci    ics->max_sfb = 0;
1538cabdff1aSopenharmony_ci    return ret_fail;
1539cabdff1aSopenharmony_ci}
1540cabdff1aSopenharmony_ci
1541cabdff1aSopenharmony_ci/**
1542cabdff1aSopenharmony_ci * Decode band types (section_data payload); reference: table 4.46.
1543cabdff1aSopenharmony_ci *
1544cabdff1aSopenharmony_ci * @param   band_type           array of the used band type
1545cabdff1aSopenharmony_ci * @param   band_type_run_end   array of the last scalefactor band of a band type run
1546cabdff1aSopenharmony_ci *
1547cabdff1aSopenharmony_ci * @return  Returns error status. 0 - OK, !0 - error
1548cabdff1aSopenharmony_ci */
1549cabdff1aSopenharmony_cistatic int decode_band_types(AACContext *ac, enum BandType band_type[120],
1550cabdff1aSopenharmony_ci                             int band_type_run_end[120], GetBitContext *gb,
1551cabdff1aSopenharmony_ci                             IndividualChannelStream *ics)
1552cabdff1aSopenharmony_ci{
1553cabdff1aSopenharmony_ci    int g, idx = 0;
1554cabdff1aSopenharmony_ci    const int bits = (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) ? 3 : 5;
1555cabdff1aSopenharmony_ci    for (g = 0; g < ics->num_window_groups; g++) {
1556cabdff1aSopenharmony_ci        int k = 0;
1557cabdff1aSopenharmony_ci        while (k < ics->max_sfb) {
1558cabdff1aSopenharmony_ci            uint8_t sect_end = k;
1559cabdff1aSopenharmony_ci            int sect_len_incr;
1560cabdff1aSopenharmony_ci            int sect_band_type = get_bits(gb, 4);
1561cabdff1aSopenharmony_ci            if (sect_band_type == 12) {
1562cabdff1aSopenharmony_ci                av_log(ac->avctx, AV_LOG_ERROR, "invalid band type\n");
1563cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1564cabdff1aSopenharmony_ci            }
1565cabdff1aSopenharmony_ci            do {
1566cabdff1aSopenharmony_ci                sect_len_incr = get_bits(gb, bits);
1567cabdff1aSopenharmony_ci                sect_end += sect_len_incr;
1568cabdff1aSopenharmony_ci                if (get_bits_left(gb) < 0) {
1569cabdff1aSopenharmony_ci                    av_log(ac->avctx, AV_LOG_ERROR, "decode_band_types: "overread_err);
1570cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
1571cabdff1aSopenharmony_ci                }
1572cabdff1aSopenharmony_ci                if (sect_end > ics->max_sfb) {
1573cabdff1aSopenharmony_ci                    av_log(ac->avctx, AV_LOG_ERROR,
1574cabdff1aSopenharmony_ci                           "Number of bands (%d) exceeds limit (%d).\n",
1575cabdff1aSopenharmony_ci                           sect_end, ics->max_sfb);
1576cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
1577cabdff1aSopenharmony_ci                }
1578cabdff1aSopenharmony_ci            } while (sect_len_incr == (1 << bits) - 1);
1579cabdff1aSopenharmony_ci            for (; k < sect_end; k++) {
1580cabdff1aSopenharmony_ci                band_type        [idx]   = sect_band_type;
1581cabdff1aSopenharmony_ci                band_type_run_end[idx++] = sect_end;
1582cabdff1aSopenharmony_ci            }
1583cabdff1aSopenharmony_ci        }
1584cabdff1aSopenharmony_ci    }
1585cabdff1aSopenharmony_ci    return 0;
1586cabdff1aSopenharmony_ci}
1587cabdff1aSopenharmony_ci
1588cabdff1aSopenharmony_ci/**
1589cabdff1aSopenharmony_ci * Decode scalefactors; reference: table 4.47.
1590cabdff1aSopenharmony_ci *
1591cabdff1aSopenharmony_ci * @param   global_gain         first scalefactor value as scalefactors are differentially coded
1592cabdff1aSopenharmony_ci * @param   band_type           array of the used band type
1593cabdff1aSopenharmony_ci * @param   band_type_run_end   array of the last scalefactor band of a band type run
1594cabdff1aSopenharmony_ci * @param   sf                  array of scalefactors or intensity stereo positions
1595cabdff1aSopenharmony_ci *
1596cabdff1aSopenharmony_ci * @return  Returns error status. 0 - OK, !0 - error
1597cabdff1aSopenharmony_ci */
1598cabdff1aSopenharmony_cistatic int decode_scalefactors(AACContext *ac, INTFLOAT sf[120], GetBitContext *gb,
1599cabdff1aSopenharmony_ci                               unsigned int global_gain,
1600cabdff1aSopenharmony_ci                               IndividualChannelStream *ics,
1601cabdff1aSopenharmony_ci                               enum BandType band_type[120],
1602cabdff1aSopenharmony_ci                               int band_type_run_end[120])
1603cabdff1aSopenharmony_ci{
1604cabdff1aSopenharmony_ci    int g, i, idx = 0;
1605cabdff1aSopenharmony_ci    int offset[3] = { global_gain, global_gain - NOISE_OFFSET, 0 };
1606cabdff1aSopenharmony_ci    int clipped_offset;
1607cabdff1aSopenharmony_ci    int noise_flag = 1;
1608cabdff1aSopenharmony_ci    for (g = 0; g < ics->num_window_groups; g++) {
1609cabdff1aSopenharmony_ci        for (i = 0; i < ics->max_sfb;) {
1610cabdff1aSopenharmony_ci            int run_end = band_type_run_end[idx];
1611cabdff1aSopenharmony_ci            if (band_type[idx] == ZERO_BT) {
1612cabdff1aSopenharmony_ci                for (; i < run_end; i++, idx++)
1613cabdff1aSopenharmony_ci                    sf[idx] = FIXR(0.);
1614cabdff1aSopenharmony_ci            } else if ((band_type[idx] == INTENSITY_BT) ||
1615cabdff1aSopenharmony_ci                       (band_type[idx] == INTENSITY_BT2)) {
1616cabdff1aSopenharmony_ci                for (; i < run_end; i++, idx++) {
1617cabdff1aSopenharmony_ci                    offset[2] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - SCALE_DIFF_ZERO;
1618cabdff1aSopenharmony_ci                    clipped_offset = av_clip(offset[2], -155, 100);
1619cabdff1aSopenharmony_ci                    if (offset[2] != clipped_offset) {
1620cabdff1aSopenharmony_ci                        avpriv_request_sample(ac->avctx,
1621cabdff1aSopenharmony_ci                                              "If you heard an audible artifact, there may be a bug in the decoder. "
1622cabdff1aSopenharmony_ci                                              "Clipped intensity stereo position (%d -> %d)",
1623cabdff1aSopenharmony_ci                                              offset[2], clipped_offset);
1624cabdff1aSopenharmony_ci                    }
1625cabdff1aSopenharmony_ci#if USE_FIXED
1626cabdff1aSopenharmony_ci                    sf[idx] = 100 - clipped_offset;
1627cabdff1aSopenharmony_ci#else
1628cabdff1aSopenharmony_ci                    sf[idx] = ff_aac_pow2sf_tab[-clipped_offset + POW_SF2_ZERO];
1629cabdff1aSopenharmony_ci#endif /* USE_FIXED */
1630cabdff1aSopenharmony_ci                }
1631cabdff1aSopenharmony_ci            } else if (band_type[idx] == NOISE_BT) {
1632cabdff1aSopenharmony_ci                for (; i < run_end; i++, idx++) {
1633cabdff1aSopenharmony_ci                    if (noise_flag-- > 0)
1634cabdff1aSopenharmony_ci                        offset[1] += get_bits(gb, NOISE_PRE_BITS) - NOISE_PRE;
1635cabdff1aSopenharmony_ci                    else
1636cabdff1aSopenharmony_ci                        offset[1] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - SCALE_DIFF_ZERO;
1637cabdff1aSopenharmony_ci                    clipped_offset = av_clip(offset[1], -100, 155);
1638cabdff1aSopenharmony_ci                    if (offset[1] != clipped_offset) {
1639cabdff1aSopenharmony_ci                        avpriv_request_sample(ac->avctx,
1640cabdff1aSopenharmony_ci                                              "If you heard an audible artifact, there may be a bug in the decoder. "
1641cabdff1aSopenharmony_ci                                              "Clipped noise gain (%d -> %d)",
1642cabdff1aSopenharmony_ci                                              offset[1], clipped_offset);
1643cabdff1aSopenharmony_ci                    }
1644cabdff1aSopenharmony_ci#if USE_FIXED
1645cabdff1aSopenharmony_ci                    sf[idx] = -(100 + clipped_offset);
1646cabdff1aSopenharmony_ci#else
1647cabdff1aSopenharmony_ci                    sf[idx] = -ff_aac_pow2sf_tab[clipped_offset + POW_SF2_ZERO];
1648cabdff1aSopenharmony_ci#endif /* USE_FIXED */
1649cabdff1aSopenharmony_ci                }
1650cabdff1aSopenharmony_ci            } else {
1651cabdff1aSopenharmony_ci                for (; i < run_end; i++, idx++) {
1652cabdff1aSopenharmony_ci                    offset[0] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - SCALE_DIFF_ZERO;
1653cabdff1aSopenharmony_ci                    if (offset[0] > 255U) {
1654cabdff1aSopenharmony_ci                        av_log(ac->avctx, AV_LOG_ERROR,
1655cabdff1aSopenharmony_ci                               "Scalefactor (%d) out of range.\n", offset[0]);
1656cabdff1aSopenharmony_ci                        return AVERROR_INVALIDDATA;
1657cabdff1aSopenharmony_ci                    }
1658cabdff1aSopenharmony_ci#if USE_FIXED
1659cabdff1aSopenharmony_ci                    sf[idx] = -offset[0];
1660cabdff1aSopenharmony_ci#else
1661cabdff1aSopenharmony_ci                    sf[idx] = -ff_aac_pow2sf_tab[offset[0] - 100 + POW_SF2_ZERO];
1662cabdff1aSopenharmony_ci#endif /* USE_FIXED */
1663cabdff1aSopenharmony_ci                }
1664cabdff1aSopenharmony_ci            }
1665cabdff1aSopenharmony_ci        }
1666cabdff1aSopenharmony_ci    }
1667cabdff1aSopenharmony_ci    return 0;
1668cabdff1aSopenharmony_ci}
1669cabdff1aSopenharmony_ci
1670cabdff1aSopenharmony_ci/**
1671cabdff1aSopenharmony_ci * Decode pulse data; reference: table 4.7.
1672cabdff1aSopenharmony_ci */
1673cabdff1aSopenharmony_cistatic int decode_pulses(Pulse *pulse, GetBitContext *gb,
1674cabdff1aSopenharmony_ci                         const uint16_t *swb_offset, int num_swb)
1675cabdff1aSopenharmony_ci{
1676cabdff1aSopenharmony_ci    int i, pulse_swb;
1677cabdff1aSopenharmony_ci    pulse->num_pulse = get_bits(gb, 2) + 1;
1678cabdff1aSopenharmony_ci    pulse_swb        = get_bits(gb, 6);
1679cabdff1aSopenharmony_ci    if (pulse_swb >= num_swb)
1680cabdff1aSopenharmony_ci        return -1;
1681cabdff1aSopenharmony_ci    pulse->pos[0]    = swb_offset[pulse_swb];
1682cabdff1aSopenharmony_ci    pulse->pos[0]   += get_bits(gb, 5);
1683cabdff1aSopenharmony_ci    if (pulse->pos[0] >= swb_offset[num_swb])
1684cabdff1aSopenharmony_ci        return -1;
1685cabdff1aSopenharmony_ci    pulse->amp[0]    = get_bits(gb, 4);
1686cabdff1aSopenharmony_ci    for (i = 1; i < pulse->num_pulse; i++) {
1687cabdff1aSopenharmony_ci        pulse->pos[i] = get_bits(gb, 5) + pulse->pos[i - 1];
1688cabdff1aSopenharmony_ci        if (pulse->pos[i] >= swb_offset[num_swb])
1689cabdff1aSopenharmony_ci            return -1;
1690cabdff1aSopenharmony_ci        pulse->amp[i] = get_bits(gb, 4);
1691cabdff1aSopenharmony_ci    }
1692cabdff1aSopenharmony_ci    return 0;
1693cabdff1aSopenharmony_ci}
1694cabdff1aSopenharmony_ci
1695cabdff1aSopenharmony_ci/**
1696cabdff1aSopenharmony_ci * Decode Temporal Noise Shaping data; reference: table 4.48.
1697cabdff1aSopenharmony_ci *
1698cabdff1aSopenharmony_ci * @return  Returns error status. 0 - OK, !0 - error
1699cabdff1aSopenharmony_ci */
1700cabdff1aSopenharmony_cistatic int decode_tns(AACContext *ac, TemporalNoiseShaping *tns,
1701cabdff1aSopenharmony_ci                      GetBitContext *gb, const IndividualChannelStream *ics)
1702cabdff1aSopenharmony_ci{
1703cabdff1aSopenharmony_ci    int w, filt, i, coef_len, coef_res, coef_compress;
1704cabdff1aSopenharmony_ci    const int is8 = ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE;
1705cabdff1aSopenharmony_ci    const int tns_max_order = is8 ? 7 : ac->oc[1].m4ac.object_type == AOT_AAC_MAIN ? 20 : 12;
1706cabdff1aSopenharmony_ci    for (w = 0; w < ics->num_windows; w++) {
1707cabdff1aSopenharmony_ci        if ((tns->n_filt[w] = get_bits(gb, 2 - is8))) {
1708cabdff1aSopenharmony_ci            coef_res = get_bits1(gb);
1709cabdff1aSopenharmony_ci
1710cabdff1aSopenharmony_ci            for (filt = 0; filt < tns->n_filt[w]; filt++) {
1711cabdff1aSopenharmony_ci                int tmp2_idx;
1712cabdff1aSopenharmony_ci                tns->length[w][filt] = get_bits(gb, 6 - 2 * is8);
1713cabdff1aSopenharmony_ci
1714cabdff1aSopenharmony_ci                if ((tns->order[w][filt] = get_bits(gb, 5 - 2 * is8)) > tns_max_order) {
1715cabdff1aSopenharmony_ci                    av_log(ac->avctx, AV_LOG_ERROR,
1716cabdff1aSopenharmony_ci                           "TNS filter order %d is greater than maximum %d.\n",
1717cabdff1aSopenharmony_ci                           tns->order[w][filt], tns_max_order);
1718cabdff1aSopenharmony_ci                    tns->order[w][filt] = 0;
1719cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
1720cabdff1aSopenharmony_ci                }
1721cabdff1aSopenharmony_ci                if (tns->order[w][filt]) {
1722cabdff1aSopenharmony_ci                    tns->direction[w][filt] = get_bits1(gb);
1723cabdff1aSopenharmony_ci                    coef_compress = get_bits1(gb);
1724cabdff1aSopenharmony_ci                    coef_len = coef_res + 3 - coef_compress;
1725cabdff1aSopenharmony_ci                    tmp2_idx = 2 * coef_compress + coef_res;
1726cabdff1aSopenharmony_ci
1727cabdff1aSopenharmony_ci                    for (i = 0; i < tns->order[w][filt]; i++)
1728cabdff1aSopenharmony_ci                        tns->coef[w][filt][i] = tns_tmp2_map[tmp2_idx][get_bits(gb, coef_len)];
1729cabdff1aSopenharmony_ci                }
1730cabdff1aSopenharmony_ci            }
1731cabdff1aSopenharmony_ci        }
1732cabdff1aSopenharmony_ci    }
1733cabdff1aSopenharmony_ci    return 0;
1734cabdff1aSopenharmony_ci}
1735cabdff1aSopenharmony_ci
1736cabdff1aSopenharmony_ci/**
1737cabdff1aSopenharmony_ci * Decode Mid/Side data; reference: table 4.54.
1738cabdff1aSopenharmony_ci *
1739cabdff1aSopenharmony_ci * @param   ms_present  Indicates mid/side stereo presence. [0] mask is all 0s;
1740cabdff1aSopenharmony_ci *                      [1] mask is decoded from bitstream; [2] mask is all 1s;
1741cabdff1aSopenharmony_ci *                      [3] reserved for scalable AAC
1742cabdff1aSopenharmony_ci */
1743cabdff1aSopenharmony_cistatic void decode_mid_side_stereo(ChannelElement *cpe, GetBitContext *gb,
1744cabdff1aSopenharmony_ci                                   int ms_present)
1745cabdff1aSopenharmony_ci{
1746cabdff1aSopenharmony_ci    int idx;
1747cabdff1aSopenharmony_ci    int max_idx = cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb;
1748cabdff1aSopenharmony_ci    if (ms_present == 1) {
1749cabdff1aSopenharmony_ci        for (idx = 0; idx < max_idx; idx++)
1750cabdff1aSopenharmony_ci            cpe->ms_mask[idx] = get_bits1(gb);
1751cabdff1aSopenharmony_ci    } else if (ms_present == 2) {
1752cabdff1aSopenharmony_ci        memset(cpe->ms_mask, 1, max_idx * sizeof(cpe->ms_mask[0]));
1753cabdff1aSopenharmony_ci    }
1754cabdff1aSopenharmony_ci}
1755cabdff1aSopenharmony_ci
1756cabdff1aSopenharmony_ci/**
1757cabdff1aSopenharmony_ci * Decode spectral data; reference: table 4.50.
1758cabdff1aSopenharmony_ci * Dequantize and scale spectral data; reference: 4.6.3.3.
1759cabdff1aSopenharmony_ci *
1760cabdff1aSopenharmony_ci * @param   coef            array of dequantized, scaled spectral data
1761cabdff1aSopenharmony_ci * @param   sf              array of scalefactors or intensity stereo positions
1762cabdff1aSopenharmony_ci * @param   pulse_present   set if pulses are present
1763cabdff1aSopenharmony_ci * @param   pulse           pointer to pulse data struct
1764cabdff1aSopenharmony_ci * @param   band_type       array of the used band type
1765cabdff1aSopenharmony_ci *
1766cabdff1aSopenharmony_ci * @return  Returns error status. 0 - OK, !0 - error
1767cabdff1aSopenharmony_ci */
1768cabdff1aSopenharmony_cistatic int decode_spectrum_and_dequant(AACContext *ac, INTFLOAT coef[1024],
1769cabdff1aSopenharmony_ci                                       GetBitContext *gb, const INTFLOAT sf[120],
1770cabdff1aSopenharmony_ci                                       int pulse_present, const Pulse *pulse,
1771cabdff1aSopenharmony_ci                                       const IndividualChannelStream *ics,
1772cabdff1aSopenharmony_ci                                       enum BandType band_type[120])
1773cabdff1aSopenharmony_ci{
1774cabdff1aSopenharmony_ci    int i, k, g, idx = 0;
1775cabdff1aSopenharmony_ci    const int c = 1024 / ics->num_windows;
1776cabdff1aSopenharmony_ci    const uint16_t *offsets = ics->swb_offset;
1777cabdff1aSopenharmony_ci    INTFLOAT *coef_base = coef;
1778cabdff1aSopenharmony_ci
1779cabdff1aSopenharmony_ci    for (g = 0; g < ics->num_windows; g++)
1780cabdff1aSopenharmony_ci        memset(coef + g * 128 + offsets[ics->max_sfb], 0,
1781cabdff1aSopenharmony_ci               sizeof(INTFLOAT) * (c - offsets[ics->max_sfb]));
1782cabdff1aSopenharmony_ci
1783cabdff1aSopenharmony_ci    for (g = 0; g < ics->num_window_groups; g++) {
1784cabdff1aSopenharmony_ci        unsigned g_len = ics->group_len[g];
1785cabdff1aSopenharmony_ci
1786cabdff1aSopenharmony_ci        for (i = 0; i < ics->max_sfb; i++, idx++) {
1787cabdff1aSopenharmony_ci            const unsigned cbt_m1 = band_type[idx] - 1;
1788cabdff1aSopenharmony_ci            INTFLOAT *cfo = coef + offsets[i];
1789cabdff1aSopenharmony_ci            int off_len = offsets[i + 1] - offsets[i];
1790cabdff1aSopenharmony_ci            int group;
1791cabdff1aSopenharmony_ci
1792cabdff1aSopenharmony_ci            if (cbt_m1 >= INTENSITY_BT2 - 1) {
1793cabdff1aSopenharmony_ci                for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) {
1794cabdff1aSopenharmony_ci                    memset(cfo, 0, off_len * sizeof(*cfo));
1795cabdff1aSopenharmony_ci                }
1796cabdff1aSopenharmony_ci            } else if (cbt_m1 == NOISE_BT - 1) {
1797cabdff1aSopenharmony_ci                for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) {
1798cabdff1aSopenharmony_ci                    INTFLOAT band_energy;
1799cabdff1aSopenharmony_ci#if USE_FIXED
1800cabdff1aSopenharmony_ci                    for (k = 0; k < off_len; k++) {
1801cabdff1aSopenharmony_ci                        ac->random_state  = lcg_random(ac->random_state);
1802cabdff1aSopenharmony_ci                        cfo[k] = ac->random_state >> 3;
1803cabdff1aSopenharmony_ci                    }
1804cabdff1aSopenharmony_ci
1805cabdff1aSopenharmony_ci                    band_energy = ac->fdsp->scalarproduct_fixed(cfo, cfo, off_len);
1806cabdff1aSopenharmony_ci                    band_energy = fixed_sqrt(band_energy, 31);
1807cabdff1aSopenharmony_ci                    noise_scale(cfo, sf[idx], band_energy, off_len);
1808cabdff1aSopenharmony_ci#else
1809cabdff1aSopenharmony_ci                    float scale;
1810cabdff1aSopenharmony_ci
1811cabdff1aSopenharmony_ci                    for (k = 0; k < off_len; k++) {
1812cabdff1aSopenharmony_ci                        ac->random_state  = lcg_random(ac->random_state);
1813cabdff1aSopenharmony_ci                        cfo[k] = ac->random_state;
1814cabdff1aSopenharmony_ci                    }
1815cabdff1aSopenharmony_ci
1816cabdff1aSopenharmony_ci                    band_energy = ac->fdsp->scalarproduct_float(cfo, cfo, off_len);
1817cabdff1aSopenharmony_ci                    scale = sf[idx] / sqrtf(band_energy);
1818cabdff1aSopenharmony_ci                    ac->fdsp->vector_fmul_scalar(cfo, cfo, scale, off_len);
1819cabdff1aSopenharmony_ci#endif /* USE_FIXED */
1820cabdff1aSopenharmony_ci                }
1821cabdff1aSopenharmony_ci            } else {
1822cabdff1aSopenharmony_ci#if !USE_FIXED
1823cabdff1aSopenharmony_ci                const float *vq = ff_aac_codebook_vector_vals[cbt_m1];
1824cabdff1aSopenharmony_ci#endif /* !USE_FIXED */
1825cabdff1aSopenharmony_ci                const VLCElem *vlc_tab = vlc_spectral[cbt_m1].table;
1826cabdff1aSopenharmony_ci                OPEN_READER(re, gb);
1827cabdff1aSopenharmony_ci
1828cabdff1aSopenharmony_ci                switch (cbt_m1 >> 1) {
1829cabdff1aSopenharmony_ci                case 0:
1830cabdff1aSopenharmony_ci                    for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) {
1831cabdff1aSopenharmony_ci                        INTFLOAT *cf = cfo;
1832cabdff1aSopenharmony_ci                        int len = off_len;
1833cabdff1aSopenharmony_ci
1834cabdff1aSopenharmony_ci                        do {
1835cabdff1aSopenharmony_ci                            int code;
1836cabdff1aSopenharmony_ci                            unsigned cb_idx;
1837cabdff1aSopenharmony_ci
1838cabdff1aSopenharmony_ci                            UPDATE_CACHE(re, gb);
1839cabdff1aSopenharmony_ci                            GET_VLC(code, re, gb, vlc_tab, 8, 2);
1840cabdff1aSopenharmony_ci                            cb_idx = code;
1841cabdff1aSopenharmony_ci#if USE_FIXED
1842cabdff1aSopenharmony_ci                            cf = DEC_SQUAD(cf, cb_idx);
1843cabdff1aSopenharmony_ci#else
1844cabdff1aSopenharmony_ci                            cf = VMUL4(cf, vq, cb_idx, sf + idx);
1845cabdff1aSopenharmony_ci#endif /* USE_FIXED */
1846cabdff1aSopenharmony_ci                        } while (len -= 4);
1847cabdff1aSopenharmony_ci                    }
1848cabdff1aSopenharmony_ci                    break;
1849cabdff1aSopenharmony_ci
1850cabdff1aSopenharmony_ci                case 1:
1851cabdff1aSopenharmony_ci                    for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) {
1852cabdff1aSopenharmony_ci                        INTFLOAT *cf = cfo;
1853cabdff1aSopenharmony_ci                        int len = off_len;
1854cabdff1aSopenharmony_ci
1855cabdff1aSopenharmony_ci                        do {
1856cabdff1aSopenharmony_ci                            int code;
1857cabdff1aSopenharmony_ci                            unsigned nnz;
1858cabdff1aSopenharmony_ci                            unsigned cb_idx;
1859cabdff1aSopenharmony_ci                            uint32_t bits;
1860cabdff1aSopenharmony_ci
1861cabdff1aSopenharmony_ci                            UPDATE_CACHE(re, gb);
1862cabdff1aSopenharmony_ci                            GET_VLC(code, re, gb, vlc_tab, 8, 2);
1863cabdff1aSopenharmony_ci                            cb_idx = code;
1864cabdff1aSopenharmony_ci                            nnz = cb_idx >> 8 & 15;
1865cabdff1aSopenharmony_ci                            bits = nnz ? GET_CACHE(re, gb) : 0;
1866cabdff1aSopenharmony_ci                            LAST_SKIP_BITS(re, gb, nnz);
1867cabdff1aSopenharmony_ci#if USE_FIXED
1868cabdff1aSopenharmony_ci                            cf = DEC_UQUAD(cf, cb_idx, bits);
1869cabdff1aSopenharmony_ci#else
1870cabdff1aSopenharmony_ci                            cf = VMUL4S(cf, vq, cb_idx, bits, sf + idx);
1871cabdff1aSopenharmony_ci#endif /* USE_FIXED */
1872cabdff1aSopenharmony_ci                        } while (len -= 4);
1873cabdff1aSopenharmony_ci                    }
1874cabdff1aSopenharmony_ci                    break;
1875cabdff1aSopenharmony_ci
1876cabdff1aSopenharmony_ci                case 2:
1877cabdff1aSopenharmony_ci                    for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) {
1878cabdff1aSopenharmony_ci                        INTFLOAT *cf = cfo;
1879cabdff1aSopenharmony_ci                        int len = off_len;
1880cabdff1aSopenharmony_ci
1881cabdff1aSopenharmony_ci                        do {
1882cabdff1aSopenharmony_ci                            int code;
1883cabdff1aSopenharmony_ci                            unsigned cb_idx;
1884cabdff1aSopenharmony_ci
1885cabdff1aSopenharmony_ci                            UPDATE_CACHE(re, gb);
1886cabdff1aSopenharmony_ci                            GET_VLC(code, re, gb, vlc_tab, 8, 2);
1887cabdff1aSopenharmony_ci                            cb_idx = code;
1888cabdff1aSopenharmony_ci#if USE_FIXED
1889cabdff1aSopenharmony_ci                            cf = DEC_SPAIR(cf, cb_idx);
1890cabdff1aSopenharmony_ci#else
1891cabdff1aSopenharmony_ci                            cf = VMUL2(cf, vq, cb_idx, sf + idx);
1892cabdff1aSopenharmony_ci#endif /* USE_FIXED */
1893cabdff1aSopenharmony_ci                        } while (len -= 2);
1894cabdff1aSopenharmony_ci                    }
1895cabdff1aSopenharmony_ci                    break;
1896cabdff1aSopenharmony_ci
1897cabdff1aSopenharmony_ci                case 3:
1898cabdff1aSopenharmony_ci                case 4:
1899cabdff1aSopenharmony_ci                    for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) {
1900cabdff1aSopenharmony_ci                        INTFLOAT *cf = cfo;
1901cabdff1aSopenharmony_ci                        int len = off_len;
1902cabdff1aSopenharmony_ci
1903cabdff1aSopenharmony_ci                        do {
1904cabdff1aSopenharmony_ci                            int code;
1905cabdff1aSopenharmony_ci                            unsigned nnz;
1906cabdff1aSopenharmony_ci                            unsigned cb_idx;
1907cabdff1aSopenharmony_ci                            unsigned sign;
1908cabdff1aSopenharmony_ci
1909cabdff1aSopenharmony_ci                            UPDATE_CACHE(re, gb);
1910cabdff1aSopenharmony_ci                            GET_VLC(code, re, gb, vlc_tab, 8, 2);
1911cabdff1aSopenharmony_ci                            cb_idx = code;
1912cabdff1aSopenharmony_ci                            nnz = cb_idx >> 8 & 15;
1913cabdff1aSopenharmony_ci                            sign = nnz ? SHOW_UBITS(re, gb, nnz) << (cb_idx >> 12) : 0;
1914cabdff1aSopenharmony_ci                            LAST_SKIP_BITS(re, gb, nnz);
1915cabdff1aSopenharmony_ci#if USE_FIXED
1916cabdff1aSopenharmony_ci                            cf = DEC_UPAIR(cf, cb_idx, sign);
1917cabdff1aSopenharmony_ci#else
1918cabdff1aSopenharmony_ci                            cf = VMUL2S(cf, vq, cb_idx, sign, sf + idx);
1919cabdff1aSopenharmony_ci#endif /* USE_FIXED */
1920cabdff1aSopenharmony_ci                        } while (len -= 2);
1921cabdff1aSopenharmony_ci                    }
1922cabdff1aSopenharmony_ci                    break;
1923cabdff1aSopenharmony_ci
1924cabdff1aSopenharmony_ci                default:
1925cabdff1aSopenharmony_ci                    for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) {
1926cabdff1aSopenharmony_ci#if USE_FIXED
1927cabdff1aSopenharmony_ci                        int *icf = cfo;
1928cabdff1aSopenharmony_ci                        int v;
1929cabdff1aSopenharmony_ci#else
1930cabdff1aSopenharmony_ci                        float *cf = cfo;
1931cabdff1aSopenharmony_ci                        uint32_t *icf = (uint32_t *) cf;
1932cabdff1aSopenharmony_ci#endif /* USE_FIXED */
1933cabdff1aSopenharmony_ci                        int len = off_len;
1934cabdff1aSopenharmony_ci
1935cabdff1aSopenharmony_ci                        do {
1936cabdff1aSopenharmony_ci                            int code;
1937cabdff1aSopenharmony_ci                            unsigned nzt, nnz;
1938cabdff1aSopenharmony_ci                            unsigned cb_idx;
1939cabdff1aSopenharmony_ci                            uint32_t bits;
1940cabdff1aSopenharmony_ci                            int j;
1941cabdff1aSopenharmony_ci
1942cabdff1aSopenharmony_ci                            UPDATE_CACHE(re, gb);
1943cabdff1aSopenharmony_ci                            GET_VLC(code, re, gb, vlc_tab, 8, 2);
1944cabdff1aSopenharmony_ci                            cb_idx = code;
1945cabdff1aSopenharmony_ci
1946cabdff1aSopenharmony_ci                            if (cb_idx == 0x0000) {
1947cabdff1aSopenharmony_ci                                *icf++ = 0;
1948cabdff1aSopenharmony_ci                                *icf++ = 0;
1949cabdff1aSopenharmony_ci                                continue;
1950cabdff1aSopenharmony_ci                            }
1951cabdff1aSopenharmony_ci
1952cabdff1aSopenharmony_ci                            nnz = cb_idx >> 12;
1953cabdff1aSopenharmony_ci                            nzt = cb_idx >> 8;
1954cabdff1aSopenharmony_ci                            bits = SHOW_UBITS(re, gb, nnz) << (32-nnz);
1955cabdff1aSopenharmony_ci                            LAST_SKIP_BITS(re, gb, nnz);
1956cabdff1aSopenharmony_ci
1957cabdff1aSopenharmony_ci                            for (j = 0; j < 2; j++) {
1958cabdff1aSopenharmony_ci                                if (nzt & 1<<j) {
1959cabdff1aSopenharmony_ci                                    uint32_t b;
1960cabdff1aSopenharmony_ci                                    int n;
1961cabdff1aSopenharmony_ci                                    /* The total length of escape_sequence must be < 22 bits according
1962cabdff1aSopenharmony_ci                                       to the specification (i.e. max is 111111110xxxxxxxxxxxx). */
1963cabdff1aSopenharmony_ci                                    UPDATE_CACHE(re, gb);
1964cabdff1aSopenharmony_ci                                    b = GET_CACHE(re, gb);
1965cabdff1aSopenharmony_ci                                    b = 31 - av_log2(~b);
1966cabdff1aSopenharmony_ci
1967cabdff1aSopenharmony_ci                                    if (b > 8) {
1968cabdff1aSopenharmony_ci                                        av_log(ac->avctx, AV_LOG_ERROR, "error in spectral data, ESC overflow\n");
1969cabdff1aSopenharmony_ci                                        return AVERROR_INVALIDDATA;
1970cabdff1aSopenharmony_ci                                    }
1971cabdff1aSopenharmony_ci
1972cabdff1aSopenharmony_ci                                    SKIP_BITS(re, gb, b + 1);
1973cabdff1aSopenharmony_ci                                    b += 4;
1974cabdff1aSopenharmony_ci                                    n = (1 << b) + SHOW_UBITS(re, gb, b);
1975cabdff1aSopenharmony_ci                                    LAST_SKIP_BITS(re, gb, b);
1976cabdff1aSopenharmony_ci#if USE_FIXED
1977cabdff1aSopenharmony_ci                                    v = n;
1978cabdff1aSopenharmony_ci                                    if (bits & 1U<<31)
1979cabdff1aSopenharmony_ci                                        v = -v;
1980cabdff1aSopenharmony_ci                                    *icf++ = v;
1981cabdff1aSopenharmony_ci#else
1982cabdff1aSopenharmony_ci                                    *icf++ = ff_cbrt_tab[n] | (bits & 1U<<31);
1983cabdff1aSopenharmony_ci#endif /* USE_FIXED */
1984cabdff1aSopenharmony_ci                                    bits <<= 1;
1985cabdff1aSopenharmony_ci                                } else {
1986cabdff1aSopenharmony_ci#if USE_FIXED
1987cabdff1aSopenharmony_ci                                    v = cb_idx & 15;
1988cabdff1aSopenharmony_ci                                    if (bits & 1U<<31)
1989cabdff1aSopenharmony_ci                                        v = -v;
1990cabdff1aSopenharmony_ci                                    *icf++ = v;
1991cabdff1aSopenharmony_ci#else
1992cabdff1aSopenharmony_ci                                    unsigned v = ((const uint32_t*)vq)[cb_idx & 15];
1993cabdff1aSopenharmony_ci                                    *icf++ = (bits & 1U<<31) | v;
1994cabdff1aSopenharmony_ci#endif /* USE_FIXED */
1995cabdff1aSopenharmony_ci                                    bits <<= !!v;
1996cabdff1aSopenharmony_ci                                }
1997cabdff1aSopenharmony_ci                                cb_idx >>= 4;
1998cabdff1aSopenharmony_ci                            }
1999cabdff1aSopenharmony_ci                        } while (len -= 2);
2000cabdff1aSopenharmony_ci#if !USE_FIXED
2001cabdff1aSopenharmony_ci                        ac->fdsp->vector_fmul_scalar(cfo, cfo, sf[idx], off_len);
2002cabdff1aSopenharmony_ci#endif /* !USE_FIXED */
2003cabdff1aSopenharmony_ci                    }
2004cabdff1aSopenharmony_ci                }
2005cabdff1aSopenharmony_ci
2006cabdff1aSopenharmony_ci                CLOSE_READER(re, gb);
2007cabdff1aSopenharmony_ci            }
2008cabdff1aSopenharmony_ci        }
2009cabdff1aSopenharmony_ci        coef += g_len << 7;
2010cabdff1aSopenharmony_ci    }
2011cabdff1aSopenharmony_ci
2012cabdff1aSopenharmony_ci    if (pulse_present) {
2013cabdff1aSopenharmony_ci        idx = 0;
2014cabdff1aSopenharmony_ci        for (i = 0; i < pulse->num_pulse; i++) {
2015cabdff1aSopenharmony_ci            INTFLOAT co = coef_base[ pulse->pos[i] ];
2016cabdff1aSopenharmony_ci            while (offsets[idx + 1] <= pulse->pos[i])
2017cabdff1aSopenharmony_ci                idx++;
2018cabdff1aSopenharmony_ci            if (band_type[idx] != NOISE_BT && sf[idx]) {
2019cabdff1aSopenharmony_ci                INTFLOAT ico = -pulse->amp[i];
2020cabdff1aSopenharmony_ci#if USE_FIXED
2021cabdff1aSopenharmony_ci                if (co) {
2022cabdff1aSopenharmony_ci                    ico = co + (co > 0 ? -ico : ico);
2023cabdff1aSopenharmony_ci                }
2024cabdff1aSopenharmony_ci                coef_base[ pulse->pos[i] ] = ico;
2025cabdff1aSopenharmony_ci#else
2026cabdff1aSopenharmony_ci                if (co) {
2027cabdff1aSopenharmony_ci                    co /= sf[idx];
2028cabdff1aSopenharmony_ci                    ico = co / sqrtf(sqrtf(fabsf(co))) + (co > 0 ? -ico : ico);
2029cabdff1aSopenharmony_ci                }
2030cabdff1aSopenharmony_ci                coef_base[ pulse->pos[i] ] = cbrtf(fabsf(ico)) * ico * sf[idx];
2031cabdff1aSopenharmony_ci#endif /* USE_FIXED */
2032cabdff1aSopenharmony_ci            }
2033cabdff1aSopenharmony_ci        }
2034cabdff1aSopenharmony_ci    }
2035cabdff1aSopenharmony_ci#if USE_FIXED
2036cabdff1aSopenharmony_ci    coef = coef_base;
2037cabdff1aSopenharmony_ci    idx = 0;
2038cabdff1aSopenharmony_ci    for (g = 0; g < ics->num_window_groups; g++) {
2039cabdff1aSopenharmony_ci        unsigned g_len = ics->group_len[g];
2040cabdff1aSopenharmony_ci
2041cabdff1aSopenharmony_ci        for (i = 0; i < ics->max_sfb; i++, idx++) {
2042cabdff1aSopenharmony_ci            const unsigned cbt_m1 = band_type[idx] - 1;
2043cabdff1aSopenharmony_ci            int *cfo = coef + offsets[i];
2044cabdff1aSopenharmony_ci            int off_len = offsets[i + 1] - offsets[i];
2045cabdff1aSopenharmony_ci            int group;
2046cabdff1aSopenharmony_ci
2047cabdff1aSopenharmony_ci            if (cbt_m1 < NOISE_BT - 1) {
2048cabdff1aSopenharmony_ci                for (group = 0; group < (int)g_len; group++, cfo+=128) {
2049cabdff1aSopenharmony_ci                    ac->vector_pow43(cfo, off_len);
2050cabdff1aSopenharmony_ci                    ac->subband_scale(cfo, cfo, sf[idx], 34, off_len, ac->avctx);
2051cabdff1aSopenharmony_ci                }
2052cabdff1aSopenharmony_ci            }
2053cabdff1aSopenharmony_ci        }
2054cabdff1aSopenharmony_ci        coef += g_len << 7;
2055cabdff1aSopenharmony_ci    }
2056cabdff1aSopenharmony_ci#endif /* USE_FIXED */
2057cabdff1aSopenharmony_ci    return 0;
2058cabdff1aSopenharmony_ci}
2059cabdff1aSopenharmony_ci
2060cabdff1aSopenharmony_ci/**
2061cabdff1aSopenharmony_ci * Apply AAC-Main style frequency domain prediction.
2062cabdff1aSopenharmony_ci */
2063cabdff1aSopenharmony_cistatic void apply_prediction(AACContext *ac, SingleChannelElement *sce)
2064cabdff1aSopenharmony_ci{
2065cabdff1aSopenharmony_ci    int sfb, k;
2066cabdff1aSopenharmony_ci
2067cabdff1aSopenharmony_ci    if (!sce->ics.predictor_initialized) {
2068cabdff1aSopenharmony_ci        reset_all_predictors(sce->predictor_state);
2069cabdff1aSopenharmony_ci        sce->ics.predictor_initialized = 1;
2070cabdff1aSopenharmony_ci    }
2071cabdff1aSopenharmony_ci
2072cabdff1aSopenharmony_ci    if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
2073cabdff1aSopenharmony_ci        for (sfb = 0;
2074cabdff1aSopenharmony_ci             sfb < ff_aac_pred_sfb_max[ac->oc[1].m4ac.sampling_index];
2075cabdff1aSopenharmony_ci             sfb++) {
2076cabdff1aSopenharmony_ci            for (k = sce->ics.swb_offset[sfb];
2077cabdff1aSopenharmony_ci                 k < sce->ics.swb_offset[sfb + 1];
2078cabdff1aSopenharmony_ci                 k++) {
2079cabdff1aSopenharmony_ci                predict(&sce->predictor_state[k], &sce->coeffs[k],
2080cabdff1aSopenharmony_ci                        sce->ics.predictor_present &&
2081cabdff1aSopenharmony_ci                        sce->ics.prediction_used[sfb]);
2082cabdff1aSopenharmony_ci            }
2083cabdff1aSopenharmony_ci        }
2084cabdff1aSopenharmony_ci        if (sce->ics.predictor_reset_group)
2085cabdff1aSopenharmony_ci            reset_predictor_group(sce->predictor_state,
2086cabdff1aSopenharmony_ci                                  sce->ics.predictor_reset_group);
2087cabdff1aSopenharmony_ci    } else
2088cabdff1aSopenharmony_ci        reset_all_predictors(sce->predictor_state);
2089cabdff1aSopenharmony_ci}
2090cabdff1aSopenharmony_ci
2091cabdff1aSopenharmony_cistatic void decode_gain_control(SingleChannelElement * sce, GetBitContext * gb)
2092cabdff1aSopenharmony_ci{
2093cabdff1aSopenharmony_ci    // wd_num, wd_test, aloc_size
2094cabdff1aSopenharmony_ci    static const uint8_t gain_mode[4][3] = {
2095cabdff1aSopenharmony_ci        {1, 0, 5},  // ONLY_LONG_SEQUENCE = 0,
2096cabdff1aSopenharmony_ci        {2, 1, 2},  // LONG_START_SEQUENCE,
2097cabdff1aSopenharmony_ci        {8, 0, 2},  // EIGHT_SHORT_SEQUENCE,
2098cabdff1aSopenharmony_ci        {2, 1, 5},  // LONG_STOP_SEQUENCE
2099cabdff1aSopenharmony_ci    };
2100cabdff1aSopenharmony_ci
2101cabdff1aSopenharmony_ci    const int mode = sce->ics.window_sequence[0];
2102cabdff1aSopenharmony_ci    uint8_t bd, wd, ad;
2103cabdff1aSopenharmony_ci
2104cabdff1aSopenharmony_ci    // FIXME: Store the gain control data on |sce| and do something with it.
2105cabdff1aSopenharmony_ci    uint8_t max_band = get_bits(gb, 2);
2106cabdff1aSopenharmony_ci    for (bd = 0; bd < max_band; bd++) {
2107cabdff1aSopenharmony_ci        for (wd = 0; wd < gain_mode[mode][0]; wd++) {
2108cabdff1aSopenharmony_ci            uint8_t adjust_num = get_bits(gb, 3);
2109cabdff1aSopenharmony_ci            for (ad = 0; ad < adjust_num; ad++) {
2110cabdff1aSopenharmony_ci                skip_bits(gb, 4 + ((wd == 0 && gain_mode[mode][1])
2111cabdff1aSopenharmony_ci                                     ? 4
2112cabdff1aSopenharmony_ci                                     : gain_mode[mode][2]));
2113cabdff1aSopenharmony_ci            }
2114cabdff1aSopenharmony_ci        }
2115cabdff1aSopenharmony_ci    }
2116cabdff1aSopenharmony_ci}
2117cabdff1aSopenharmony_ci
2118cabdff1aSopenharmony_ci/**
2119cabdff1aSopenharmony_ci * Decode an individual_channel_stream payload; reference: table 4.44.
2120cabdff1aSopenharmony_ci *
2121cabdff1aSopenharmony_ci * @param   common_window   Channels have independent [0], or shared [1], Individual Channel Stream information.
2122cabdff1aSopenharmony_ci * @param   scale_flag      scalable [1] or non-scalable [0] AAC (Unused until scalable AAC is implemented.)
2123cabdff1aSopenharmony_ci *
2124cabdff1aSopenharmony_ci * @return  Returns error status. 0 - OK, !0 - error
2125cabdff1aSopenharmony_ci */
2126cabdff1aSopenharmony_cistatic int decode_ics(AACContext *ac, SingleChannelElement *sce,
2127cabdff1aSopenharmony_ci                      GetBitContext *gb, int common_window, int scale_flag)
2128cabdff1aSopenharmony_ci{
2129cabdff1aSopenharmony_ci    Pulse pulse;
2130cabdff1aSopenharmony_ci    TemporalNoiseShaping    *tns = &sce->tns;
2131cabdff1aSopenharmony_ci    IndividualChannelStream *ics = &sce->ics;
2132cabdff1aSopenharmony_ci    INTFLOAT *out = sce->coeffs;
2133cabdff1aSopenharmony_ci    int global_gain, eld_syntax, er_syntax, pulse_present = 0;
2134cabdff1aSopenharmony_ci    int ret;
2135cabdff1aSopenharmony_ci
2136cabdff1aSopenharmony_ci    eld_syntax = ac->oc[1].m4ac.object_type == AOT_ER_AAC_ELD;
2137cabdff1aSopenharmony_ci    er_syntax  = ac->oc[1].m4ac.object_type == AOT_ER_AAC_LC ||
2138cabdff1aSopenharmony_ci                 ac->oc[1].m4ac.object_type == AOT_ER_AAC_LTP ||
2139cabdff1aSopenharmony_ci                 ac->oc[1].m4ac.object_type == AOT_ER_AAC_LD ||
2140cabdff1aSopenharmony_ci                 ac->oc[1].m4ac.object_type == AOT_ER_AAC_ELD;
2141cabdff1aSopenharmony_ci
2142cabdff1aSopenharmony_ci    /* This assignment is to silence a GCC warning about the variable being used
2143cabdff1aSopenharmony_ci     * uninitialized when in fact it always is.
2144cabdff1aSopenharmony_ci     */
2145cabdff1aSopenharmony_ci    pulse.num_pulse = 0;
2146cabdff1aSopenharmony_ci
2147cabdff1aSopenharmony_ci    global_gain = get_bits(gb, 8);
2148cabdff1aSopenharmony_ci
2149cabdff1aSopenharmony_ci    if (!common_window && !scale_flag) {
2150cabdff1aSopenharmony_ci        ret = decode_ics_info(ac, ics, gb);
2151cabdff1aSopenharmony_ci        if (ret < 0)
2152cabdff1aSopenharmony_ci            goto fail;
2153cabdff1aSopenharmony_ci    }
2154cabdff1aSopenharmony_ci
2155cabdff1aSopenharmony_ci    if ((ret = decode_band_types(ac, sce->band_type,
2156cabdff1aSopenharmony_ci                                 sce->band_type_run_end, gb, ics)) < 0)
2157cabdff1aSopenharmony_ci        goto fail;
2158cabdff1aSopenharmony_ci    if ((ret = decode_scalefactors(ac, sce->sf, gb, global_gain, ics,
2159cabdff1aSopenharmony_ci                                  sce->band_type, sce->band_type_run_end)) < 0)
2160cabdff1aSopenharmony_ci        goto fail;
2161cabdff1aSopenharmony_ci
2162cabdff1aSopenharmony_ci    pulse_present = 0;
2163cabdff1aSopenharmony_ci    if (!scale_flag) {
2164cabdff1aSopenharmony_ci        if (!eld_syntax && (pulse_present = get_bits1(gb))) {
2165cabdff1aSopenharmony_ci            if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
2166cabdff1aSopenharmony_ci                av_log(ac->avctx, AV_LOG_ERROR,
2167cabdff1aSopenharmony_ci                       "Pulse tool not allowed in eight short sequence.\n");
2168cabdff1aSopenharmony_ci                ret = AVERROR_INVALIDDATA;
2169cabdff1aSopenharmony_ci                goto fail;
2170cabdff1aSopenharmony_ci            }
2171cabdff1aSopenharmony_ci            if (decode_pulses(&pulse, gb, ics->swb_offset, ics->num_swb)) {
2172cabdff1aSopenharmony_ci                av_log(ac->avctx, AV_LOG_ERROR,
2173cabdff1aSopenharmony_ci                       "Pulse data corrupt or invalid.\n");
2174cabdff1aSopenharmony_ci                ret = AVERROR_INVALIDDATA;
2175cabdff1aSopenharmony_ci                goto fail;
2176cabdff1aSopenharmony_ci            }
2177cabdff1aSopenharmony_ci        }
2178cabdff1aSopenharmony_ci        tns->present = get_bits1(gb);
2179cabdff1aSopenharmony_ci        if (tns->present && !er_syntax) {
2180cabdff1aSopenharmony_ci            ret = decode_tns(ac, tns, gb, ics);
2181cabdff1aSopenharmony_ci            if (ret < 0)
2182cabdff1aSopenharmony_ci                goto fail;
2183cabdff1aSopenharmony_ci        }
2184cabdff1aSopenharmony_ci        if (!eld_syntax && get_bits1(gb)) {
2185cabdff1aSopenharmony_ci            decode_gain_control(sce, gb);
2186cabdff1aSopenharmony_ci            if (!ac->warned_gain_control) {
2187cabdff1aSopenharmony_ci                avpriv_report_missing_feature(ac->avctx, "Gain control");
2188cabdff1aSopenharmony_ci                ac->warned_gain_control = 1;
2189cabdff1aSopenharmony_ci            }
2190cabdff1aSopenharmony_ci        }
2191cabdff1aSopenharmony_ci        // I see no textual basis in the spec for this occurring after SSR gain
2192cabdff1aSopenharmony_ci        // control, but this is what both reference and real implmentations do
2193cabdff1aSopenharmony_ci        if (tns->present && er_syntax) {
2194cabdff1aSopenharmony_ci            ret = decode_tns(ac, tns, gb, ics);
2195cabdff1aSopenharmony_ci            if (ret < 0)
2196cabdff1aSopenharmony_ci                goto fail;
2197cabdff1aSopenharmony_ci        }
2198cabdff1aSopenharmony_ci    }
2199cabdff1aSopenharmony_ci
2200cabdff1aSopenharmony_ci    ret = decode_spectrum_and_dequant(ac, out, gb, sce->sf, pulse_present,
2201cabdff1aSopenharmony_ci                                    &pulse, ics, sce->band_type);
2202cabdff1aSopenharmony_ci    if (ret < 0)
2203cabdff1aSopenharmony_ci        goto fail;
2204cabdff1aSopenharmony_ci
2205cabdff1aSopenharmony_ci    if (ac->oc[1].m4ac.object_type == AOT_AAC_MAIN && !common_window)
2206cabdff1aSopenharmony_ci        apply_prediction(ac, sce);
2207cabdff1aSopenharmony_ci
2208cabdff1aSopenharmony_ci    return 0;
2209cabdff1aSopenharmony_cifail:
2210cabdff1aSopenharmony_ci    tns->present = 0;
2211cabdff1aSopenharmony_ci    return ret;
2212cabdff1aSopenharmony_ci}
2213cabdff1aSopenharmony_ci
2214cabdff1aSopenharmony_ci/**
2215cabdff1aSopenharmony_ci * Mid/Side stereo decoding; reference: 4.6.8.1.3.
2216cabdff1aSopenharmony_ci */
2217cabdff1aSopenharmony_cistatic void apply_mid_side_stereo(AACContext *ac, ChannelElement *cpe)
2218cabdff1aSopenharmony_ci{
2219cabdff1aSopenharmony_ci    const IndividualChannelStream *ics = &cpe->ch[0].ics;
2220cabdff1aSopenharmony_ci    INTFLOAT *ch0 = cpe->ch[0].coeffs;
2221cabdff1aSopenharmony_ci    INTFLOAT *ch1 = cpe->ch[1].coeffs;
2222cabdff1aSopenharmony_ci    int g, i, group, idx = 0;
2223cabdff1aSopenharmony_ci    const uint16_t *offsets = ics->swb_offset;
2224cabdff1aSopenharmony_ci    for (g = 0; g < ics->num_window_groups; g++) {
2225cabdff1aSopenharmony_ci        for (i = 0; i < ics->max_sfb; i++, idx++) {
2226cabdff1aSopenharmony_ci            if (cpe->ms_mask[idx] &&
2227cabdff1aSopenharmony_ci                cpe->ch[0].band_type[idx] < NOISE_BT &&
2228cabdff1aSopenharmony_ci                cpe->ch[1].band_type[idx] < NOISE_BT) {
2229cabdff1aSopenharmony_ci#if USE_FIXED
2230cabdff1aSopenharmony_ci                for (group = 0; group < ics->group_len[g]; group++) {
2231cabdff1aSopenharmony_ci                    ac->fdsp->butterflies_fixed(ch0 + group * 128 + offsets[i],
2232cabdff1aSopenharmony_ci                                                ch1 + group * 128 + offsets[i],
2233cabdff1aSopenharmony_ci                                                offsets[i+1] - offsets[i]);
2234cabdff1aSopenharmony_ci#else
2235cabdff1aSopenharmony_ci                for (group = 0; group < ics->group_len[g]; group++) {
2236cabdff1aSopenharmony_ci                    ac->fdsp->butterflies_float(ch0 + group * 128 + offsets[i],
2237cabdff1aSopenharmony_ci                                               ch1 + group * 128 + offsets[i],
2238cabdff1aSopenharmony_ci                                               offsets[i+1] - offsets[i]);
2239cabdff1aSopenharmony_ci#endif /* USE_FIXED */
2240cabdff1aSopenharmony_ci                }
2241cabdff1aSopenharmony_ci            }
2242cabdff1aSopenharmony_ci        }
2243cabdff1aSopenharmony_ci        ch0 += ics->group_len[g] * 128;
2244cabdff1aSopenharmony_ci        ch1 += ics->group_len[g] * 128;
2245cabdff1aSopenharmony_ci    }
2246cabdff1aSopenharmony_ci}
2247cabdff1aSopenharmony_ci
2248cabdff1aSopenharmony_ci/**
2249cabdff1aSopenharmony_ci * intensity stereo decoding; reference: 4.6.8.2.3
2250cabdff1aSopenharmony_ci *
2251cabdff1aSopenharmony_ci * @param   ms_present  Indicates mid/side stereo presence. [0] mask is all 0s;
2252cabdff1aSopenharmony_ci *                      [1] mask is decoded from bitstream; [2] mask is all 1s;
2253cabdff1aSopenharmony_ci *                      [3] reserved for scalable AAC
2254cabdff1aSopenharmony_ci */
2255cabdff1aSopenharmony_cistatic void apply_intensity_stereo(AACContext *ac,
2256cabdff1aSopenharmony_ci                                   ChannelElement *cpe, int ms_present)
2257cabdff1aSopenharmony_ci{
2258cabdff1aSopenharmony_ci    const IndividualChannelStream *ics = &cpe->ch[1].ics;
2259cabdff1aSopenharmony_ci    SingleChannelElement         *sce1 = &cpe->ch[1];
2260cabdff1aSopenharmony_ci    INTFLOAT *coef0 = cpe->ch[0].coeffs, *coef1 = cpe->ch[1].coeffs;
2261cabdff1aSopenharmony_ci    const uint16_t *offsets = ics->swb_offset;
2262cabdff1aSopenharmony_ci    int g, group, i, idx = 0;
2263cabdff1aSopenharmony_ci    int c;
2264cabdff1aSopenharmony_ci    INTFLOAT scale;
2265cabdff1aSopenharmony_ci    for (g = 0; g < ics->num_window_groups; g++) {
2266cabdff1aSopenharmony_ci        for (i = 0; i < ics->max_sfb;) {
2267cabdff1aSopenharmony_ci            if (sce1->band_type[idx] == INTENSITY_BT ||
2268cabdff1aSopenharmony_ci                sce1->band_type[idx] == INTENSITY_BT2) {
2269cabdff1aSopenharmony_ci                const int bt_run_end = sce1->band_type_run_end[idx];
2270cabdff1aSopenharmony_ci                for (; i < bt_run_end; i++, idx++) {
2271cabdff1aSopenharmony_ci                    c = -1 + 2 * (sce1->band_type[idx] - 14);
2272cabdff1aSopenharmony_ci                    if (ms_present)
2273cabdff1aSopenharmony_ci                        c *= 1 - 2 * cpe->ms_mask[idx];
2274cabdff1aSopenharmony_ci                    scale = c * sce1->sf[idx];
2275cabdff1aSopenharmony_ci                    for (group = 0; group < ics->group_len[g]; group++)
2276cabdff1aSopenharmony_ci#if USE_FIXED
2277cabdff1aSopenharmony_ci                        ac->subband_scale(coef1 + group * 128 + offsets[i],
2278cabdff1aSopenharmony_ci                                      coef0 + group * 128 + offsets[i],
2279cabdff1aSopenharmony_ci                                      scale,
2280cabdff1aSopenharmony_ci                                      23,
2281cabdff1aSopenharmony_ci                                      offsets[i + 1] - offsets[i] ,ac->avctx);
2282cabdff1aSopenharmony_ci#else
2283cabdff1aSopenharmony_ci                        ac->fdsp->vector_fmul_scalar(coef1 + group * 128 + offsets[i],
2284cabdff1aSopenharmony_ci                                                    coef0 + group * 128 + offsets[i],
2285cabdff1aSopenharmony_ci                                                    scale,
2286cabdff1aSopenharmony_ci                                                    offsets[i + 1] - offsets[i]);
2287cabdff1aSopenharmony_ci#endif /* USE_FIXED */
2288cabdff1aSopenharmony_ci                }
2289cabdff1aSopenharmony_ci            } else {
2290cabdff1aSopenharmony_ci                int bt_run_end = sce1->band_type_run_end[idx];
2291cabdff1aSopenharmony_ci                idx += bt_run_end - i;
2292cabdff1aSopenharmony_ci                i    = bt_run_end;
2293cabdff1aSopenharmony_ci            }
2294cabdff1aSopenharmony_ci        }
2295cabdff1aSopenharmony_ci        coef0 += ics->group_len[g] * 128;
2296cabdff1aSopenharmony_ci        coef1 += ics->group_len[g] * 128;
2297cabdff1aSopenharmony_ci    }
2298cabdff1aSopenharmony_ci}
2299cabdff1aSopenharmony_ci
2300cabdff1aSopenharmony_ci/**
2301cabdff1aSopenharmony_ci * Decode a channel_pair_element; reference: table 4.4.
2302cabdff1aSopenharmony_ci *
2303cabdff1aSopenharmony_ci * @return  Returns error status. 0 - OK, !0 - error
2304cabdff1aSopenharmony_ci */
2305cabdff1aSopenharmony_cistatic int decode_cpe(AACContext *ac, GetBitContext *gb, ChannelElement *cpe)
2306cabdff1aSopenharmony_ci{
2307cabdff1aSopenharmony_ci    int i, ret, common_window, ms_present = 0;
2308cabdff1aSopenharmony_ci    int eld_syntax = ac->oc[1].m4ac.object_type == AOT_ER_AAC_ELD;
2309cabdff1aSopenharmony_ci
2310cabdff1aSopenharmony_ci    common_window = eld_syntax || get_bits1(gb);
2311cabdff1aSopenharmony_ci    if (common_window) {
2312cabdff1aSopenharmony_ci        if (decode_ics_info(ac, &cpe->ch[0].ics, gb))
2313cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
2314cabdff1aSopenharmony_ci        i = cpe->ch[1].ics.use_kb_window[0];
2315cabdff1aSopenharmony_ci        cpe->ch[1].ics = cpe->ch[0].ics;
2316cabdff1aSopenharmony_ci        cpe->ch[1].ics.use_kb_window[1] = i;
2317cabdff1aSopenharmony_ci        if (cpe->ch[1].ics.predictor_present &&
2318cabdff1aSopenharmony_ci            (ac->oc[1].m4ac.object_type != AOT_AAC_MAIN))
2319cabdff1aSopenharmony_ci            if ((cpe->ch[1].ics.ltp.present = get_bits(gb, 1)))
2320cabdff1aSopenharmony_ci                decode_ltp(&cpe->ch[1].ics.ltp, gb, cpe->ch[1].ics.max_sfb);
2321cabdff1aSopenharmony_ci        ms_present = get_bits(gb, 2);
2322cabdff1aSopenharmony_ci        if (ms_present == 3) {
2323cabdff1aSopenharmony_ci            av_log(ac->avctx, AV_LOG_ERROR, "ms_present = 3 is reserved.\n");
2324cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
2325cabdff1aSopenharmony_ci        } else if (ms_present)
2326cabdff1aSopenharmony_ci            decode_mid_side_stereo(cpe, gb, ms_present);
2327cabdff1aSopenharmony_ci    }
2328cabdff1aSopenharmony_ci    if ((ret = decode_ics(ac, &cpe->ch[0], gb, common_window, 0)))
2329cabdff1aSopenharmony_ci        return ret;
2330cabdff1aSopenharmony_ci    if ((ret = decode_ics(ac, &cpe->ch[1], gb, common_window, 0)))
2331cabdff1aSopenharmony_ci        return ret;
2332cabdff1aSopenharmony_ci
2333cabdff1aSopenharmony_ci    if (common_window) {
2334cabdff1aSopenharmony_ci        if (ms_present)
2335cabdff1aSopenharmony_ci            apply_mid_side_stereo(ac, cpe);
2336cabdff1aSopenharmony_ci        if (ac->oc[1].m4ac.object_type == AOT_AAC_MAIN) {
2337cabdff1aSopenharmony_ci            apply_prediction(ac, &cpe->ch[0]);
2338cabdff1aSopenharmony_ci            apply_prediction(ac, &cpe->ch[1]);
2339cabdff1aSopenharmony_ci        }
2340cabdff1aSopenharmony_ci    }
2341cabdff1aSopenharmony_ci
2342cabdff1aSopenharmony_ci    apply_intensity_stereo(ac, cpe, ms_present);
2343cabdff1aSopenharmony_ci    return 0;
2344cabdff1aSopenharmony_ci}
2345cabdff1aSopenharmony_ci
2346cabdff1aSopenharmony_cistatic const float cce_scale[] = {
2347cabdff1aSopenharmony_ci    1.09050773266525765921, //2^(1/8)
2348cabdff1aSopenharmony_ci    1.18920711500272106672, //2^(1/4)
2349cabdff1aSopenharmony_ci    M_SQRT2,
2350cabdff1aSopenharmony_ci    2,
2351cabdff1aSopenharmony_ci};
2352cabdff1aSopenharmony_ci
2353cabdff1aSopenharmony_ci/**
2354cabdff1aSopenharmony_ci * Decode coupling_channel_element; reference: table 4.8.
2355cabdff1aSopenharmony_ci *
2356cabdff1aSopenharmony_ci * @return  Returns error status. 0 - OK, !0 - error
2357cabdff1aSopenharmony_ci */
2358cabdff1aSopenharmony_cistatic int decode_cce(AACContext *ac, GetBitContext *gb, ChannelElement *che)
2359cabdff1aSopenharmony_ci{
2360cabdff1aSopenharmony_ci    int num_gain = 0;
2361cabdff1aSopenharmony_ci    int c, g, sfb, ret;
2362cabdff1aSopenharmony_ci    int sign;
2363cabdff1aSopenharmony_ci    INTFLOAT scale;
2364cabdff1aSopenharmony_ci    SingleChannelElement *sce = &che->ch[0];
2365cabdff1aSopenharmony_ci    ChannelCoupling     *coup = &che->coup;
2366cabdff1aSopenharmony_ci
2367cabdff1aSopenharmony_ci    coup->coupling_point = 2 * get_bits1(gb);
2368cabdff1aSopenharmony_ci    coup->num_coupled = get_bits(gb, 3);
2369cabdff1aSopenharmony_ci    for (c = 0; c <= coup->num_coupled; c++) {
2370cabdff1aSopenharmony_ci        num_gain++;
2371cabdff1aSopenharmony_ci        coup->type[c] = get_bits1(gb) ? TYPE_CPE : TYPE_SCE;
2372cabdff1aSopenharmony_ci        coup->id_select[c] = get_bits(gb, 4);
2373cabdff1aSopenharmony_ci        if (coup->type[c] == TYPE_CPE) {
2374cabdff1aSopenharmony_ci            coup->ch_select[c] = get_bits(gb, 2);
2375cabdff1aSopenharmony_ci            if (coup->ch_select[c] == 3)
2376cabdff1aSopenharmony_ci                num_gain++;
2377cabdff1aSopenharmony_ci        } else
2378cabdff1aSopenharmony_ci            coup->ch_select[c] = 2;
2379cabdff1aSopenharmony_ci    }
2380cabdff1aSopenharmony_ci    coup->coupling_point += get_bits1(gb) || (coup->coupling_point >> 1);
2381cabdff1aSopenharmony_ci
2382cabdff1aSopenharmony_ci    sign  = get_bits(gb, 1);
2383cabdff1aSopenharmony_ci#if USE_FIXED
2384cabdff1aSopenharmony_ci    scale = get_bits(gb, 2);
2385cabdff1aSopenharmony_ci#else
2386cabdff1aSopenharmony_ci    scale = cce_scale[get_bits(gb, 2)];
2387cabdff1aSopenharmony_ci#endif
2388cabdff1aSopenharmony_ci
2389cabdff1aSopenharmony_ci    if ((ret = decode_ics(ac, sce, gb, 0, 0)))
2390cabdff1aSopenharmony_ci        return ret;
2391cabdff1aSopenharmony_ci
2392cabdff1aSopenharmony_ci    for (c = 0; c < num_gain; c++) {
2393cabdff1aSopenharmony_ci        int idx  = 0;
2394cabdff1aSopenharmony_ci        int cge  = 1;
2395cabdff1aSopenharmony_ci        int gain = 0;
2396cabdff1aSopenharmony_ci        INTFLOAT gain_cache = FIXR10(1.);
2397cabdff1aSopenharmony_ci        if (c) {
2398cabdff1aSopenharmony_ci            cge = coup->coupling_point == AFTER_IMDCT ? 1 : get_bits1(gb);
2399cabdff1aSopenharmony_ci            gain = cge ? get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60: 0;
2400cabdff1aSopenharmony_ci            gain_cache = GET_GAIN(scale, gain);
2401cabdff1aSopenharmony_ci#if USE_FIXED
2402cabdff1aSopenharmony_ci            if ((abs(gain_cache)-1024) >> 3 > 30)
2403cabdff1aSopenharmony_ci                return AVERROR(ERANGE);
2404cabdff1aSopenharmony_ci#endif
2405cabdff1aSopenharmony_ci        }
2406cabdff1aSopenharmony_ci        if (coup->coupling_point == AFTER_IMDCT) {
2407cabdff1aSopenharmony_ci            coup->gain[c][0] = gain_cache;
2408cabdff1aSopenharmony_ci        } else {
2409cabdff1aSopenharmony_ci            for (g = 0; g < sce->ics.num_window_groups; g++) {
2410cabdff1aSopenharmony_ci                for (sfb = 0; sfb < sce->ics.max_sfb; sfb++, idx++) {
2411cabdff1aSopenharmony_ci                    if (sce->band_type[idx] != ZERO_BT) {
2412cabdff1aSopenharmony_ci                        if (!cge) {
2413cabdff1aSopenharmony_ci                            int t = get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60;
2414cabdff1aSopenharmony_ci                            if (t) {
2415cabdff1aSopenharmony_ci                                int s = 1;
2416cabdff1aSopenharmony_ci                                t = gain += t;
2417cabdff1aSopenharmony_ci                                if (sign) {
2418cabdff1aSopenharmony_ci                                    s  -= 2 * (t & 0x1);
2419cabdff1aSopenharmony_ci                                    t >>= 1;
2420cabdff1aSopenharmony_ci                                }
2421cabdff1aSopenharmony_ci                                gain_cache = GET_GAIN(scale, t) * s;
2422cabdff1aSopenharmony_ci#if USE_FIXED
2423cabdff1aSopenharmony_ci                                if ((abs(gain_cache)-1024) >> 3 > 30)
2424cabdff1aSopenharmony_ci                                    return AVERROR(ERANGE);
2425cabdff1aSopenharmony_ci#endif
2426cabdff1aSopenharmony_ci                            }
2427cabdff1aSopenharmony_ci                        }
2428cabdff1aSopenharmony_ci                        coup->gain[c][idx] = gain_cache;
2429cabdff1aSopenharmony_ci                    }
2430cabdff1aSopenharmony_ci                }
2431cabdff1aSopenharmony_ci            }
2432cabdff1aSopenharmony_ci        }
2433cabdff1aSopenharmony_ci    }
2434cabdff1aSopenharmony_ci    return 0;
2435cabdff1aSopenharmony_ci}
2436cabdff1aSopenharmony_ci
2437cabdff1aSopenharmony_ci/**
2438cabdff1aSopenharmony_ci * Parse whether channels are to be excluded from Dynamic Range Compression; reference: table 4.53.
2439cabdff1aSopenharmony_ci *
2440cabdff1aSopenharmony_ci * @return  Returns number of bytes consumed.
2441cabdff1aSopenharmony_ci */
2442cabdff1aSopenharmony_cistatic int decode_drc_channel_exclusions(DynamicRangeControl *che_drc,
2443cabdff1aSopenharmony_ci                                         GetBitContext *gb)
2444cabdff1aSopenharmony_ci{
2445cabdff1aSopenharmony_ci    int i;
2446cabdff1aSopenharmony_ci    int num_excl_chan = 0;
2447cabdff1aSopenharmony_ci
2448cabdff1aSopenharmony_ci    do {
2449cabdff1aSopenharmony_ci        for (i = 0; i < 7; i++)
2450cabdff1aSopenharmony_ci            che_drc->exclude_mask[num_excl_chan++] = get_bits1(gb);
2451cabdff1aSopenharmony_ci    } while (num_excl_chan < MAX_CHANNELS - 7 && get_bits1(gb));
2452cabdff1aSopenharmony_ci
2453cabdff1aSopenharmony_ci    return num_excl_chan / 7;
2454cabdff1aSopenharmony_ci}
2455cabdff1aSopenharmony_ci
2456cabdff1aSopenharmony_ci/**
2457cabdff1aSopenharmony_ci * Decode dynamic range information; reference: table 4.52.
2458cabdff1aSopenharmony_ci *
2459cabdff1aSopenharmony_ci * @return  Returns number of bytes consumed.
2460cabdff1aSopenharmony_ci */
2461cabdff1aSopenharmony_cistatic int decode_dynamic_range(DynamicRangeControl *che_drc,
2462cabdff1aSopenharmony_ci                                GetBitContext *gb)
2463cabdff1aSopenharmony_ci{
2464cabdff1aSopenharmony_ci    int n             = 1;
2465cabdff1aSopenharmony_ci    int drc_num_bands = 1;
2466cabdff1aSopenharmony_ci    int i;
2467cabdff1aSopenharmony_ci
2468cabdff1aSopenharmony_ci    /* pce_tag_present? */
2469cabdff1aSopenharmony_ci    if (get_bits1(gb)) {
2470cabdff1aSopenharmony_ci        che_drc->pce_instance_tag  = get_bits(gb, 4);
2471cabdff1aSopenharmony_ci        skip_bits(gb, 4); // tag_reserved_bits
2472cabdff1aSopenharmony_ci        n++;
2473cabdff1aSopenharmony_ci    }
2474cabdff1aSopenharmony_ci
2475cabdff1aSopenharmony_ci    /* excluded_chns_present? */
2476cabdff1aSopenharmony_ci    if (get_bits1(gb)) {
2477cabdff1aSopenharmony_ci        n += decode_drc_channel_exclusions(che_drc, gb);
2478cabdff1aSopenharmony_ci    }
2479cabdff1aSopenharmony_ci
2480cabdff1aSopenharmony_ci    /* drc_bands_present? */
2481cabdff1aSopenharmony_ci    if (get_bits1(gb)) {
2482cabdff1aSopenharmony_ci        che_drc->band_incr            = get_bits(gb, 4);
2483cabdff1aSopenharmony_ci        che_drc->interpolation_scheme = get_bits(gb, 4);
2484cabdff1aSopenharmony_ci        n++;
2485cabdff1aSopenharmony_ci        drc_num_bands += che_drc->band_incr;
2486cabdff1aSopenharmony_ci        for (i = 0; i < drc_num_bands; i++) {
2487cabdff1aSopenharmony_ci            che_drc->band_top[i] = get_bits(gb, 8);
2488cabdff1aSopenharmony_ci            n++;
2489cabdff1aSopenharmony_ci        }
2490cabdff1aSopenharmony_ci    }
2491cabdff1aSopenharmony_ci
2492cabdff1aSopenharmony_ci    /* prog_ref_level_present? */
2493cabdff1aSopenharmony_ci    if (get_bits1(gb)) {
2494cabdff1aSopenharmony_ci        che_drc->prog_ref_level = get_bits(gb, 7);
2495cabdff1aSopenharmony_ci        skip_bits1(gb); // prog_ref_level_reserved_bits
2496cabdff1aSopenharmony_ci        n++;
2497cabdff1aSopenharmony_ci    }
2498cabdff1aSopenharmony_ci
2499cabdff1aSopenharmony_ci    for (i = 0; i < drc_num_bands; i++) {
2500cabdff1aSopenharmony_ci        che_drc->dyn_rng_sgn[i] = get_bits1(gb);
2501cabdff1aSopenharmony_ci        che_drc->dyn_rng_ctl[i] = get_bits(gb, 7);
2502cabdff1aSopenharmony_ci        n++;
2503cabdff1aSopenharmony_ci    }
2504cabdff1aSopenharmony_ci
2505cabdff1aSopenharmony_ci    return n;
2506cabdff1aSopenharmony_ci}
2507cabdff1aSopenharmony_ci
2508cabdff1aSopenharmony_cistatic int decode_fill(AACContext *ac, GetBitContext *gb, int len) {
2509cabdff1aSopenharmony_ci    uint8_t buf[256];
2510cabdff1aSopenharmony_ci    int i, major, minor;
2511cabdff1aSopenharmony_ci
2512cabdff1aSopenharmony_ci    if (len < 13+7*8)
2513cabdff1aSopenharmony_ci        goto unknown;
2514cabdff1aSopenharmony_ci
2515cabdff1aSopenharmony_ci    get_bits(gb, 13); len -= 13;
2516cabdff1aSopenharmony_ci
2517cabdff1aSopenharmony_ci    for(i=0; i+1<sizeof(buf) && len>=8; i++, len-=8)
2518cabdff1aSopenharmony_ci        buf[i] = get_bits(gb, 8);
2519cabdff1aSopenharmony_ci
2520cabdff1aSopenharmony_ci    buf[i] = 0;
2521cabdff1aSopenharmony_ci    if (ac->avctx->debug & FF_DEBUG_PICT_INFO)
2522cabdff1aSopenharmony_ci        av_log(ac->avctx, AV_LOG_DEBUG, "FILL:%s\n", buf);
2523cabdff1aSopenharmony_ci
2524cabdff1aSopenharmony_ci    if (sscanf(buf, "libfaac %d.%d", &major, &minor) == 2){
2525cabdff1aSopenharmony_ci        ac->avctx->internal->skip_samples = 1024;
2526cabdff1aSopenharmony_ci    }
2527cabdff1aSopenharmony_ci
2528cabdff1aSopenharmony_ciunknown:
2529cabdff1aSopenharmony_ci    skip_bits_long(gb, len);
2530cabdff1aSopenharmony_ci
2531cabdff1aSopenharmony_ci    return 0;
2532cabdff1aSopenharmony_ci}
2533cabdff1aSopenharmony_ci
2534cabdff1aSopenharmony_ci/**
2535cabdff1aSopenharmony_ci * Decode extension data (incomplete); reference: table 4.51.
2536cabdff1aSopenharmony_ci *
2537cabdff1aSopenharmony_ci * @param   cnt length of TYPE_FIL syntactic element in bytes
2538cabdff1aSopenharmony_ci *
2539cabdff1aSopenharmony_ci * @return Returns number of bytes consumed
2540cabdff1aSopenharmony_ci */
2541cabdff1aSopenharmony_cistatic int decode_extension_payload(AACContext *ac, GetBitContext *gb, int cnt,
2542cabdff1aSopenharmony_ci                                    ChannelElement *che, enum RawDataBlockType elem_type)
2543cabdff1aSopenharmony_ci{
2544cabdff1aSopenharmony_ci    int crc_flag = 0;
2545cabdff1aSopenharmony_ci    int res = cnt;
2546cabdff1aSopenharmony_ci    int type = get_bits(gb, 4);
2547cabdff1aSopenharmony_ci
2548cabdff1aSopenharmony_ci    if (ac->avctx->debug & FF_DEBUG_STARTCODE)
2549cabdff1aSopenharmony_ci        av_log(ac->avctx, AV_LOG_DEBUG, "extension type: %d len:%d\n", type, cnt);
2550cabdff1aSopenharmony_ci
2551cabdff1aSopenharmony_ci    switch (type) { // extension type
2552cabdff1aSopenharmony_ci    case EXT_SBR_DATA_CRC:
2553cabdff1aSopenharmony_ci        crc_flag++;
2554cabdff1aSopenharmony_ci    case EXT_SBR_DATA:
2555cabdff1aSopenharmony_ci        if (!che) {
2556cabdff1aSopenharmony_ci            av_log(ac->avctx, AV_LOG_ERROR, "SBR was found before the first channel element.\n");
2557cabdff1aSopenharmony_ci            return res;
2558cabdff1aSopenharmony_ci        } else if (ac->oc[1].m4ac.frame_length_short) {
2559cabdff1aSopenharmony_ci            if (!ac->warned_960_sbr)
2560cabdff1aSopenharmony_ci              avpriv_report_missing_feature(ac->avctx,
2561cabdff1aSopenharmony_ci                                            "SBR with 960 frame length");
2562cabdff1aSopenharmony_ci            ac->warned_960_sbr = 1;
2563cabdff1aSopenharmony_ci            skip_bits_long(gb, 8 * cnt - 4);
2564cabdff1aSopenharmony_ci            return res;
2565cabdff1aSopenharmony_ci        } else if (!ac->oc[1].m4ac.sbr) {
2566cabdff1aSopenharmony_ci            av_log(ac->avctx, AV_LOG_ERROR, "SBR signaled to be not-present but was found in the bitstream.\n");
2567cabdff1aSopenharmony_ci            skip_bits_long(gb, 8 * cnt - 4);
2568cabdff1aSopenharmony_ci            return res;
2569cabdff1aSopenharmony_ci        } else if (ac->oc[1].m4ac.sbr == -1 && ac->oc[1].status == OC_LOCKED) {
2570cabdff1aSopenharmony_ci            av_log(ac->avctx, AV_LOG_ERROR, "Implicit SBR was found with a first occurrence after the first frame.\n");
2571cabdff1aSopenharmony_ci            skip_bits_long(gb, 8 * cnt - 4);
2572cabdff1aSopenharmony_ci            return res;
2573cabdff1aSopenharmony_ci        } else if (ac->oc[1].m4ac.ps == -1 && ac->oc[1].status < OC_LOCKED &&
2574cabdff1aSopenharmony_ci                   ac->avctx->ch_layout.nb_channels == 1) {
2575cabdff1aSopenharmony_ci            ac->oc[1].m4ac.sbr = 1;
2576cabdff1aSopenharmony_ci            ac->oc[1].m4ac.ps = 1;
2577cabdff1aSopenharmony_ci            ac->avctx->profile = FF_PROFILE_AAC_HE_V2;
2578cabdff1aSopenharmony_ci            output_configure(ac, ac->oc[1].layout_map, ac->oc[1].layout_map_tags,
2579cabdff1aSopenharmony_ci                             ac->oc[1].status, 1);
2580cabdff1aSopenharmony_ci        } else {
2581cabdff1aSopenharmony_ci            ac->oc[1].m4ac.sbr = 1;
2582cabdff1aSopenharmony_ci            ac->avctx->profile = FF_PROFILE_AAC_HE;
2583cabdff1aSopenharmony_ci        }
2584cabdff1aSopenharmony_ci        res = AAC_RENAME(ff_decode_sbr_extension)(ac, &che->sbr, gb, crc_flag, cnt, elem_type);
2585cabdff1aSopenharmony_ci        break;
2586cabdff1aSopenharmony_ci    case EXT_DYNAMIC_RANGE:
2587cabdff1aSopenharmony_ci        res = decode_dynamic_range(&ac->che_drc, gb);
2588cabdff1aSopenharmony_ci        break;
2589cabdff1aSopenharmony_ci    case EXT_FILL:
2590cabdff1aSopenharmony_ci        decode_fill(ac, gb, 8 * cnt - 4);
2591cabdff1aSopenharmony_ci        break;
2592cabdff1aSopenharmony_ci    case EXT_FILL_DATA:
2593cabdff1aSopenharmony_ci    case EXT_DATA_ELEMENT:
2594cabdff1aSopenharmony_ci    default:
2595cabdff1aSopenharmony_ci        skip_bits_long(gb, 8 * cnt - 4);
2596cabdff1aSopenharmony_ci        break;
2597cabdff1aSopenharmony_ci    };
2598cabdff1aSopenharmony_ci    return res;
2599cabdff1aSopenharmony_ci}
2600cabdff1aSopenharmony_ci
2601cabdff1aSopenharmony_ci/**
2602cabdff1aSopenharmony_ci * Decode Temporal Noise Shaping filter coefficients and apply all-pole filters; reference: 4.6.9.3.
2603cabdff1aSopenharmony_ci *
2604cabdff1aSopenharmony_ci * @param   decode  1 if tool is used normally, 0 if tool is used in LTP.
2605cabdff1aSopenharmony_ci * @param   coef    spectral coefficients
2606cabdff1aSopenharmony_ci */
2607cabdff1aSopenharmony_cistatic void apply_tns(INTFLOAT coef_param[1024], TemporalNoiseShaping *tns,
2608cabdff1aSopenharmony_ci                      IndividualChannelStream *ics, int decode)
2609cabdff1aSopenharmony_ci{
2610cabdff1aSopenharmony_ci    const int mmm = FFMIN(ics->tns_max_bands, ics->max_sfb);
2611cabdff1aSopenharmony_ci    int w, filt, m, i;
2612cabdff1aSopenharmony_ci    int bottom, top, order, start, end, size, inc;
2613cabdff1aSopenharmony_ci    INTFLOAT lpc[TNS_MAX_ORDER];
2614cabdff1aSopenharmony_ci    INTFLOAT tmp[TNS_MAX_ORDER+1];
2615cabdff1aSopenharmony_ci    UINTFLOAT *coef = coef_param;
2616cabdff1aSopenharmony_ci
2617cabdff1aSopenharmony_ci    if(!mmm)
2618cabdff1aSopenharmony_ci        return;
2619cabdff1aSopenharmony_ci
2620cabdff1aSopenharmony_ci    for (w = 0; w < ics->num_windows; w++) {
2621cabdff1aSopenharmony_ci        bottom = ics->num_swb;
2622cabdff1aSopenharmony_ci        for (filt = 0; filt < tns->n_filt[w]; filt++) {
2623cabdff1aSopenharmony_ci            top    = bottom;
2624cabdff1aSopenharmony_ci            bottom = FFMAX(0, top - tns->length[w][filt]);
2625cabdff1aSopenharmony_ci            order  = tns->order[w][filt];
2626cabdff1aSopenharmony_ci            if (order == 0)
2627cabdff1aSopenharmony_ci                continue;
2628cabdff1aSopenharmony_ci
2629cabdff1aSopenharmony_ci            // tns_decode_coef
2630cabdff1aSopenharmony_ci            AAC_RENAME(compute_lpc_coefs)(tns->coef[w][filt], order, lpc, 0, 0, 0);
2631cabdff1aSopenharmony_ci
2632cabdff1aSopenharmony_ci            start = ics->swb_offset[FFMIN(bottom, mmm)];
2633cabdff1aSopenharmony_ci            end   = ics->swb_offset[FFMIN(   top, mmm)];
2634cabdff1aSopenharmony_ci            if ((size = end - start) <= 0)
2635cabdff1aSopenharmony_ci                continue;
2636cabdff1aSopenharmony_ci            if (tns->direction[w][filt]) {
2637cabdff1aSopenharmony_ci                inc = -1;
2638cabdff1aSopenharmony_ci                start = end - 1;
2639cabdff1aSopenharmony_ci            } else {
2640cabdff1aSopenharmony_ci                inc = 1;
2641cabdff1aSopenharmony_ci            }
2642cabdff1aSopenharmony_ci            start += w * 128;
2643cabdff1aSopenharmony_ci
2644cabdff1aSopenharmony_ci            if (decode) {
2645cabdff1aSopenharmony_ci                // ar filter
2646cabdff1aSopenharmony_ci                for (m = 0; m < size; m++, start += inc)
2647cabdff1aSopenharmony_ci                    for (i = 1; i <= FFMIN(m, order); i++)
2648cabdff1aSopenharmony_ci                        coef[start] -= AAC_MUL26((INTFLOAT)coef[start - i * inc], lpc[i - 1]);
2649cabdff1aSopenharmony_ci            } else {
2650cabdff1aSopenharmony_ci                // ma filter
2651cabdff1aSopenharmony_ci                for (m = 0; m < size; m++, start += inc) {
2652cabdff1aSopenharmony_ci                    tmp[0] = coef[start];
2653cabdff1aSopenharmony_ci                    for (i = 1; i <= FFMIN(m, order); i++)
2654cabdff1aSopenharmony_ci                        coef[start] += AAC_MUL26(tmp[i], lpc[i - 1]);
2655cabdff1aSopenharmony_ci                    for (i = order; i > 0; i--)
2656cabdff1aSopenharmony_ci                        tmp[i] = tmp[i - 1];
2657cabdff1aSopenharmony_ci                }
2658cabdff1aSopenharmony_ci            }
2659cabdff1aSopenharmony_ci        }
2660cabdff1aSopenharmony_ci    }
2661cabdff1aSopenharmony_ci}
2662cabdff1aSopenharmony_ci
2663cabdff1aSopenharmony_ci/**
2664cabdff1aSopenharmony_ci *  Apply windowing and MDCT to obtain the spectral
2665cabdff1aSopenharmony_ci *  coefficient from the predicted sample by LTP.
2666cabdff1aSopenharmony_ci */
2667cabdff1aSopenharmony_cistatic void windowing_and_mdct_ltp(AACContext *ac, INTFLOAT *out,
2668cabdff1aSopenharmony_ci                                   INTFLOAT *in, IndividualChannelStream *ics)
2669cabdff1aSopenharmony_ci{
2670cabdff1aSopenharmony_ci    const INTFLOAT *lwindow      = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024);
2671cabdff1aSopenharmony_ci    const INTFLOAT *swindow      = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128);
2672cabdff1aSopenharmony_ci    const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024);
2673cabdff1aSopenharmony_ci    const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128);
2674cabdff1aSopenharmony_ci
2675cabdff1aSopenharmony_ci    if (ics->window_sequence[0] != LONG_STOP_SEQUENCE) {
2676cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul(in, in, lwindow_prev, 1024);
2677cabdff1aSopenharmony_ci    } else {
2678cabdff1aSopenharmony_ci        memset(in, 0, 448 * sizeof(*in));
2679cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul(in + 448, in + 448, swindow_prev, 128);
2680cabdff1aSopenharmony_ci    }
2681cabdff1aSopenharmony_ci    if (ics->window_sequence[0] != LONG_START_SEQUENCE) {
2682cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul_reverse(in + 1024, in + 1024, lwindow, 1024);
2683cabdff1aSopenharmony_ci    } else {
2684cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul_reverse(in + 1024 + 448, in + 1024 + 448, swindow, 128);
2685cabdff1aSopenharmony_ci        memset(in + 1024 + 576, 0, 448 * sizeof(*in));
2686cabdff1aSopenharmony_ci    }
2687cabdff1aSopenharmony_ci    ac->mdct_ltp.mdct_calc(&ac->mdct_ltp, out, in);
2688cabdff1aSopenharmony_ci}
2689cabdff1aSopenharmony_ci
2690cabdff1aSopenharmony_ci/**
2691cabdff1aSopenharmony_ci * Apply the long term prediction
2692cabdff1aSopenharmony_ci */
2693cabdff1aSopenharmony_cistatic void apply_ltp(AACContext *ac, SingleChannelElement *sce)
2694cabdff1aSopenharmony_ci{
2695cabdff1aSopenharmony_ci    const LongTermPrediction *ltp = &sce->ics.ltp;
2696cabdff1aSopenharmony_ci    const uint16_t *offsets = sce->ics.swb_offset;
2697cabdff1aSopenharmony_ci    int i, sfb;
2698cabdff1aSopenharmony_ci
2699cabdff1aSopenharmony_ci    if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
2700cabdff1aSopenharmony_ci        INTFLOAT *predTime = sce->ret;
2701cabdff1aSopenharmony_ci        INTFLOAT *predFreq = ac->buf_mdct;
2702cabdff1aSopenharmony_ci        int16_t num_samples = 2048;
2703cabdff1aSopenharmony_ci
2704cabdff1aSopenharmony_ci        if (ltp->lag < 1024)
2705cabdff1aSopenharmony_ci            num_samples = ltp->lag + 1024;
2706cabdff1aSopenharmony_ci        for (i = 0; i < num_samples; i++)
2707cabdff1aSopenharmony_ci            predTime[i] = AAC_MUL30(sce->ltp_state[i + 2048 - ltp->lag], ltp->coef);
2708cabdff1aSopenharmony_ci        memset(&predTime[i], 0, (2048 - i) * sizeof(*predTime));
2709cabdff1aSopenharmony_ci
2710cabdff1aSopenharmony_ci        ac->windowing_and_mdct_ltp(ac, predFreq, predTime, &sce->ics);
2711cabdff1aSopenharmony_ci
2712cabdff1aSopenharmony_ci        if (sce->tns.present)
2713cabdff1aSopenharmony_ci            ac->apply_tns(predFreq, &sce->tns, &sce->ics, 0);
2714cabdff1aSopenharmony_ci
2715cabdff1aSopenharmony_ci        for (sfb = 0; sfb < FFMIN(sce->ics.max_sfb, MAX_LTP_LONG_SFB); sfb++)
2716cabdff1aSopenharmony_ci            if (ltp->used[sfb])
2717cabdff1aSopenharmony_ci                for (i = offsets[sfb]; i < offsets[sfb + 1]; i++)
2718cabdff1aSopenharmony_ci                    sce->coeffs[i] += (UINTFLOAT)predFreq[i];
2719cabdff1aSopenharmony_ci    }
2720cabdff1aSopenharmony_ci}
2721cabdff1aSopenharmony_ci
2722cabdff1aSopenharmony_ci/**
2723cabdff1aSopenharmony_ci * Update the LTP buffer for next frame
2724cabdff1aSopenharmony_ci */
2725cabdff1aSopenharmony_cistatic void update_ltp(AACContext *ac, SingleChannelElement *sce)
2726cabdff1aSopenharmony_ci{
2727cabdff1aSopenharmony_ci    IndividualChannelStream *ics = &sce->ics;
2728cabdff1aSopenharmony_ci    INTFLOAT *saved     = sce->saved;
2729cabdff1aSopenharmony_ci    INTFLOAT *saved_ltp = sce->coeffs;
2730cabdff1aSopenharmony_ci    const INTFLOAT *lwindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024);
2731cabdff1aSopenharmony_ci    const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128);
2732cabdff1aSopenharmony_ci    int i;
2733cabdff1aSopenharmony_ci
2734cabdff1aSopenharmony_ci    if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
2735cabdff1aSopenharmony_ci        memcpy(saved_ltp,       saved, 512 * sizeof(*saved_ltp));
2736cabdff1aSopenharmony_ci        memset(saved_ltp + 576, 0,     448 * sizeof(*saved_ltp));
2737cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct + 960,     &swindow[64],      64);
2738cabdff1aSopenharmony_ci
2739cabdff1aSopenharmony_ci        for (i = 0; i < 64; i++)
2740cabdff1aSopenharmony_ci            saved_ltp[i + 512] = AAC_MUL31(ac->buf_mdct[1023 - i], swindow[63 - i]);
2741cabdff1aSopenharmony_ci    } else if (ics->window_sequence[0] == LONG_START_SEQUENCE) {
2742cabdff1aSopenharmony_ci        memcpy(saved_ltp,       ac->buf_mdct + 512, 448 * sizeof(*saved_ltp));
2743cabdff1aSopenharmony_ci        memset(saved_ltp + 576, 0,                  448 * sizeof(*saved_ltp));
2744cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct + 960,     &swindow[64],      64);
2745cabdff1aSopenharmony_ci
2746cabdff1aSopenharmony_ci        for (i = 0; i < 64; i++)
2747cabdff1aSopenharmony_ci            saved_ltp[i + 512] = AAC_MUL31(ac->buf_mdct[1023 - i], swindow[63 - i]);
2748cabdff1aSopenharmony_ci    } else { // LONG_STOP or ONLY_LONG
2749cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul_reverse(saved_ltp,       ac->buf_mdct + 512,     &lwindow[512],     512);
2750cabdff1aSopenharmony_ci
2751cabdff1aSopenharmony_ci        for (i = 0; i < 512; i++)
2752cabdff1aSopenharmony_ci            saved_ltp[i + 512] = AAC_MUL31(ac->buf_mdct[1023 - i], lwindow[511 - i]);
2753cabdff1aSopenharmony_ci    }
2754cabdff1aSopenharmony_ci
2755cabdff1aSopenharmony_ci    memcpy(sce->ltp_state,      sce->ltp_state+1024, 1024 * sizeof(*sce->ltp_state));
2756cabdff1aSopenharmony_ci    memcpy(sce->ltp_state+1024, sce->ret,            1024 * sizeof(*sce->ltp_state));
2757cabdff1aSopenharmony_ci    memcpy(sce->ltp_state+2048, saved_ltp,           1024 * sizeof(*sce->ltp_state));
2758cabdff1aSopenharmony_ci}
2759cabdff1aSopenharmony_ci
2760cabdff1aSopenharmony_ci/**
2761cabdff1aSopenharmony_ci * Conduct IMDCT and windowing.
2762cabdff1aSopenharmony_ci */
2763cabdff1aSopenharmony_cistatic void imdct_and_windowing(AACContext *ac, SingleChannelElement *sce)
2764cabdff1aSopenharmony_ci{
2765cabdff1aSopenharmony_ci    IndividualChannelStream *ics = &sce->ics;
2766cabdff1aSopenharmony_ci    INTFLOAT *in    = sce->coeffs;
2767cabdff1aSopenharmony_ci    INTFLOAT *out   = sce->ret;
2768cabdff1aSopenharmony_ci    INTFLOAT *saved = sce->saved;
2769cabdff1aSopenharmony_ci    const INTFLOAT *swindow      = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128);
2770cabdff1aSopenharmony_ci    const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024);
2771cabdff1aSopenharmony_ci    const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128);
2772cabdff1aSopenharmony_ci    INTFLOAT *buf  = ac->buf_mdct;
2773cabdff1aSopenharmony_ci    INTFLOAT *temp = ac->temp;
2774cabdff1aSopenharmony_ci    int i;
2775cabdff1aSopenharmony_ci
2776cabdff1aSopenharmony_ci    // imdct
2777cabdff1aSopenharmony_ci    if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
2778cabdff1aSopenharmony_ci        for (i = 0; i < 1024; i += 128)
2779cabdff1aSopenharmony_ci            ac->mdct_small.imdct_half(&ac->mdct_small, buf + i, in + i);
2780cabdff1aSopenharmony_ci    } else {
2781cabdff1aSopenharmony_ci        ac->mdct.imdct_half(&ac->mdct, buf, in);
2782cabdff1aSopenharmony_ci#if USE_FIXED
2783cabdff1aSopenharmony_ci        for (i=0; i<1024; i++)
2784cabdff1aSopenharmony_ci          buf[i] = (buf[i] + 4LL) >> 3;
2785cabdff1aSopenharmony_ci#endif /* USE_FIXED */
2786cabdff1aSopenharmony_ci    }
2787cabdff1aSopenharmony_ci
2788cabdff1aSopenharmony_ci    /* window overlapping
2789cabdff1aSopenharmony_ci     * NOTE: To simplify the overlapping code, all 'meaningless' short to long
2790cabdff1aSopenharmony_ci     * and long to short transitions are considered to be short to short
2791cabdff1aSopenharmony_ci     * transitions. This leaves just two cases (long to long and short to short)
2792cabdff1aSopenharmony_ci     * with a little special sauce for EIGHT_SHORT_SEQUENCE.
2793cabdff1aSopenharmony_ci     */
2794cabdff1aSopenharmony_ci    if ((ics->window_sequence[1] == ONLY_LONG_SEQUENCE || ics->window_sequence[1] == LONG_STOP_SEQUENCE) &&
2795cabdff1aSopenharmony_ci            (ics->window_sequence[0] == ONLY_LONG_SEQUENCE || ics->window_sequence[0] == LONG_START_SEQUENCE)) {
2796cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul_window(    out,               saved,            buf,         lwindow_prev, 512);
2797cabdff1aSopenharmony_ci    } else {
2798cabdff1aSopenharmony_ci        memcpy(                         out,               saved,            448 * sizeof(*out));
2799cabdff1aSopenharmony_ci
2800cabdff1aSopenharmony_ci        if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
2801cabdff1aSopenharmony_ci            ac->fdsp->vector_fmul_window(out + 448 + 0*128, saved + 448,      buf + 0*128, swindow_prev, 64);
2802cabdff1aSopenharmony_ci            ac->fdsp->vector_fmul_window(out + 448 + 1*128, buf + 0*128 + 64, buf + 1*128, swindow,      64);
2803cabdff1aSopenharmony_ci            ac->fdsp->vector_fmul_window(out + 448 + 2*128, buf + 1*128 + 64, buf + 2*128, swindow,      64);
2804cabdff1aSopenharmony_ci            ac->fdsp->vector_fmul_window(out + 448 + 3*128, buf + 2*128 + 64, buf + 3*128, swindow,      64);
2805cabdff1aSopenharmony_ci            ac->fdsp->vector_fmul_window(temp,              buf + 3*128 + 64, buf + 4*128, swindow,      64);
2806cabdff1aSopenharmony_ci            memcpy(                     out + 448 + 4*128, temp, 64 * sizeof(*out));
2807cabdff1aSopenharmony_ci        } else {
2808cabdff1aSopenharmony_ci            ac->fdsp->vector_fmul_window(out + 448,         saved + 448,      buf,         swindow_prev, 64);
2809cabdff1aSopenharmony_ci            memcpy(                     out + 576,         buf + 64,         448 * sizeof(*out));
2810cabdff1aSopenharmony_ci        }
2811cabdff1aSopenharmony_ci    }
2812cabdff1aSopenharmony_ci
2813cabdff1aSopenharmony_ci    // buffer update
2814cabdff1aSopenharmony_ci    if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
2815cabdff1aSopenharmony_ci        memcpy(                     saved,       temp + 64,         64 * sizeof(*saved));
2816cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul_window(saved + 64,  buf + 4*128 + 64, buf + 5*128, swindow, 64);
2817cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul_window(saved + 192, buf + 5*128 + 64, buf + 6*128, swindow, 64);
2818cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul_window(saved + 320, buf + 6*128 + 64, buf + 7*128, swindow, 64);
2819cabdff1aSopenharmony_ci        memcpy(                     saved + 448, buf + 7*128 + 64,  64 * sizeof(*saved));
2820cabdff1aSopenharmony_ci    } else if (ics->window_sequence[0] == LONG_START_SEQUENCE) {
2821cabdff1aSopenharmony_ci        memcpy(                     saved,       buf + 512,        448 * sizeof(*saved));
2822cabdff1aSopenharmony_ci        memcpy(                     saved + 448, buf + 7*128 + 64,  64 * sizeof(*saved));
2823cabdff1aSopenharmony_ci    } else { // LONG_STOP or ONLY_LONG
2824cabdff1aSopenharmony_ci        memcpy(                     saved,       buf + 512,        512 * sizeof(*saved));
2825cabdff1aSopenharmony_ci    }
2826cabdff1aSopenharmony_ci}
2827cabdff1aSopenharmony_ci
2828cabdff1aSopenharmony_ci/**
2829cabdff1aSopenharmony_ci * Conduct IMDCT and windowing.
2830cabdff1aSopenharmony_ci */
2831cabdff1aSopenharmony_cistatic void imdct_and_windowing_960(AACContext *ac, SingleChannelElement *sce)
2832cabdff1aSopenharmony_ci{
2833cabdff1aSopenharmony_ci#if !USE_FIXED
2834cabdff1aSopenharmony_ci    IndividualChannelStream *ics = &sce->ics;
2835cabdff1aSopenharmony_ci    INTFLOAT *in    = sce->coeffs;
2836cabdff1aSopenharmony_ci    INTFLOAT *out   = sce->ret;
2837cabdff1aSopenharmony_ci    INTFLOAT *saved = sce->saved;
2838cabdff1aSopenharmony_ci    const INTFLOAT *swindow      = ics->use_kb_window[0] ? AAC_RENAME(aac_kbd_short_120) : AAC_RENAME(sine_120);
2839cabdff1aSopenharmony_ci    const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME(aac_kbd_long_960) : AAC_RENAME(sine_960);
2840cabdff1aSopenharmony_ci    const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME(aac_kbd_short_120) : AAC_RENAME(sine_120);
2841cabdff1aSopenharmony_ci    INTFLOAT *buf  = ac->buf_mdct;
2842cabdff1aSopenharmony_ci    INTFLOAT *temp = ac->temp;
2843cabdff1aSopenharmony_ci    int i;
2844cabdff1aSopenharmony_ci
2845cabdff1aSopenharmony_ci    // imdct
2846cabdff1aSopenharmony_ci    if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
2847cabdff1aSopenharmony_ci        for (i = 0; i < 8; i++)
2848cabdff1aSopenharmony_ci            ac->mdct120->imdct_half(ac->mdct120, buf + i * 120, in + i * 128, 1);
2849cabdff1aSopenharmony_ci    } else {
2850cabdff1aSopenharmony_ci        ac->mdct960->imdct_half(ac->mdct960, buf, in, 1);
2851cabdff1aSopenharmony_ci    }
2852cabdff1aSopenharmony_ci
2853cabdff1aSopenharmony_ci    /* window overlapping
2854cabdff1aSopenharmony_ci     * NOTE: To simplify the overlapping code, all 'meaningless' short to long
2855cabdff1aSopenharmony_ci     * and long to short transitions are considered to be short to short
2856cabdff1aSopenharmony_ci     * transitions. This leaves just two cases (long to long and short to short)
2857cabdff1aSopenharmony_ci     * with a little special sauce for EIGHT_SHORT_SEQUENCE.
2858cabdff1aSopenharmony_ci     */
2859cabdff1aSopenharmony_ci
2860cabdff1aSopenharmony_ci    if ((ics->window_sequence[1] == ONLY_LONG_SEQUENCE || ics->window_sequence[1] == LONG_STOP_SEQUENCE) &&
2861cabdff1aSopenharmony_ci        (ics->window_sequence[0] == ONLY_LONG_SEQUENCE || ics->window_sequence[0] == LONG_START_SEQUENCE)) {
2862cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul_window(    out,               saved,            buf,         lwindow_prev, 480);
2863cabdff1aSopenharmony_ci    } else {
2864cabdff1aSopenharmony_ci        memcpy(                          out,               saved,            420 * sizeof(*out));
2865cabdff1aSopenharmony_ci
2866cabdff1aSopenharmony_ci        if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
2867cabdff1aSopenharmony_ci            ac->fdsp->vector_fmul_window(out + 420 + 0*120, saved + 420,      buf + 0*120, swindow_prev, 60);
2868cabdff1aSopenharmony_ci            ac->fdsp->vector_fmul_window(out + 420 + 1*120, buf + 0*120 + 60, buf + 1*120, swindow,      60);
2869cabdff1aSopenharmony_ci            ac->fdsp->vector_fmul_window(out + 420 + 2*120, buf + 1*120 + 60, buf + 2*120, swindow,      60);
2870cabdff1aSopenharmony_ci            ac->fdsp->vector_fmul_window(out + 420 + 3*120, buf + 2*120 + 60, buf + 3*120, swindow,      60);
2871cabdff1aSopenharmony_ci            ac->fdsp->vector_fmul_window(temp,              buf + 3*120 + 60, buf + 4*120, swindow,      60);
2872cabdff1aSopenharmony_ci            memcpy(                      out + 420 + 4*120, temp, 60 * sizeof(*out));
2873cabdff1aSopenharmony_ci        } else {
2874cabdff1aSopenharmony_ci            ac->fdsp->vector_fmul_window(out + 420,         saved + 420,      buf,         swindow_prev, 60);
2875cabdff1aSopenharmony_ci            memcpy(                      out + 540,         buf + 60,         420 * sizeof(*out));
2876cabdff1aSopenharmony_ci        }
2877cabdff1aSopenharmony_ci    }
2878cabdff1aSopenharmony_ci
2879cabdff1aSopenharmony_ci    // buffer update
2880cabdff1aSopenharmony_ci    if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
2881cabdff1aSopenharmony_ci        memcpy(                      saved,       temp + 60,         60 * sizeof(*saved));
2882cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul_window(saved + 60,  buf + 4*120 + 60, buf + 5*120, swindow, 60);
2883cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul_window(saved + 180, buf + 5*120 + 60, buf + 6*120, swindow, 60);
2884cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul_window(saved + 300, buf + 6*120 + 60, buf + 7*120, swindow, 60);
2885cabdff1aSopenharmony_ci        memcpy(                      saved + 420, buf + 7*120 + 60,  60 * sizeof(*saved));
2886cabdff1aSopenharmony_ci    } else if (ics->window_sequence[0] == LONG_START_SEQUENCE) {
2887cabdff1aSopenharmony_ci        memcpy(                      saved,       buf + 480,        420 * sizeof(*saved));
2888cabdff1aSopenharmony_ci        memcpy(                      saved + 420, buf + 7*120 + 60,  60 * sizeof(*saved));
2889cabdff1aSopenharmony_ci    } else { // LONG_STOP or ONLY_LONG
2890cabdff1aSopenharmony_ci        memcpy(                      saved,       buf + 480,        480 * sizeof(*saved));
2891cabdff1aSopenharmony_ci    }
2892cabdff1aSopenharmony_ci#endif
2893cabdff1aSopenharmony_ci}
2894cabdff1aSopenharmony_cistatic void imdct_and_windowing_ld(AACContext *ac, SingleChannelElement *sce)
2895cabdff1aSopenharmony_ci{
2896cabdff1aSopenharmony_ci    IndividualChannelStream *ics = &sce->ics;
2897cabdff1aSopenharmony_ci    INTFLOAT *in    = sce->coeffs;
2898cabdff1aSopenharmony_ci    INTFLOAT *out   = sce->ret;
2899cabdff1aSopenharmony_ci    INTFLOAT *saved = sce->saved;
2900cabdff1aSopenharmony_ci    INTFLOAT *buf  = ac->buf_mdct;
2901cabdff1aSopenharmony_ci#if USE_FIXED
2902cabdff1aSopenharmony_ci    int i;
2903cabdff1aSopenharmony_ci#endif /* USE_FIXED */
2904cabdff1aSopenharmony_ci
2905cabdff1aSopenharmony_ci    // imdct
2906cabdff1aSopenharmony_ci    ac->mdct.imdct_half(&ac->mdct_ld, buf, in);
2907cabdff1aSopenharmony_ci
2908cabdff1aSopenharmony_ci#if USE_FIXED
2909cabdff1aSopenharmony_ci    for (i = 0; i < 1024; i++)
2910cabdff1aSopenharmony_ci        buf[i] = (buf[i] + 2) >> 2;
2911cabdff1aSopenharmony_ci#endif /* USE_FIXED */
2912cabdff1aSopenharmony_ci
2913cabdff1aSopenharmony_ci    // window overlapping
2914cabdff1aSopenharmony_ci    if (ics->use_kb_window[1]) {
2915cabdff1aSopenharmony_ci        // AAC LD uses a low overlap sine window instead of a KBD window
2916cabdff1aSopenharmony_ci        memcpy(out, saved, 192 * sizeof(*out));
2917cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul_window(out + 192, saved + 192, buf, AAC_RENAME2(sine_128), 64);
2918cabdff1aSopenharmony_ci        memcpy(                     out + 320, buf + 64, 192 * sizeof(*out));
2919cabdff1aSopenharmony_ci    } else {
2920cabdff1aSopenharmony_ci        ac->fdsp->vector_fmul_window(out, saved, buf, AAC_RENAME2(sine_512), 256);
2921cabdff1aSopenharmony_ci    }
2922cabdff1aSopenharmony_ci
2923cabdff1aSopenharmony_ci    // buffer update
2924cabdff1aSopenharmony_ci    memcpy(saved, buf + 256, 256 * sizeof(*saved));
2925cabdff1aSopenharmony_ci}
2926cabdff1aSopenharmony_ci
2927cabdff1aSopenharmony_cistatic void imdct_and_windowing_eld(AACContext *ac, SingleChannelElement *sce)
2928cabdff1aSopenharmony_ci{
2929cabdff1aSopenharmony_ci    UINTFLOAT *in   = sce->coeffs;
2930cabdff1aSopenharmony_ci    INTFLOAT *out   = sce->ret;
2931cabdff1aSopenharmony_ci    INTFLOAT *saved = sce->saved;
2932cabdff1aSopenharmony_ci    INTFLOAT *buf  = ac->buf_mdct;
2933cabdff1aSopenharmony_ci    int i;
2934cabdff1aSopenharmony_ci    const int n  = ac->oc[1].m4ac.frame_length_short ? 480 : 512;
2935cabdff1aSopenharmony_ci    const int n2 = n >> 1;
2936cabdff1aSopenharmony_ci    const int n4 = n >> 2;
2937cabdff1aSopenharmony_ci    const INTFLOAT *const window = n == 480 ? AAC_RENAME(ff_aac_eld_window_480) :
2938cabdff1aSopenharmony_ci                                           AAC_RENAME(ff_aac_eld_window_512);
2939cabdff1aSopenharmony_ci
2940cabdff1aSopenharmony_ci    // Inverse transform, mapped to the conventional IMDCT by
2941cabdff1aSopenharmony_ci    // Chivukula, R.K.; Reznik, Y.A.; Devarajan, V.,
2942cabdff1aSopenharmony_ci    // "Efficient algorithms for MPEG-4 AAC-ELD, AAC-LD and AAC-LC filterbanks,"
2943cabdff1aSopenharmony_ci    // International Conference on Audio, Language and Image Processing, ICALIP 2008.
2944cabdff1aSopenharmony_ci    // URL: http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=4590245&isnumber=4589950
2945cabdff1aSopenharmony_ci    for (i = 0; i < n2; i+=2) {
2946cabdff1aSopenharmony_ci        INTFLOAT temp;
2947cabdff1aSopenharmony_ci        temp =  in[i    ]; in[i    ] = -in[n - 1 - i]; in[n - 1 - i] = temp;
2948cabdff1aSopenharmony_ci        temp = -in[i + 1]; in[i + 1] =  in[n - 2 - i]; in[n - 2 - i] = temp;
2949cabdff1aSopenharmony_ci    }
2950cabdff1aSopenharmony_ci#if !USE_FIXED
2951cabdff1aSopenharmony_ci    if (n == 480)
2952cabdff1aSopenharmony_ci        ac->mdct480->imdct_half(ac->mdct480, buf, in, 1);
2953cabdff1aSopenharmony_ci    else
2954cabdff1aSopenharmony_ci#endif
2955cabdff1aSopenharmony_ci        ac->mdct.imdct_half(&ac->mdct_ld, buf, in);
2956cabdff1aSopenharmony_ci
2957cabdff1aSopenharmony_ci#if USE_FIXED
2958cabdff1aSopenharmony_ci    for (i = 0; i < 1024; i++)
2959cabdff1aSopenharmony_ci      buf[i] = (buf[i] + 1) >> 1;
2960cabdff1aSopenharmony_ci#endif /* USE_FIXED */
2961cabdff1aSopenharmony_ci
2962cabdff1aSopenharmony_ci    for (i = 0; i < n; i+=2) {
2963cabdff1aSopenharmony_ci        buf[i] = -buf[i];
2964cabdff1aSopenharmony_ci    }
2965cabdff1aSopenharmony_ci    // Like with the regular IMDCT at this point we still have the middle half
2966cabdff1aSopenharmony_ci    // of a transform but with even symmetry on the left and odd symmetry on
2967cabdff1aSopenharmony_ci    // the right
2968cabdff1aSopenharmony_ci
2969cabdff1aSopenharmony_ci    // window overlapping
2970cabdff1aSopenharmony_ci    // The spec says to use samples [0..511] but the reference decoder uses
2971cabdff1aSopenharmony_ci    // samples [128..639].
2972cabdff1aSopenharmony_ci    for (i = n4; i < n2; i ++) {
2973cabdff1aSopenharmony_ci        out[i - n4] = AAC_MUL31(   buf[    n2 - 1 - i] , window[i       - n4]) +
2974cabdff1aSopenharmony_ci                      AAC_MUL31( saved[        i + n2] , window[i +   n - n4]) +
2975cabdff1aSopenharmony_ci                      AAC_MUL31(-saved[n + n2 - 1 - i] , window[i + 2*n - n4]) +
2976cabdff1aSopenharmony_ci                      AAC_MUL31(-saved[  2*n + n2 + i] , window[i + 3*n - n4]);
2977cabdff1aSopenharmony_ci    }
2978cabdff1aSopenharmony_ci    for (i = 0; i < n2; i ++) {
2979cabdff1aSopenharmony_ci        out[n4 + i] = AAC_MUL31(   buf[              i] , window[i + n2       - n4]) +
2980cabdff1aSopenharmony_ci                      AAC_MUL31(-saved[      n - 1 - i] , window[i + n2 +   n - n4]) +
2981cabdff1aSopenharmony_ci                      AAC_MUL31(-saved[          n + i] , window[i + n2 + 2*n - n4]) +
2982cabdff1aSopenharmony_ci                      AAC_MUL31( saved[2*n + n - 1 - i] , window[i + n2 + 3*n - n4]);
2983cabdff1aSopenharmony_ci    }
2984cabdff1aSopenharmony_ci    for (i = 0; i < n4; i ++) {
2985cabdff1aSopenharmony_ci        out[n2 + n4 + i] = AAC_MUL31(   buf[    i + n2] , window[i +   n - n4]) +
2986cabdff1aSopenharmony_ci                           AAC_MUL31(-saved[n2 - 1 - i] , window[i + 2*n - n4]) +
2987cabdff1aSopenharmony_ci                           AAC_MUL31(-saved[n + n2 + i] , window[i + 3*n - n4]);
2988cabdff1aSopenharmony_ci    }
2989cabdff1aSopenharmony_ci
2990cabdff1aSopenharmony_ci    // buffer update
2991cabdff1aSopenharmony_ci    memmove(saved + n, saved, 2 * n * sizeof(*saved));
2992cabdff1aSopenharmony_ci    memcpy( saved,       buf,     n * sizeof(*saved));
2993cabdff1aSopenharmony_ci}
2994cabdff1aSopenharmony_ci
2995cabdff1aSopenharmony_ci/**
2996cabdff1aSopenharmony_ci * channel coupling transformation interface
2997cabdff1aSopenharmony_ci *
2998cabdff1aSopenharmony_ci * @param   apply_coupling_method   pointer to (in)dependent coupling function
2999cabdff1aSopenharmony_ci */
3000cabdff1aSopenharmony_cistatic void apply_channel_coupling(AACContext *ac, ChannelElement *cc,
3001cabdff1aSopenharmony_ci                                   enum RawDataBlockType type, int elem_id,
3002cabdff1aSopenharmony_ci                                   enum CouplingPoint coupling_point,
3003cabdff1aSopenharmony_ci                                   void (*apply_coupling_method)(AACContext *ac, SingleChannelElement *target, ChannelElement *cce, int index))
3004cabdff1aSopenharmony_ci{
3005cabdff1aSopenharmony_ci    int i, c;
3006cabdff1aSopenharmony_ci
3007cabdff1aSopenharmony_ci    for (i = 0; i < MAX_ELEM_ID; i++) {
3008cabdff1aSopenharmony_ci        ChannelElement *cce = ac->che[TYPE_CCE][i];
3009cabdff1aSopenharmony_ci        int index = 0;
3010cabdff1aSopenharmony_ci
3011cabdff1aSopenharmony_ci        if (cce && cce->coup.coupling_point == coupling_point) {
3012cabdff1aSopenharmony_ci            ChannelCoupling *coup = &cce->coup;
3013cabdff1aSopenharmony_ci
3014cabdff1aSopenharmony_ci            for (c = 0; c <= coup->num_coupled; c++) {
3015cabdff1aSopenharmony_ci                if (coup->type[c] == type && coup->id_select[c] == elem_id) {
3016cabdff1aSopenharmony_ci                    if (coup->ch_select[c] != 1) {
3017cabdff1aSopenharmony_ci                        apply_coupling_method(ac, &cc->ch[0], cce, index);
3018cabdff1aSopenharmony_ci                        if (coup->ch_select[c] != 0)
3019cabdff1aSopenharmony_ci                            index++;
3020cabdff1aSopenharmony_ci                    }
3021cabdff1aSopenharmony_ci                    if (coup->ch_select[c] != 2)
3022cabdff1aSopenharmony_ci                        apply_coupling_method(ac, &cc->ch[1], cce, index++);
3023cabdff1aSopenharmony_ci                } else
3024cabdff1aSopenharmony_ci                    index += 1 + (coup->ch_select[c] == 3);
3025cabdff1aSopenharmony_ci            }
3026cabdff1aSopenharmony_ci        }
3027cabdff1aSopenharmony_ci    }
3028cabdff1aSopenharmony_ci}
3029cabdff1aSopenharmony_ci
3030cabdff1aSopenharmony_ci/**
3031cabdff1aSopenharmony_ci * Convert spectral data to samples, applying all supported tools as appropriate.
3032cabdff1aSopenharmony_ci */
3033cabdff1aSopenharmony_cistatic void spectral_to_sample(AACContext *ac, int samples)
3034cabdff1aSopenharmony_ci{
3035cabdff1aSopenharmony_ci    int i, type;
3036cabdff1aSopenharmony_ci    void (*imdct_and_window)(AACContext *ac, SingleChannelElement *sce);
3037cabdff1aSopenharmony_ci    switch (ac->oc[1].m4ac.object_type) {
3038cabdff1aSopenharmony_ci    case AOT_ER_AAC_LD:
3039cabdff1aSopenharmony_ci        imdct_and_window = imdct_and_windowing_ld;
3040cabdff1aSopenharmony_ci        break;
3041cabdff1aSopenharmony_ci    case AOT_ER_AAC_ELD:
3042cabdff1aSopenharmony_ci        imdct_and_window = imdct_and_windowing_eld;
3043cabdff1aSopenharmony_ci        break;
3044cabdff1aSopenharmony_ci    default:
3045cabdff1aSopenharmony_ci        if (ac->oc[1].m4ac.frame_length_short)
3046cabdff1aSopenharmony_ci            imdct_and_window = imdct_and_windowing_960;
3047cabdff1aSopenharmony_ci        else
3048cabdff1aSopenharmony_ci            imdct_and_window = ac->imdct_and_windowing;
3049cabdff1aSopenharmony_ci    }
3050cabdff1aSopenharmony_ci    for (type = 3; type >= 0; type--) {
3051cabdff1aSopenharmony_ci        for (i = 0; i < MAX_ELEM_ID; i++) {
3052cabdff1aSopenharmony_ci            ChannelElement *che = ac->che[type][i];
3053cabdff1aSopenharmony_ci            if (che && che->present) {
3054cabdff1aSopenharmony_ci                if (type <= TYPE_CPE)
3055cabdff1aSopenharmony_ci                    apply_channel_coupling(ac, che, type, i, BEFORE_TNS, AAC_RENAME(apply_dependent_coupling));
3056cabdff1aSopenharmony_ci                if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP) {
3057cabdff1aSopenharmony_ci                    if (che->ch[0].ics.predictor_present) {
3058cabdff1aSopenharmony_ci                        if (che->ch[0].ics.ltp.present)
3059cabdff1aSopenharmony_ci                            ac->apply_ltp(ac, &che->ch[0]);
3060cabdff1aSopenharmony_ci                        if (che->ch[1].ics.ltp.present && type == TYPE_CPE)
3061cabdff1aSopenharmony_ci                            ac->apply_ltp(ac, &che->ch[1]);
3062cabdff1aSopenharmony_ci                    }
3063cabdff1aSopenharmony_ci                }
3064cabdff1aSopenharmony_ci                if (che->ch[0].tns.present)
3065cabdff1aSopenharmony_ci                    ac->apply_tns(che->ch[0].coeffs, &che->ch[0].tns, &che->ch[0].ics, 1);
3066cabdff1aSopenharmony_ci                if (che->ch[1].tns.present)
3067cabdff1aSopenharmony_ci                    ac->apply_tns(che->ch[1].coeffs, &che->ch[1].tns, &che->ch[1].ics, 1);
3068cabdff1aSopenharmony_ci                if (type <= TYPE_CPE)
3069cabdff1aSopenharmony_ci                    apply_channel_coupling(ac, che, type, i, BETWEEN_TNS_AND_IMDCT, AAC_RENAME(apply_dependent_coupling));
3070cabdff1aSopenharmony_ci                if (type != TYPE_CCE || che->coup.coupling_point == AFTER_IMDCT) {
3071cabdff1aSopenharmony_ci                    imdct_and_window(ac, &che->ch[0]);
3072cabdff1aSopenharmony_ci                    if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP)
3073cabdff1aSopenharmony_ci                        ac->update_ltp(ac, &che->ch[0]);
3074cabdff1aSopenharmony_ci                    if (type == TYPE_CPE) {
3075cabdff1aSopenharmony_ci                        imdct_and_window(ac, &che->ch[1]);
3076cabdff1aSopenharmony_ci                        if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP)
3077cabdff1aSopenharmony_ci                            ac->update_ltp(ac, &che->ch[1]);
3078cabdff1aSopenharmony_ci                    }
3079cabdff1aSopenharmony_ci                    if (ac->oc[1].m4ac.sbr > 0) {
3080cabdff1aSopenharmony_ci                        AAC_RENAME(ff_sbr_apply)(ac, &che->sbr, type, che->ch[0].ret, che->ch[1].ret);
3081cabdff1aSopenharmony_ci                    }
3082cabdff1aSopenharmony_ci                }
3083cabdff1aSopenharmony_ci                if (type <= TYPE_CCE)
3084cabdff1aSopenharmony_ci                    apply_channel_coupling(ac, che, type, i, AFTER_IMDCT, AAC_RENAME(apply_independent_coupling));
3085cabdff1aSopenharmony_ci
3086cabdff1aSopenharmony_ci#if USE_FIXED
3087cabdff1aSopenharmony_ci                {
3088cabdff1aSopenharmony_ci                    int j;
3089cabdff1aSopenharmony_ci                    /* preparation for resampler */
3090cabdff1aSopenharmony_ci                    for(j = 0; j<samples; j++){
3091cabdff1aSopenharmony_ci                        che->ch[0].ret[j] = (int32_t)av_clip64((int64_t)che->ch[0].ret[j]*128, INT32_MIN, INT32_MAX-0x8000)+0x8000;
3092cabdff1aSopenharmony_ci                        if(type == TYPE_CPE)
3093cabdff1aSopenharmony_ci                            che->ch[1].ret[j] = (int32_t)av_clip64((int64_t)che->ch[1].ret[j]*128, INT32_MIN, INT32_MAX-0x8000)+0x8000;
3094cabdff1aSopenharmony_ci                    }
3095cabdff1aSopenharmony_ci                }
3096cabdff1aSopenharmony_ci#endif /* USE_FIXED */
3097cabdff1aSopenharmony_ci                che->present = 0;
3098cabdff1aSopenharmony_ci            } else if (che) {
3099cabdff1aSopenharmony_ci                av_log(ac->avctx, AV_LOG_VERBOSE, "ChannelElement %d.%d missing \n", type, i);
3100cabdff1aSopenharmony_ci            }
3101cabdff1aSopenharmony_ci        }
3102cabdff1aSopenharmony_ci    }
3103cabdff1aSopenharmony_ci}
3104cabdff1aSopenharmony_ci
3105cabdff1aSopenharmony_cistatic int parse_adts_frame_header(AACContext *ac, GetBitContext *gb)
3106cabdff1aSopenharmony_ci{
3107cabdff1aSopenharmony_ci    int size;
3108cabdff1aSopenharmony_ci    AACADTSHeaderInfo hdr_info;
3109cabdff1aSopenharmony_ci    uint8_t layout_map[MAX_ELEM_ID*4][3];
3110cabdff1aSopenharmony_ci    int layout_map_tags, ret;
3111cabdff1aSopenharmony_ci
3112cabdff1aSopenharmony_ci    size = ff_adts_header_parse(gb, &hdr_info);
3113cabdff1aSopenharmony_ci    if (size > 0) {
3114cabdff1aSopenharmony_ci        if (!ac->warned_num_aac_frames && hdr_info.num_aac_frames != 1) {
3115cabdff1aSopenharmony_ci            // This is 2 for "VLB " audio in NSV files.
3116cabdff1aSopenharmony_ci            // See samples/nsv/vlb_audio.
3117cabdff1aSopenharmony_ci            avpriv_report_missing_feature(ac->avctx,
3118cabdff1aSopenharmony_ci                                          "More than one AAC RDB per ADTS frame");
3119cabdff1aSopenharmony_ci            ac->warned_num_aac_frames = 1;
3120cabdff1aSopenharmony_ci        }
3121cabdff1aSopenharmony_ci        push_output_configuration(ac);
3122cabdff1aSopenharmony_ci        if (hdr_info.chan_config) {
3123cabdff1aSopenharmony_ci            ac->oc[1].m4ac.chan_config = hdr_info.chan_config;
3124cabdff1aSopenharmony_ci            if ((ret = set_default_channel_config(ac, ac->avctx,
3125cabdff1aSopenharmony_ci                                                  layout_map,
3126cabdff1aSopenharmony_ci                                                  &layout_map_tags,
3127cabdff1aSopenharmony_ci                                                  hdr_info.chan_config)) < 0)
3128cabdff1aSopenharmony_ci                return ret;
3129cabdff1aSopenharmony_ci            if ((ret = output_configure(ac, layout_map, layout_map_tags,
3130cabdff1aSopenharmony_ci                                        FFMAX(ac->oc[1].status,
3131cabdff1aSopenharmony_ci                                              OC_TRIAL_FRAME), 0)) < 0)
3132cabdff1aSopenharmony_ci                return ret;
3133cabdff1aSopenharmony_ci        } else {
3134cabdff1aSopenharmony_ci            ac->oc[1].m4ac.chan_config = 0;
3135cabdff1aSopenharmony_ci            /**
3136cabdff1aSopenharmony_ci             * dual mono frames in Japanese DTV can have chan_config 0
3137cabdff1aSopenharmony_ci             * WITHOUT specifying PCE.
3138cabdff1aSopenharmony_ci             *  thus, set dual mono as default.
3139cabdff1aSopenharmony_ci             */
3140cabdff1aSopenharmony_ci            if (ac->dmono_mode && ac->oc[0].status == OC_NONE) {
3141cabdff1aSopenharmony_ci                layout_map_tags = 2;
3142cabdff1aSopenharmony_ci                layout_map[0][0] = layout_map[1][0] = TYPE_SCE;
3143cabdff1aSopenharmony_ci                layout_map[0][2] = layout_map[1][2] = AAC_CHANNEL_FRONT;
3144cabdff1aSopenharmony_ci                layout_map[0][1] = 0;
3145cabdff1aSopenharmony_ci                layout_map[1][1] = 1;
3146cabdff1aSopenharmony_ci                if (output_configure(ac, layout_map, layout_map_tags,
3147cabdff1aSopenharmony_ci                                     OC_TRIAL_FRAME, 0))
3148cabdff1aSopenharmony_ci                    return -7;
3149cabdff1aSopenharmony_ci            }
3150cabdff1aSopenharmony_ci        }
3151cabdff1aSopenharmony_ci        ac->oc[1].m4ac.sample_rate     = hdr_info.sample_rate;
3152cabdff1aSopenharmony_ci        ac->oc[1].m4ac.sampling_index  = hdr_info.sampling_index;
3153cabdff1aSopenharmony_ci        ac->oc[1].m4ac.object_type     = hdr_info.object_type;
3154cabdff1aSopenharmony_ci        ac->oc[1].m4ac.frame_length_short = 0;
3155cabdff1aSopenharmony_ci        if (ac->oc[0].status != OC_LOCKED ||
3156cabdff1aSopenharmony_ci            ac->oc[0].m4ac.chan_config != hdr_info.chan_config ||
3157cabdff1aSopenharmony_ci            ac->oc[0].m4ac.sample_rate != hdr_info.sample_rate) {
3158cabdff1aSopenharmony_ci            ac->oc[1].m4ac.sbr = -1;
3159cabdff1aSopenharmony_ci            ac->oc[1].m4ac.ps  = -1;
3160cabdff1aSopenharmony_ci        }
3161cabdff1aSopenharmony_ci        if (!hdr_info.crc_absent)
3162cabdff1aSopenharmony_ci            skip_bits(gb, 16);
3163cabdff1aSopenharmony_ci    }
3164cabdff1aSopenharmony_ci    return size;
3165cabdff1aSopenharmony_ci}
3166cabdff1aSopenharmony_ci
3167cabdff1aSopenharmony_cistatic int aac_decode_er_frame(AVCodecContext *avctx, void *data,
3168cabdff1aSopenharmony_ci                               int *got_frame_ptr, GetBitContext *gb)
3169cabdff1aSopenharmony_ci{
3170cabdff1aSopenharmony_ci    AACContext *ac = avctx->priv_data;
3171cabdff1aSopenharmony_ci    const MPEG4AudioConfig *const m4ac = &ac->oc[1].m4ac;
3172cabdff1aSopenharmony_ci    ChannelElement *che;
3173cabdff1aSopenharmony_ci    int err, i;
3174cabdff1aSopenharmony_ci    int samples = m4ac->frame_length_short ? 960 : 1024;
3175cabdff1aSopenharmony_ci    int chan_config = m4ac->chan_config;
3176cabdff1aSopenharmony_ci    int aot = m4ac->object_type;
3177cabdff1aSopenharmony_ci
3178cabdff1aSopenharmony_ci    if (aot == AOT_ER_AAC_LD || aot == AOT_ER_AAC_ELD)
3179cabdff1aSopenharmony_ci        samples >>= 1;
3180cabdff1aSopenharmony_ci
3181cabdff1aSopenharmony_ci    ac->frame = data;
3182cabdff1aSopenharmony_ci
3183cabdff1aSopenharmony_ci    if ((err = frame_configure_elements(avctx)) < 0)
3184cabdff1aSopenharmony_ci        return err;
3185cabdff1aSopenharmony_ci
3186cabdff1aSopenharmony_ci    // The FF_PROFILE_AAC_* defines are all object_type - 1
3187cabdff1aSopenharmony_ci    // This may lead to an undefined profile being signaled
3188cabdff1aSopenharmony_ci    ac->avctx->profile = aot - 1;
3189cabdff1aSopenharmony_ci
3190cabdff1aSopenharmony_ci    ac->tags_mapped = 0;
3191cabdff1aSopenharmony_ci
3192cabdff1aSopenharmony_ci    if (chan_config < 0 || (chan_config >= 8 && chan_config < 11) || chan_config >= 13) {
3193cabdff1aSopenharmony_ci        avpriv_request_sample(avctx, "Unknown ER channel configuration %d",
3194cabdff1aSopenharmony_ci                              chan_config);
3195cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
3196cabdff1aSopenharmony_ci    }
3197cabdff1aSopenharmony_ci    for (i = 0; i < tags_per_config[chan_config]; i++) {
3198cabdff1aSopenharmony_ci        const int elem_type = aac_channel_layout_map[chan_config-1][i][0];
3199cabdff1aSopenharmony_ci        const int elem_id   = aac_channel_layout_map[chan_config-1][i][1];
3200cabdff1aSopenharmony_ci        if (!(che=get_che(ac, elem_type, elem_id))) {
3201cabdff1aSopenharmony_ci            av_log(ac->avctx, AV_LOG_ERROR,
3202cabdff1aSopenharmony_ci                   "channel element %d.%d is not allocated\n",
3203cabdff1aSopenharmony_ci                   elem_type, elem_id);
3204cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
3205cabdff1aSopenharmony_ci        }
3206cabdff1aSopenharmony_ci        che->present = 1;
3207cabdff1aSopenharmony_ci        if (aot != AOT_ER_AAC_ELD)
3208cabdff1aSopenharmony_ci            skip_bits(gb, 4);
3209cabdff1aSopenharmony_ci        switch (elem_type) {
3210cabdff1aSopenharmony_ci        case TYPE_SCE:
3211cabdff1aSopenharmony_ci            err = decode_ics(ac, &che->ch[0], gb, 0, 0);
3212cabdff1aSopenharmony_ci            break;
3213cabdff1aSopenharmony_ci        case TYPE_CPE:
3214cabdff1aSopenharmony_ci            err = decode_cpe(ac, gb, che);
3215cabdff1aSopenharmony_ci            break;
3216cabdff1aSopenharmony_ci        case TYPE_LFE:
3217cabdff1aSopenharmony_ci            err = decode_ics(ac, &che->ch[0], gb, 0, 0);
3218cabdff1aSopenharmony_ci            break;
3219cabdff1aSopenharmony_ci        }
3220cabdff1aSopenharmony_ci        if (err < 0)
3221cabdff1aSopenharmony_ci            return err;
3222cabdff1aSopenharmony_ci    }
3223cabdff1aSopenharmony_ci
3224cabdff1aSopenharmony_ci    spectral_to_sample(ac, samples);
3225cabdff1aSopenharmony_ci
3226cabdff1aSopenharmony_ci    if (!ac->frame->data[0] && samples) {
3227cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "no frame data found\n");
3228cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
3229cabdff1aSopenharmony_ci    }
3230cabdff1aSopenharmony_ci
3231cabdff1aSopenharmony_ci    ac->frame->nb_samples = samples;
3232cabdff1aSopenharmony_ci    ac->frame->sample_rate = avctx->sample_rate;
3233cabdff1aSopenharmony_ci    *got_frame_ptr = 1;
3234cabdff1aSopenharmony_ci
3235cabdff1aSopenharmony_ci    skip_bits_long(gb, get_bits_left(gb));
3236cabdff1aSopenharmony_ci    return 0;
3237cabdff1aSopenharmony_ci}
3238cabdff1aSopenharmony_ci
3239cabdff1aSopenharmony_cistatic int aac_decode_frame_int(AVCodecContext *avctx, AVFrame *frame,
3240cabdff1aSopenharmony_ci                                int *got_frame_ptr, GetBitContext *gb,
3241cabdff1aSopenharmony_ci                                const AVPacket *avpkt)
3242cabdff1aSopenharmony_ci{
3243cabdff1aSopenharmony_ci    AACContext *ac = avctx->priv_data;
3244cabdff1aSopenharmony_ci    ChannelElement *che = NULL, *che_prev = NULL;
3245cabdff1aSopenharmony_ci    enum RawDataBlockType elem_type, che_prev_type = TYPE_END;
3246cabdff1aSopenharmony_ci    int err, elem_id;
3247cabdff1aSopenharmony_ci    int samples = 0, multiplier, audio_found = 0, pce_found = 0;
3248cabdff1aSopenharmony_ci    int is_dmono, sce_count = 0;
3249cabdff1aSopenharmony_ci    int payload_alignment;
3250cabdff1aSopenharmony_ci    uint8_t che_presence[4][MAX_ELEM_ID] = {{0}};
3251cabdff1aSopenharmony_ci
3252cabdff1aSopenharmony_ci    ac->frame = frame;
3253cabdff1aSopenharmony_ci
3254cabdff1aSopenharmony_ci    if (show_bits(gb, 12) == 0xfff) {
3255cabdff1aSopenharmony_ci        if ((err = parse_adts_frame_header(ac, gb)) < 0) {
3256cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "Error decoding AAC frame header.\n");
3257cabdff1aSopenharmony_ci            goto fail;
3258cabdff1aSopenharmony_ci        }
3259cabdff1aSopenharmony_ci        if (ac->oc[1].m4ac.sampling_index > 12) {
3260cabdff1aSopenharmony_ci            av_log(ac->avctx, AV_LOG_ERROR, "invalid sampling rate index %d\n", ac->oc[1].m4ac.sampling_index);
3261cabdff1aSopenharmony_ci            err = AVERROR_INVALIDDATA;
3262cabdff1aSopenharmony_ci            goto fail;
3263cabdff1aSopenharmony_ci        }
3264cabdff1aSopenharmony_ci    }
3265cabdff1aSopenharmony_ci
3266cabdff1aSopenharmony_ci    if ((err = frame_configure_elements(avctx)) < 0)
3267cabdff1aSopenharmony_ci        goto fail;
3268cabdff1aSopenharmony_ci
3269cabdff1aSopenharmony_ci    // The FF_PROFILE_AAC_* defines are all object_type - 1
3270cabdff1aSopenharmony_ci    // This may lead to an undefined profile being signaled
3271cabdff1aSopenharmony_ci    ac->avctx->profile = ac->oc[1].m4ac.object_type - 1;
3272cabdff1aSopenharmony_ci
3273cabdff1aSopenharmony_ci    payload_alignment = get_bits_count(gb);
3274cabdff1aSopenharmony_ci    ac->tags_mapped = 0;
3275cabdff1aSopenharmony_ci    // parse
3276cabdff1aSopenharmony_ci    while ((elem_type = get_bits(gb, 3)) != TYPE_END) {
3277cabdff1aSopenharmony_ci        elem_id = get_bits(gb, 4);
3278cabdff1aSopenharmony_ci
3279cabdff1aSopenharmony_ci        if (avctx->debug & FF_DEBUG_STARTCODE)
3280cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_DEBUG, "Elem type:%x id:%x\n", elem_type, elem_id);
3281cabdff1aSopenharmony_ci
3282cabdff1aSopenharmony_ci        if (!avctx->ch_layout.nb_channels && elem_type != TYPE_PCE) {
3283cabdff1aSopenharmony_ci            err = AVERROR_INVALIDDATA;
3284cabdff1aSopenharmony_ci            goto fail;
3285cabdff1aSopenharmony_ci        }
3286cabdff1aSopenharmony_ci
3287cabdff1aSopenharmony_ci        if (elem_type < TYPE_DSE) {
3288cabdff1aSopenharmony_ci            if (che_presence[elem_type][elem_id]) {
3289cabdff1aSopenharmony_ci                int error = che_presence[elem_type][elem_id] > 1;
3290cabdff1aSopenharmony_ci                av_log(ac->avctx, error ? AV_LOG_ERROR : AV_LOG_DEBUG, "channel element %d.%d duplicate\n",
3291cabdff1aSopenharmony_ci                       elem_type, elem_id);
3292cabdff1aSopenharmony_ci                if (error) {
3293cabdff1aSopenharmony_ci                    err = AVERROR_INVALIDDATA;
3294cabdff1aSopenharmony_ci                    goto fail;
3295cabdff1aSopenharmony_ci                }
3296cabdff1aSopenharmony_ci            }
3297cabdff1aSopenharmony_ci            che_presence[elem_type][elem_id]++;
3298cabdff1aSopenharmony_ci
3299cabdff1aSopenharmony_ci            if (!(che=get_che(ac, elem_type, elem_id))) {
3300cabdff1aSopenharmony_ci                av_log(ac->avctx, AV_LOG_ERROR, "channel element %d.%d is not allocated\n",
3301cabdff1aSopenharmony_ci                       elem_type, elem_id);
3302cabdff1aSopenharmony_ci                err = AVERROR_INVALIDDATA;
3303cabdff1aSopenharmony_ci                goto fail;
3304cabdff1aSopenharmony_ci            }
3305cabdff1aSopenharmony_ci            samples = ac->oc[1].m4ac.frame_length_short ? 960 : 1024;
3306cabdff1aSopenharmony_ci            che->present = 1;
3307cabdff1aSopenharmony_ci        }
3308cabdff1aSopenharmony_ci
3309cabdff1aSopenharmony_ci        switch (elem_type) {
3310cabdff1aSopenharmony_ci
3311cabdff1aSopenharmony_ci        case TYPE_SCE:
3312cabdff1aSopenharmony_ci            err = decode_ics(ac, &che->ch[0], gb, 0, 0);
3313cabdff1aSopenharmony_ci            audio_found = 1;
3314cabdff1aSopenharmony_ci            sce_count++;
3315cabdff1aSopenharmony_ci            break;
3316cabdff1aSopenharmony_ci
3317cabdff1aSopenharmony_ci        case TYPE_CPE:
3318cabdff1aSopenharmony_ci            err = decode_cpe(ac, gb, che);
3319cabdff1aSopenharmony_ci            audio_found = 1;
3320cabdff1aSopenharmony_ci            break;
3321cabdff1aSopenharmony_ci
3322cabdff1aSopenharmony_ci        case TYPE_CCE:
3323cabdff1aSopenharmony_ci            err = decode_cce(ac, gb, che);
3324cabdff1aSopenharmony_ci            break;
3325cabdff1aSopenharmony_ci
3326cabdff1aSopenharmony_ci        case TYPE_LFE:
3327cabdff1aSopenharmony_ci            err = decode_ics(ac, &che->ch[0], gb, 0, 0);
3328cabdff1aSopenharmony_ci            audio_found = 1;
3329cabdff1aSopenharmony_ci            break;
3330cabdff1aSopenharmony_ci
3331cabdff1aSopenharmony_ci        case TYPE_DSE:
3332cabdff1aSopenharmony_ci            err = skip_data_stream_element(ac, gb);
3333cabdff1aSopenharmony_ci            break;
3334cabdff1aSopenharmony_ci
3335cabdff1aSopenharmony_ci        case TYPE_PCE: {
3336cabdff1aSopenharmony_ci            uint8_t layout_map[MAX_ELEM_ID*4][3] = {{0}};
3337cabdff1aSopenharmony_ci            int tags;
3338cabdff1aSopenharmony_ci
3339cabdff1aSopenharmony_ci            int pushed = push_output_configuration(ac);
3340cabdff1aSopenharmony_ci            if (pce_found && !pushed) {
3341cabdff1aSopenharmony_ci                err = AVERROR_INVALIDDATA;
3342cabdff1aSopenharmony_ci                goto fail;
3343cabdff1aSopenharmony_ci            }
3344cabdff1aSopenharmony_ci
3345cabdff1aSopenharmony_ci            tags = decode_pce(avctx, &ac->oc[1].m4ac, layout_map, gb,
3346cabdff1aSopenharmony_ci                              payload_alignment);
3347cabdff1aSopenharmony_ci            if (tags < 0) {
3348cabdff1aSopenharmony_ci                err = tags;
3349cabdff1aSopenharmony_ci                break;
3350cabdff1aSopenharmony_ci            }
3351cabdff1aSopenharmony_ci            if (pce_found) {
3352cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR,
3353cabdff1aSopenharmony_ci                       "Not evaluating a further program_config_element as this construct is dubious at best.\n");
3354cabdff1aSopenharmony_ci                pop_output_configuration(ac);
3355cabdff1aSopenharmony_ci            } else {
3356cabdff1aSopenharmony_ci                err = output_configure(ac, layout_map, tags, OC_TRIAL_PCE, 1);
3357cabdff1aSopenharmony_ci                if (!err)
3358cabdff1aSopenharmony_ci                    ac->oc[1].m4ac.chan_config = 0;
3359cabdff1aSopenharmony_ci                pce_found = 1;
3360cabdff1aSopenharmony_ci            }
3361cabdff1aSopenharmony_ci            break;
3362cabdff1aSopenharmony_ci        }
3363cabdff1aSopenharmony_ci
3364cabdff1aSopenharmony_ci        case TYPE_FIL:
3365cabdff1aSopenharmony_ci            if (elem_id == 15)
3366cabdff1aSopenharmony_ci                elem_id += get_bits(gb, 8) - 1;
3367cabdff1aSopenharmony_ci            if (get_bits_left(gb) < 8 * elem_id) {
3368cabdff1aSopenharmony_ci                    av_log(avctx, AV_LOG_ERROR, "TYPE_FIL: "overread_err);
3369cabdff1aSopenharmony_ci                    err = AVERROR_INVALIDDATA;
3370cabdff1aSopenharmony_ci                    goto fail;
3371cabdff1aSopenharmony_ci            }
3372cabdff1aSopenharmony_ci            err = 0;
3373cabdff1aSopenharmony_ci            while (elem_id > 0) {
3374cabdff1aSopenharmony_ci                int ret = decode_extension_payload(ac, gb, elem_id, che_prev, che_prev_type);
3375cabdff1aSopenharmony_ci                if (ret < 0) {
3376cabdff1aSopenharmony_ci                    err = ret;
3377cabdff1aSopenharmony_ci                    break;
3378cabdff1aSopenharmony_ci                }
3379cabdff1aSopenharmony_ci                elem_id -= ret;
3380cabdff1aSopenharmony_ci            }
3381cabdff1aSopenharmony_ci            break;
3382cabdff1aSopenharmony_ci
3383cabdff1aSopenharmony_ci        default:
3384cabdff1aSopenharmony_ci            err = AVERROR_BUG; /* should not happen, but keeps compiler happy */
3385cabdff1aSopenharmony_ci            break;
3386cabdff1aSopenharmony_ci        }
3387cabdff1aSopenharmony_ci
3388cabdff1aSopenharmony_ci        if (elem_type < TYPE_DSE) {
3389cabdff1aSopenharmony_ci            che_prev      = che;
3390cabdff1aSopenharmony_ci            che_prev_type = elem_type;
3391cabdff1aSopenharmony_ci        }
3392cabdff1aSopenharmony_ci
3393cabdff1aSopenharmony_ci        if (err)
3394cabdff1aSopenharmony_ci            goto fail;
3395cabdff1aSopenharmony_ci
3396cabdff1aSopenharmony_ci        if (get_bits_left(gb) < 3) {
3397cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, overread_err);
3398cabdff1aSopenharmony_ci            err = AVERROR_INVALIDDATA;
3399cabdff1aSopenharmony_ci            goto fail;
3400cabdff1aSopenharmony_ci        }
3401cabdff1aSopenharmony_ci    }
3402cabdff1aSopenharmony_ci
3403cabdff1aSopenharmony_ci    if (!avctx->ch_layout.nb_channels) {
3404cabdff1aSopenharmony_ci        *got_frame_ptr = 0;
3405cabdff1aSopenharmony_ci        return 0;
3406cabdff1aSopenharmony_ci    }
3407cabdff1aSopenharmony_ci
3408cabdff1aSopenharmony_ci    multiplier = (ac->oc[1].m4ac.sbr == 1) ? ac->oc[1].m4ac.ext_sample_rate > ac->oc[1].m4ac.sample_rate : 0;
3409cabdff1aSopenharmony_ci    samples <<= multiplier;
3410cabdff1aSopenharmony_ci
3411cabdff1aSopenharmony_ci    spectral_to_sample(ac, samples);
3412cabdff1aSopenharmony_ci
3413cabdff1aSopenharmony_ci    if (ac->oc[1].status && audio_found) {
3414cabdff1aSopenharmony_ci        avctx->sample_rate = ac->oc[1].m4ac.sample_rate << multiplier;
3415cabdff1aSopenharmony_ci        avctx->frame_size = samples;
3416cabdff1aSopenharmony_ci        ac->oc[1].status = OC_LOCKED;
3417cabdff1aSopenharmony_ci    }
3418cabdff1aSopenharmony_ci
3419cabdff1aSopenharmony_ci    if (multiplier)
3420cabdff1aSopenharmony_ci        avctx->internal->skip_samples_multiplier = 2;
3421cabdff1aSopenharmony_ci
3422cabdff1aSopenharmony_ci    if (!ac->frame->data[0] && samples) {
3423cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "no frame data found\n");
3424cabdff1aSopenharmony_ci        err = AVERROR_INVALIDDATA;
3425cabdff1aSopenharmony_ci        goto fail;
3426cabdff1aSopenharmony_ci    }
3427cabdff1aSopenharmony_ci
3428cabdff1aSopenharmony_ci    if (samples) {
3429cabdff1aSopenharmony_ci        ac->frame->nb_samples = samples;
3430cabdff1aSopenharmony_ci        ac->frame->sample_rate = avctx->sample_rate;
3431cabdff1aSopenharmony_ci    } else
3432cabdff1aSopenharmony_ci        av_frame_unref(ac->frame);
3433cabdff1aSopenharmony_ci    *got_frame_ptr = !!samples;
3434cabdff1aSopenharmony_ci
3435cabdff1aSopenharmony_ci    /* for dual-mono audio (SCE + SCE) */
3436cabdff1aSopenharmony_ci    is_dmono = ac->dmono_mode && sce_count == 2 &&
3437cabdff1aSopenharmony_ci               !av_channel_layout_compare(&ac->oc[1].ch_layout,
3438cabdff1aSopenharmony_ci                                          &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO);
3439cabdff1aSopenharmony_ci    if (is_dmono) {
3440cabdff1aSopenharmony_ci        if (ac->dmono_mode == 1)
3441cabdff1aSopenharmony_ci            frame->data[1] = frame->data[0];
3442cabdff1aSopenharmony_ci        else if (ac->dmono_mode == 2)
3443cabdff1aSopenharmony_ci            frame->data[0] = frame->data[1];
3444cabdff1aSopenharmony_ci    }
3445cabdff1aSopenharmony_ci
3446cabdff1aSopenharmony_ci    return 0;
3447cabdff1aSopenharmony_cifail:
3448cabdff1aSopenharmony_ci    pop_output_configuration(ac);
3449cabdff1aSopenharmony_ci    return err;
3450cabdff1aSopenharmony_ci}
3451cabdff1aSopenharmony_ci
3452cabdff1aSopenharmony_cistatic int aac_decode_frame(AVCodecContext *avctx, AVFrame *frame,
3453cabdff1aSopenharmony_ci                            int *got_frame_ptr, AVPacket *avpkt)
3454cabdff1aSopenharmony_ci{
3455cabdff1aSopenharmony_ci    AACContext *ac = avctx->priv_data;
3456cabdff1aSopenharmony_ci    const uint8_t *buf = avpkt->data;
3457cabdff1aSopenharmony_ci    int buf_size = avpkt->size;
3458cabdff1aSopenharmony_ci    GetBitContext gb;
3459cabdff1aSopenharmony_ci    int buf_consumed;
3460cabdff1aSopenharmony_ci    int buf_offset;
3461cabdff1aSopenharmony_ci    int err;
3462cabdff1aSopenharmony_ci    size_t new_extradata_size;
3463cabdff1aSopenharmony_ci    const uint8_t *new_extradata = av_packet_get_side_data(avpkt,
3464cabdff1aSopenharmony_ci                                       AV_PKT_DATA_NEW_EXTRADATA,
3465cabdff1aSopenharmony_ci                                       &new_extradata_size);
3466cabdff1aSopenharmony_ci    size_t jp_dualmono_size;
3467cabdff1aSopenharmony_ci    const uint8_t *jp_dualmono   = av_packet_get_side_data(avpkt,
3468cabdff1aSopenharmony_ci                                       AV_PKT_DATA_JP_DUALMONO,
3469cabdff1aSopenharmony_ci                                       &jp_dualmono_size);
3470cabdff1aSopenharmony_ci
3471cabdff1aSopenharmony_ci    if (new_extradata) {
3472cabdff1aSopenharmony_ci        /* discard previous configuration */
3473cabdff1aSopenharmony_ci        ac->oc[1].status = OC_NONE;
3474cabdff1aSopenharmony_ci        err = decode_audio_specific_config(ac, ac->avctx, &ac->oc[1].m4ac,
3475cabdff1aSopenharmony_ci                                           new_extradata,
3476cabdff1aSopenharmony_ci                                           new_extradata_size * 8LL, 1);
3477cabdff1aSopenharmony_ci        if (err < 0) {
3478cabdff1aSopenharmony_ci            return err;
3479cabdff1aSopenharmony_ci        }
3480cabdff1aSopenharmony_ci    }
3481cabdff1aSopenharmony_ci
3482cabdff1aSopenharmony_ci    ac->dmono_mode = 0;
3483cabdff1aSopenharmony_ci    if (jp_dualmono && jp_dualmono_size > 0)
3484cabdff1aSopenharmony_ci        ac->dmono_mode =  1 + *jp_dualmono;
3485cabdff1aSopenharmony_ci    if (ac->force_dmono_mode >= 0)
3486cabdff1aSopenharmony_ci        ac->dmono_mode = ac->force_dmono_mode;
3487cabdff1aSopenharmony_ci
3488cabdff1aSopenharmony_ci    if (INT_MAX / 8 <= buf_size)
3489cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
3490cabdff1aSopenharmony_ci
3491cabdff1aSopenharmony_ci    if ((err = init_get_bits8(&gb, buf, buf_size)) < 0)
3492cabdff1aSopenharmony_ci        return err;
3493cabdff1aSopenharmony_ci
3494cabdff1aSopenharmony_ci    switch (ac->oc[1].m4ac.object_type) {
3495cabdff1aSopenharmony_ci    case AOT_ER_AAC_LC:
3496cabdff1aSopenharmony_ci    case AOT_ER_AAC_LTP:
3497cabdff1aSopenharmony_ci    case AOT_ER_AAC_LD:
3498cabdff1aSopenharmony_ci    case AOT_ER_AAC_ELD:
3499cabdff1aSopenharmony_ci        err = aac_decode_er_frame(avctx, frame, got_frame_ptr, &gb);
3500cabdff1aSopenharmony_ci        break;
3501cabdff1aSopenharmony_ci    default:
3502cabdff1aSopenharmony_ci        err = aac_decode_frame_int(avctx, frame, got_frame_ptr, &gb, avpkt);
3503cabdff1aSopenharmony_ci    }
3504cabdff1aSopenharmony_ci    if (err < 0)
3505cabdff1aSopenharmony_ci        return err;
3506cabdff1aSopenharmony_ci
3507cabdff1aSopenharmony_ci    buf_consumed = (get_bits_count(&gb) + 7) >> 3;
3508cabdff1aSopenharmony_ci    for (buf_offset = buf_consumed; buf_offset < buf_size; buf_offset++)
3509cabdff1aSopenharmony_ci        if (buf[buf_offset])
3510cabdff1aSopenharmony_ci            break;
3511cabdff1aSopenharmony_ci
3512cabdff1aSopenharmony_ci    return buf_size > buf_offset ? buf_consumed : buf_size;
3513cabdff1aSopenharmony_ci}
3514cabdff1aSopenharmony_ci
3515cabdff1aSopenharmony_cistatic av_cold int aac_decode_close(AVCodecContext *avctx)
3516cabdff1aSopenharmony_ci{
3517cabdff1aSopenharmony_ci    AACContext *ac = avctx->priv_data;
3518cabdff1aSopenharmony_ci    int i, type;
3519cabdff1aSopenharmony_ci
3520cabdff1aSopenharmony_ci    for (i = 0; i < MAX_ELEM_ID; i++) {
3521cabdff1aSopenharmony_ci        for (type = 0; type < 4; type++) {
3522cabdff1aSopenharmony_ci            if (ac->che[type][i])
3523cabdff1aSopenharmony_ci                AAC_RENAME(ff_aac_sbr_ctx_close)(&ac->che[type][i]->sbr);
3524cabdff1aSopenharmony_ci            av_freep(&ac->che[type][i]);
3525cabdff1aSopenharmony_ci        }
3526cabdff1aSopenharmony_ci    }
3527cabdff1aSopenharmony_ci
3528cabdff1aSopenharmony_ci    ff_mdct_end(&ac->mdct);
3529cabdff1aSopenharmony_ci    ff_mdct_end(&ac->mdct_small);
3530cabdff1aSopenharmony_ci    ff_mdct_end(&ac->mdct_ld);
3531cabdff1aSopenharmony_ci    ff_mdct_end(&ac->mdct_ltp);
3532cabdff1aSopenharmony_ci#if !USE_FIXED
3533cabdff1aSopenharmony_ci    ff_mdct15_uninit(&ac->mdct120);
3534cabdff1aSopenharmony_ci    ff_mdct15_uninit(&ac->mdct480);
3535cabdff1aSopenharmony_ci    ff_mdct15_uninit(&ac->mdct960);
3536cabdff1aSopenharmony_ci#endif
3537cabdff1aSopenharmony_ci    av_freep(&ac->fdsp);
3538cabdff1aSopenharmony_ci    return 0;
3539cabdff1aSopenharmony_ci}
3540cabdff1aSopenharmony_ci
3541cabdff1aSopenharmony_cistatic void aacdec_init(AACContext *c)
3542cabdff1aSopenharmony_ci{
3543cabdff1aSopenharmony_ci    c->imdct_and_windowing                      = imdct_and_windowing;
3544cabdff1aSopenharmony_ci    c->apply_ltp                                = apply_ltp;
3545cabdff1aSopenharmony_ci    c->apply_tns                                = apply_tns;
3546cabdff1aSopenharmony_ci    c->windowing_and_mdct_ltp                   = windowing_and_mdct_ltp;
3547cabdff1aSopenharmony_ci    c->update_ltp                               = update_ltp;
3548cabdff1aSopenharmony_ci#if USE_FIXED
3549cabdff1aSopenharmony_ci    c->vector_pow43                             = vector_pow43;
3550cabdff1aSopenharmony_ci    c->subband_scale                            = subband_scale;
3551cabdff1aSopenharmony_ci#endif
3552cabdff1aSopenharmony_ci
3553cabdff1aSopenharmony_ci#if !USE_FIXED
3554cabdff1aSopenharmony_ci#if ARCH_MIPS
3555cabdff1aSopenharmony_ci    ff_aacdec_init_mips(c);
3556cabdff1aSopenharmony_ci#endif
3557cabdff1aSopenharmony_ci#endif /* !USE_FIXED */
3558cabdff1aSopenharmony_ci}
3559cabdff1aSopenharmony_ci/**
3560cabdff1aSopenharmony_ci * AVOptions for Japanese DTV specific extensions (ADTS only)
3561cabdff1aSopenharmony_ci */
3562cabdff1aSopenharmony_ci#define AACDEC_FLAGS AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
3563cabdff1aSopenharmony_cistatic const AVOption options[] = {
3564cabdff1aSopenharmony_ci    {"dual_mono_mode", "Select the channel to decode for dual mono",
3565cabdff1aSopenharmony_ci     offsetof(AACContext, force_dmono_mode), AV_OPT_TYPE_INT, {.i64=-1}, -1, 2,
3566cabdff1aSopenharmony_ci     AACDEC_FLAGS, "dual_mono_mode"},
3567cabdff1aSopenharmony_ci
3568cabdff1aSopenharmony_ci    {"auto", "autoselection",            0, AV_OPT_TYPE_CONST, {.i64=-1}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"},
3569cabdff1aSopenharmony_ci    {"main", "Select Main/Left channel", 0, AV_OPT_TYPE_CONST, {.i64= 1}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"},
3570cabdff1aSopenharmony_ci    {"sub" , "Select Sub/Right channel", 0, AV_OPT_TYPE_CONST, {.i64= 2}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"},
3571cabdff1aSopenharmony_ci    {"both", "Select both channels",     0, AV_OPT_TYPE_CONST, {.i64= 0}, INT_MIN, INT_MAX, AACDEC_FLAGS, "dual_mono_mode"},
3572cabdff1aSopenharmony_ci
3573cabdff1aSopenharmony_ci    { "channel_order", "Order in which the channels are to be exported",
3574cabdff1aSopenharmony_ci        offsetof(AACContext, output_channel_order), AV_OPT_TYPE_INT,
3575cabdff1aSopenharmony_ci        { .i64 = CHANNEL_ORDER_DEFAULT }, 0, 1, AACDEC_FLAGS, "channel_order" },
3576cabdff1aSopenharmony_ci      { "default", "normal libavcodec channel order", 0, AV_OPT_TYPE_CONST,
3577cabdff1aSopenharmony_ci        { .i64 = CHANNEL_ORDER_DEFAULT }, .flags = AACDEC_FLAGS, "channel_order" },
3578cabdff1aSopenharmony_ci      { "coded",    "order in which the channels are coded in the bitstream",
3579cabdff1aSopenharmony_ci        0, AV_OPT_TYPE_CONST, { .i64 = CHANNEL_ORDER_CODED }, .flags = AACDEC_FLAGS, "channel_order" },
3580cabdff1aSopenharmony_ci
3581cabdff1aSopenharmony_ci    {NULL},
3582cabdff1aSopenharmony_ci};
3583cabdff1aSopenharmony_ci
3584cabdff1aSopenharmony_cistatic const AVClass aac_decoder_class = {
3585cabdff1aSopenharmony_ci    .class_name = "AAC decoder",
3586cabdff1aSopenharmony_ci    .item_name  = av_default_item_name,
3587cabdff1aSopenharmony_ci    .option     = options,
3588cabdff1aSopenharmony_ci    .version    = LIBAVUTIL_VERSION_INT,
3589cabdff1aSopenharmony_ci};
3590