1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Copyright (C) 2017 foo86
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * This file is part of FFmpeg.
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
10cabdff1aSopenharmony_ci *
11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14cabdff1aSopenharmony_ci * Lesser General Public License for more details.
15cabdff1aSopenharmony_ci *
16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19cabdff1aSopenharmony_ci */
20cabdff1aSopenharmony_ci
21cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h"
22cabdff1aSopenharmony_ci#include "libavutil/float_dsp.h"
23cabdff1aSopenharmony_ci#include "libavutil/thread.h"
24cabdff1aSopenharmony_ci#include "libavutil/mem.h"
25cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h"
26cabdff1aSopenharmony_ci#include "libavutil/opt.h"
27cabdff1aSopenharmony_ci
28cabdff1aSopenharmony_ci#include "codec_internal.h"
29cabdff1aSopenharmony_ci#include "internal.h"
30cabdff1aSopenharmony_ci#include "get_bits.h"
31cabdff1aSopenharmony_ci#include "dolby_e.h"
32cabdff1aSopenharmony_ci#include "kbdwin.h"
33cabdff1aSopenharmony_ci#include "fft.h"
34cabdff1aSopenharmony_ci
35cabdff1aSopenharmony_ci#define MAX_SEGMENTS    2
36cabdff1aSopenharmony_ci
37cabdff1aSopenharmony_ci#define MAX_GROUPS      8
38cabdff1aSopenharmony_ci#define MAX_EXPONENTS   304
39cabdff1aSopenharmony_ci#define MAX_MANTISSAS   1024
40cabdff1aSopenharmony_ci
41cabdff1aSopenharmony_ci#define MAX_MSTR_EXP    2
42cabdff1aSopenharmony_ci#define MAX_BIAS_EXP    50
43cabdff1aSopenharmony_ci
44cabdff1aSopenharmony_cienum DBEOutputChannelOrder {
45cabdff1aSopenharmony_ci    CHANNEL_ORDER_DEFAULT,
46cabdff1aSopenharmony_ci    CHANNEL_ORDER_CODED,
47cabdff1aSopenharmony_ci};
48cabdff1aSopenharmony_ci
49cabdff1aSopenharmony_citypedef struct DBEGroup {
50cabdff1aSopenharmony_ci    uint8_t         nb_exponent;
51cabdff1aSopenharmony_ci    uint8_t         nb_bias_exp[MAX_MSTR_EXP];
52cabdff1aSopenharmony_ci    uint16_t        exp_ofs;
53cabdff1aSopenharmony_ci    uint16_t        mnt_ofs;
54cabdff1aSopenharmony_ci    const uint8_t   *nb_mantissa;
55cabdff1aSopenharmony_ci    uint8_t         imdct_idx;
56cabdff1aSopenharmony_ci    uint8_t         imdct_phs;
57cabdff1aSopenharmony_ci    uint16_t        win_len;
58cabdff1aSopenharmony_ci    uint16_t        dst_ofs;
59cabdff1aSopenharmony_ci    uint16_t        win_ofs;
60cabdff1aSopenharmony_ci    uint16_t        src_ofs;
61cabdff1aSopenharmony_ci} DBEGroup;
62cabdff1aSopenharmony_ci
63cabdff1aSopenharmony_citypedef struct DBEChannel {
64cabdff1aSopenharmony_ci    int     gr_code;
65cabdff1aSopenharmony_ci    int     bw_code;
66cabdff1aSopenharmony_ci
67cabdff1aSopenharmony_ci    int         nb_groups;
68cabdff1aSopenharmony_ci    int         nb_mstr_exp;
69cabdff1aSopenharmony_ci    DBEGroup    groups[MAX_GROUPS];
70cabdff1aSopenharmony_ci
71cabdff1aSopenharmony_ci    int     exp_strategy[MAX_GROUPS];
72cabdff1aSopenharmony_ci    int     exponents[MAX_EXPONENTS];
73cabdff1aSopenharmony_ci    int     bap[MAX_EXPONENTS];
74cabdff1aSopenharmony_ci    int     idx[MAX_EXPONENTS];
75cabdff1aSopenharmony_ci
76cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, float, mantissas)[MAX_MANTISSAS];
77cabdff1aSopenharmony_ci} DBEChannel;
78cabdff1aSopenharmony_ci
79cabdff1aSopenharmony_citypedef struct DBEDecodeContext {
80cabdff1aSopenharmony_ci    const AVClass   *class;
81cabdff1aSopenharmony_ci    AVCodecContext  *avctx;
82cabdff1aSopenharmony_ci    DBEContext  dectx;
83cabdff1aSopenharmony_ci
84cabdff1aSopenharmony_ci    DBEChannel  channels[MAX_SEGMENTS][MAX_CHANNELS];
85cabdff1aSopenharmony_ci
86cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, float, history)[MAX_CHANNELS][256];
87cabdff1aSopenharmony_ci
88cabdff1aSopenharmony_ci    FFTContext          imdct[3];
89cabdff1aSopenharmony_ci    AVFloatDSPContext   *fdsp;
90cabdff1aSopenharmony_ci} DBEDecodeContext;
91cabdff1aSopenharmony_ci
92cabdff1aSopenharmony_cistatic const int8_t lfe_channel_tab[MAX_PROG_CONF + 1] = {
93cabdff1aSopenharmony_ci     5,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4,
94cabdff1aSopenharmony_ci    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  5, 5
95cabdff1aSopenharmony_ci};
96cabdff1aSopenharmony_ci
97cabdff1aSopenharmony_cistatic const uint8_t ch_reorder_4[4] = { 0, 2, 1, 3 };
98cabdff1aSopenharmony_cistatic const uint8_t ch_reorder_6[6] = { 0, 2, 4, 1, 3, 5 };
99cabdff1aSopenharmony_cistatic const uint8_t ch_reorder_8[8] = { 0, 2, 6, 4, 1, 3, 7, 5 };
100cabdff1aSopenharmony_cistatic const uint8_t ch_reorder_n[8] = { 0, 2, 4, 6, 1, 3, 5, 7 };
101cabdff1aSopenharmony_ci
102cabdff1aSopenharmony_ci
103cabdff1aSopenharmony_cistatic const uint8_t nb_groups_tab[4] = { 1, 8, 7, 1 };
104cabdff1aSopenharmony_ci
105cabdff1aSopenharmony_cistatic const uint8_t nb_mstr_exp_tab[4] = { 2, 2, 2, 1 };
106cabdff1aSopenharmony_ci
107cabdff1aSopenharmony_cistatic const uint8_t nb_mantissa_38[38] = {
108cabdff1aSopenharmony_ci     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
109cabdff1aSopenharmony_ci     2,  2,  2,  2,  2,  2,  3,  3,  3,  4,  4,  4,  5,  5,  6,  6,
110cabdff1aSopenharmony_ci     7,  8,  9, 10, 11, 12,
111cabdff1aSopenharmony_ci};
112cabdff1aSopenharmony_ci
113cabdff1aSopenharmony_cistatic const uint8_t nb_mantissa_44[44] = {
114cabdff1aSopenharmony_ci     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,
115cabdff1aSopenharmony_ci     2,  2,  2,  2,  2,  3,  3,  3,  3,  4,  4,  5,  5,  6,  7,  7,
116cabdff1aSopenharmony_ci     8,  9, 10, 11, 12, 13, 15, 16, 18, 20, 22, 25,
117cabdff1aSopenharmony_ci};
118cabdff1aSopenharmony_ci
119cabdff1aSopenharmony_cistatic const uint8_t nb_mantissa_50[50] = {
120cabdff1aSopenharmony_ci     1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  3,  3,  3,
121cabdff1aSopenharmony_ci     3,  4,  4,  5,  5,  6,  6,  7,  8,  9,  9, 10, 12, 13, 14, 16,
122cabdff1aSopenharmony_ci    18, 19, 22, 24, 27, 29, 32, 36, 40, 44, 49, 54, 60, 66, 74, 82,
123cabdff1aSopenharmony_ci    90, 100,
124cabdff1aSopenharmony_ci};
125cabdff1aSopenharmony_ci
126cabdff1aSopenharmony_cistatic const uint8_t imdct_bits_tab[3] = { 8, 9, 11 };
127cabdff1aSopenharmony_ci
128cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_0[1] = {
129cabdff1aSopenharmony_ci    { 50, { 27, 23 }, 0, 0, nb_mantissa_50, 2, 0, 1152, 0, 1408, 0 },
130cabdff1aSopenharmony_ci};
131cabdff1aSopenharmony_ci
132cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_1[8] = {
133cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 0, 0, nb_mantissa_38, 0, 0, 192, 0, 256, 0 },
134cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 38, 128, nb_mantissa_38, 0, 1, 256, 64, 448, 0 },
135cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 76, 256, nb_mantissa_38, 0, 1, 256, 192, 704, 0 },
136cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 114, 384, nb_mantissa_38, 0, 1, 256, 320, 0, 0 },
137cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 152, 512, nb_mantissa_38, 0, 1, 256, 448, 0, 0 },
138cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 190, 640, nb_mantissa_38, 0, 1, 256, 576, 0, 0 },
139cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 228, 768, nb_mantissa_38, 0, 1, 256, 704, 0, 0 },
140cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 266, 896, nb_mantissa_38, 0, 1, 256, 832, 0, 0 },
141cabdff1aSopenharmony_ci};
142cabdff1aSopenharmony_ci
143cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_2[7] = {
144cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 0, 0, nb_mantissa_38, 0, 0, 192, 0, 256, 0 },
145cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 38, 128, nb_mantissa_38, 0, 1, 256, 64, 448, 0 },
146cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 76, 256, nb_mantissa_38, 0, 1, 256, 192, 704, 0 },
147cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 114, 384, nb_mantissa_38, 0, 1, 256, 320, 0, 0 },
148cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 152, 512, nb_mantissa_38, 0, 1, 256, 448, 0, 0 },
149cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 190, 640, nb_mantissa_38, 0, 1, 256, 576, 0, 0 },
150cabdff1aSopenharmony_ci    { 44, { 19, 25 }, 228, 768, nb_mantissa_44, 1, 1, 448, 704, 960, 64 },
151cabdff1aSopenharmony_ci};
152cabdff1aSopenharmony_ci
153cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_3[1] = {
154cabdff1aSopenharmony_ci    { 21, { 21 }, 0, 0, nb_mantissa_50, 2, 0, 1152, 0, 1408, 0 },
155cabdff1aSopenharmony_ci};
156cabdff1aSopenharmony_ci
157cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_4[1] = {
158cabdff1aSopenharmony_ci    { 50, { 27, 23 }, 0, 0, nb_mantissa_50, 2, 2, 1152, 0, 1408, 896 },
159cabdff1aSopenharmony_ci};
160cabdff1aSopenharmony_ci
161cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_5[8] = {
162cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 0, 0, nb_mantissa_38, 0, 1, 256, 64, 0, 0 },
163cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 38, 128, nb_mantissa_38, 0, 1, 256, 192, 0, 0 },
164cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 76, 256, nb_mantissa_38, 0, 1, 256, 320, 0, 0 },
165cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 114, 384, nb_mantissa_38, 0, 1, 256, 448, 0, 0 },
166cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 152, 512, nb_mantissa_38, 0, 1, 256, 576, 0, 0 },
167cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 190, 640, nb_mantissa_38, 0, 1, 256, 704, 3008, 0 },
168cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 228, 768, nb_mantissa_38, 0, 1, 256, 832, 2752, 0 },
169cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 266, 896, nb_mantissa_38, 0, 2, 192, 960, 2560, 64 },
170cabdff1aSopenharmony_ci};
171cabdff1aSopenharmony_ci
172cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_6[7] = {
173cabdff1aSopenharmony_ci    { 44, { 19, 25 }, 0, 0, nb_mantissa_44, 1, 1, 448, 0, 3264, 0 },
174cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 44, 256, nb_mantissa_38, 0, 1, 256, 320, 0, 0 },
175cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 82, 384, nb_mantissa_38, 0, 1, 256, 448, 0, 0 },
176cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 120, 512, nb_mantissa_38, 0, 1, 256, 576, 0, 0 },
177cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 158, 640, nb_mantissa_38, 0, 1, 256, 704, 3008, 0 },
178cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 196, 768, nb_mantissa_38, 0, 1, 256, 832, 2752, 0 },
179cabdff1aSopenharmony_ci    { 38, { 12, 26 }, 234, 896, nb_mantissa_38, 0, 2, 192, 960, 2560, 64 },
180cabdff1aSopenharmony_ci};
181cabdff1aSopenharmony_ci
182cabdff1aSopenharmony_cistatic const DBEGroup grp_tab_7[1] = {
183cabdff1aSopenharmony_ci    { 21, { 21 }, 0, 0, nb_mantissa_50, 2, 2, 1152, 0, 1408, 896 },
184cabdff1aSopenharmony_ci};
185cabdff1aSopenharmony_ci
186cabdff1aSopenharmony_cistatic const DBEGroup *const frm_ofs_tab[2][4] = {
187cabdff1aSopenharmony_ci    { grp_tab_0, grp_tab_1, grp_tab_2, grp_tab_3 },
188cabdff1aSopenharmony_ci    { grp_tab_4, grp_tab_5, grp_tab_6, grp_tab_7 }
189cabdff1aSopenharmony_ci};
190cabdff1aSopenharmony_ci
191cabdff1aSopenharmony_cistatic const uint8_t mantissa_size1[16][4] = {
192cabdff1aSopenharmony_ci    {  0,  0,  0,  0 }, {  2,  1,  1,  1 }, {  3,  2,  1,  1 }, {  4,  3,  2,  1 },
193cabdff1aSopenharmony_ci    {  5,  4,  3,  2 }, {  6,  5,  4,  3 }, {  7,  6,  5,  4 }, {  8,  7,  6,  5 },
194cabdff1aSopenharmony_ci    {  9,  8,  7,  6 }, { 10,  9,  8,  7 }, { 11, 10,  9,  8 }, { 12, 11, 10,  9 },
195cabdff1aSopenharmony_ci    { 13, 12, 11, 10 }, { 14, 13, 12, 11 }, { 15, 14, 13, 12 }, { 16, 15, 14, 13 },
196cabdff1aSopenharmony_ci};
197cabdff1aSopenharmony_ci
198cabdff1aSopenharmony_cistatic const uint8_t mantissa_size2[16][4] = {
199cabdff1aSopenharmony_ci    {  0,  0,  0,  0 }, {  2,  1,  2,  2 }, {  3,  2,  3,  3 }, {  4,  3,  4,  4 },
200cabdff1aSopenharmony_ci    {  5,  4,  5,  5 }, {  6,  5,  6,  6 }, {  7,  6,  7,  7 }, {  8,  7,  8,  8 },
201cabdff1aSopenharmony_ci    {  9,  8,  9,  9 }, { 10,  9, 10, 10 }, { 11, 10, 11, 11 }, { 12, 11, 12, 12 },
202cabdff1aSopenharmony_ci    { 13, 12, 13, 13 }, { 14, 13, 14, 14 }, { 15, 14, 15, 15 }, { 16, 15, 16, 16 },
203cabdff1aSopenharmony_ci};
204cabdff1aSopenharmony_ci
205cabdff1aSopenharmony_cistatic const float start_window[192] = {
206cabdff1aSopenharmony_ci    0.00161569379826, 0.00185748233347, 0.00198562758548, 0.00207834078104,
207cabdff1aSopenharmony_ci    0.00215717748523, 0.00223067096393, 0.00230299213147, 0.00237651215396,
208cabdff1aSopenharmony_ci    0.00245275561606, 0.00253281402069, 0.00261754673613, 0.00270768786168,
209cabdff1aSopenharmony_ci    0.00280390761895, 0.00290684998656, 0.00301715751161, 0.00313548872798,
210cabdff1aSopenharmony_ci    0.00326253122934, 0.00339901215995, 0.00354570716636, 0.00370344845023,
211cabdff1aSopenharmony_ci    0.00387313232586, 0.00405572653911, 0.00425227750970, 0.00446391759265,
212cabdff1aSopenharmony_ci    0.00469187240551, 0.00493746822816, 0.00520213944619, 0.00548743597507,
213cabdff1aSopenharmony_ci    0.00579503056737, 0.00612672586953, 0.00648446105606, 0.00687031782873,
214cabdff1aSopenharmony_ci    0.00728652552677, 0.00773546505205, 0.00821967127415, 0.00874183354619,
215cabdff1aSopenharmony_ci    0.00930479393832, 0.00991154278653, 0.01056521116692, 0.01126905994567,
216cabdff1aSopenharmony_ci    0.01202646513050, 0.01284089936559, 0.01371590957417, 0.01465509096066,
217cabdff1aSopenharmony_ci    0.01566205783408, 0.01674041199523, 0.01789370972358, 0.01912542867865,
218cabdff1aSopenharmony_ci    0.02043893626265, 0.02183746113793, 0.02332406961796, 0.02490164852364,
219cabdff1aSopenharmony_ci    0.02657289580178, 0.02834031974193, 0.03020624702903, 0.03217283918354,
220cabdff1aSopenharmony_ci    0.03424211623810, 0.03641598586180, 0.03869627565015, 0.04108476601498,
221cabdff1aSopenharmony_ci    0.04358322107390, 0.04619341515939, 0.04891715301882, 0.05175628239149,
222cabdff1aSopenharmony_ci
223cabdff1aSopenharmony_ci    0.05471237327267, 0.05778734733755, 0.06098291402413, 0.06430101352084,
224cabdff1aSopenharmony_ci    0.06774345212186, 0.07131188644726, 0.07500780649199, 0.07883251748595,
225cabdff1aSopenharmony_ci    0.08278712056651, 0.08687249228061, 0.09108926295730, 0.09543779401074,
226cabdff1aSopenharmony_ci    0.09991815425851, 0.10453009536427, 0.10927302653894, 0.11414598865987,
227cabdff1aSopenharmony_ci    0.11914762799220, 0.12427616972097, 0.12952939152560, 0.13490459744934,
228cabdff1aSopenharmony_ci    0.14039859233595, 0.14600765712201, 0.15172752528722, 0.15755336077528,
229cabdff1aSopenharmony_ci    0.16347973770491, 0.16950062219342, 0.17560935661442, 0.18179864660619,
230cabdff1aSopenharmony_ci    0.18806055113821, 0.19438647593012, 0.20076717050010, 0.20719272909882,
231cabdff1aSopenharmony_ci    0.21365259576030, 0.22013557367283, 0.22662983904194, 0.23312295958328,
232cabdff1aSopenharmony_ci    0.23960191774666, 0.24605313873388, 0.25246252333253, 0.25881548554631,
233cabdff1aSopenharmony_ci    0.26509699495987, 0.27129162373316, 0.27738359807707, 0.28335685401987,
234cabdff1aSopenharmony_ci    0.28919509723179, 0.29488186663467, 0.30040060148455, 0.30573471157819,
235cabdff1aSopenharmony_ci    0.31086765019993, 0.31578298939317, 0.32046449711227, 0.32489621578468,
236cabdff1aSopenharmony_ci    0.32906254179156, 0.33294830535654, 0.33653885031840, 0.33982011325336,
237cabdff1aSopenharmony_ci    0.34277870140679, 0.34540196889300, 0.34767809062480, 0.34959613344194,
238cabdff1aSopenharmony_ci    0.35114612391958, 0.35231911235422, 0.35310723244504, 0.35350375621308,
239cabdff1aSopenharmony_ci
240cabdff1aSopenharmony_ci    0.35350314372945, 0.35310108725579, 0.35229454943591, 0.35108179521634,
241cabdff1aSopenharmony_ci    0.34946241721522, 0.34743735430290, 0.34500890320420, 0.34218072298001,
242cabdff1aSopenharmony_ci    0.33895783229541, 0.33534659943168, 0.33135472505060, 0.32699121776996,
243cabdff1aSopenharmony_ci    0.32226636266000, 0.31719168282019, 0.31177989424432, 0.30604485422875,
244cabdff1aSopenharmony_ci    0.30000150362379, 0.29366580327088, 0.28705466500775, 0.28018587766131,
245cabdff1aSopenharmony_ci    0.27307802848095, 0.26575042049535, 0.25822298630189, 0.25051619882000,
246cabdff1aSopenharmony_ci    0.24265097955783, 0.23464860495522, 0.22653061137548, 0.21831869932335,
247cabdff1aSopenharmony_ci    0.21003463746705, 0.20170016703857, 0.19333690717811, 0.18496626177620,
248cabdff1aSopenharmony_ci    0.17660932835062, 0.16828680947474, 0.16001892724986, 0.15182534128597,
249cabdff1aSopenharmony_ci    0.14372507062477, 0.13573642000364, 0.12787691082233, 0.12016321713317,
250cabdff1aSopenharmony_ci    0.11261110693234, 0.10523538898282, 0.09804986534955, 0.09106728977263,
251cabdff1aSopenharmony_ci    0.08429933194438, 0.07775654768810, 0.07144835495683, 0.06538301547324,
252cabdff1aSopenharmony_ci    0.05956762170687, 0.05400808871425, 0.04870915012107, 0.04367435714993,
253cabdff1aSopenharmony_ci    0.03890607899172, 0.03440550179663, 0.03017262174627, 0.02620622428513,
254cabdff1aSopenharmony_ci    0.02250383492507, 0.01906161305732, 0.01587412848221, 0.01293388032354,
255cabdff1aSopenharmony_ci    0.01023019677288, 0.00774641320626, 0.00545109736891, 0.00325868651263,
256cabdff1aSopenharmony_ci};
257cabdff1aSopenharmony_ci
258cabdff1aSopenharmony_cistatic const float short_window2[192] = {
259cabdff1aSopenharmony_ci    0.00018861094606, 0.00033433010202, 0.00050309624485, 0.00070306161748,
260cabdff1aSopenharmony_ci    0.00093995174533, 0.00121913067128, 0.00154606505568, 0.00192647806126,
261cabdff1aSopenharmony_ci    0.00236641248692, 0.00287225985240, 0.00345077377440, 0.00410907465023,
262cabdff1aSopenharmony_ci    0.00485464855241, 0.00569534163219, 0.00663935063508, 0.00769520981249,
263cabdff1aSopenharmony_ci    0.00887177436246, 0.01017820046395, 0.01162392194150, 0.01321862359335,
264cabdff1aSopenharmony_ci    0.01497221122468, 0.01689477844427, 0.01899657030441, 0.02128794388846,
265cabdff1aSopenharmony_ci    0.02377932597692, 0.02648116795039, 0.02940389811590, 0.03255787167130,
266cabdff1aSopenharmony_ci    0.03595331854986, 0.03960028941437, 0.04350860009563, 0.04768777479454,
267cabdff1aSopenharmony_ci    0.05214698838949, 0.05689500821121, 0.06194013566525, 0.06729014809766,
268cabdff1aSopenharmony_ci    0.07295224131210, 0.07893297315602, 0.08523820859989, 0.09187306673620,
269cabdff1aSopenharmony_ci    0.09884187012422, 0.10614809690222, 0.11379433608064, 0.12178224641797,
270cabdff1aSopenharmony_ci    0.13011251926531, 0.13878484574660, 0.14779788861830, 0.15714925912610,
271cabdff1aSopenharmony_ci    0.16683549914631, 0.17685206886673, 0.18719334022589, 0.19785259629099,
272cabdff1aSopenharmony_ci    0.20882203671372, 0.22009278936030, 0.23165492816694, 0.24349749722585,
273cabdff1aSopenharmony_ci    0.25560854105961, 0.26797514099368, 0.28058345748882, 0.29341877824732,
274cabdff1aSopenharmony_ci    0.30646557185942, 0.31970754671026, 0.33312771482295, 0.34670846027024,
275cabdff1aSopenharmony_ci
276cabdff1aSopenharmony_ci    0.36043161174692, 0.37427851885723, 0.38823013163645, 0.40226708279486,
277cabdff1aSopenharmony_ci    0.41636977214436, 0.43051845264462, 0.44469331748632, 0.45887458761470,
278cabdff1aSopenharmony_ci    0.47304259908636, 0.48717788964798, 0.50126128392546, 0.51527397661778,
279cabdff1aSopenharmony_ci    0.52919761310050, 0.54301436685998, 0.55670701320069, 0.57025899869448,
280cabdff1aSopenharmony_ci    0.58365450587230, 0.59687851269542, 0.60991684638414, 0.62275623122793,
281cabdff1aSopenharmony_ci    0.63538433005035, 0.64778977905593, 0.65996221584264, 0.67189230042379,
282cabdff1aSopenharmony_ci    0.68357172916486, 0.69499324160511, 0.70615062019861, 0.71703868307548,
283cabdff1aSopenharmony_ci    0.72765326998919, 0.73799122168099, 0.74805035295521, 0.75782941981995,
284cabdff1aSopenharmony_ci    0.76732808110520, 0.77654685502339, 0.78548707118622, 0.79415081863423,
285cabdff1aSopenharmony_ci    0.80254089047207, 0.81066072573188, 0.81851434910893, 0.82610630922734,
286cabdff1aSopenharmony_ci    0.83344161609862, 0.84052567843230, 0.84736424144524, 0.85396332579459,
287cabdff1aSopenharmony_ci    0.86032916822973, 0.86646816451999, 0.87238681516918, 0.87809167437532,
288cabdff1aSopenharmony_ci    0.88358930263537, 0.88888622333073, 0.89398888356256, 0.89890361943564,
289cabdff1aSopenharmony_ci    0.90363662591861, 0.90819393133744, 0.91258137648979, 0.91680459830070,
290cabdff1aSopenharmony_ci    0.92086901787718, 0.92477983276087, 0.92854201312583, 0.93216030163834,
291cabdff1aSopenharmony_ci    0.93563921662343, 0.93898305819384, 0.94219591693690, 0.94528168477979,
292cabdff1aSopenharmony_ci
293cabdff1aSopenharmony_ci    0.94823843319821, 0.95106834367330, 0.95377776558539, 0.95636718335775,
294cabdff1aSopenharmony_ci    0.95883679961479, 0.96118650212341, 0.96341583179195, 0.96552395212906,
295cabdff1aSopenharmony_ci    0.96750962060547, 0.96937116231768, 0.97110644638309, 0.97271286544154,
296cabdff1aSopenharmony_ci    0.97418731862798, 0.97552619834964, 0.97672538116257, 0.97778022299974,
297cabdff1aSopenharmony_ci    0.97868555895586, 0.97943570778357, 0.98002448120255, 0.98044519806866,
298cabdff1aSopenharmony_ci    0.98069070339493, 0.98075339216123, 0.98062523779637, 0.98029782516478,
299cabdff1aSopenharmony_ci    0.97976238784222, 0.97900984942031, 0.97803086854002, 0.97681588731895,
300cabdff1aSopenharmony_ci    0.97535518280755, 0.97363892108474, 0.97165721358452, 0.96940017523145,
301cabdff1aSopenharmony_ci    0.96685798395452, 0.96402094114589, 0.96087953263194, 0.95742448973047,
302cabdff1aSopenharmony_ci    0.95364684997699, 0.94953801711660, 0.94508981997396, 0.94029456983253,
303cabdff1aSopenharmony_ci    0.93514511597504, 0.92963489905951, 0.92375800202883, 0.91750919827624,
304cabdff1aSopenharmony_ci    0.91088399681406, 0.90387868421832, 0.89649036314692, 0.88871698725397,
305cabdff1aSopenharmony_ci    0.88055739234735, 0.87201132366062, 0.86307945913336, 0.85376342861693,
306cabdff1aSopenharmony_ci    0.84406582894455, 0.83399023482637, 0.82354120554757, 0.81272428745995,
307cabdff1aSopenharmony_ci    0.80154601230457, 0.79001389138101, 0.77813640562199, 0.76592299164227,
308cabdff1aSopenharmony_ci    0.75338402384395, 0.74053079267526, 0.72737547915460, 0.71393112578527,
309cabdff1aSopenharmony_ci};
310cabdff1aSopenharmony_ci
311cabdff1aSopenharmony_cistatic const float short_window3[64] = {
312cabdff1aSopenharmony_ci    0.00326887936450, 0.00550242900936, 0.00786846643791, 0.01045683453520,
313cabdff1aSopenharmony_ci    0.01330402120132, 0.01643221072863, 0.01985798040609, 0.02359509464766,
314cabdff1aSopenharmony_ci    0.02765559221954, 0.03205025893128, 0.03678884369614, 0.04188015679495,
315cabdff1aSopenharmony_ci    0.04733210987781, 0.05315172583924, 0.05934513287609, 0.06591755045290,
316cabdff1aSopenharmony_ci    0.07287327156378, 0.08021564389822, 0.08794705152307, 0.09606889811179,
317cabdff1aSopenharmony_ci    0.10458159240070, 0.11348453632940, 0.12277611617809, 0.13245369691511,
318cabdff1aSopenharmony_ci    0.14251361989876, 0.15295120402567, 0.16376075037904, 0.17493555039885,
319cabdff1aSopenharmony_ci    0.18646789757072, 0.19834910260891, 0.21056951208995, 0.22311853047787,
320cabdff1aSopenharmony_ci    0.23598464546683, 0.24915545655419, 0.26261770674500, 0.27635731727778,
321cabdff1aSopenharmony_ci    0.29035942525136, 0.30460842402318, 0.31908800624032, 0.33378120935681,
322cabdff1aSopenharmony_ci    0.34867046348260, 0.36373764140285, 0.37896411059909, 0.39433078709788,
323cabdff1aSopenharmony_ci    0.40981819096657, 0.42540650327031, 0.44107562429959, 0.45680523287270,
324cabdff1aSopenharmony_ci    0.47257484651351, 0.48836388230077, 0.50415171818214, 0.51991775454258,
325cabdff1aSopenharmony_ci    0.53564147581496, 0.55130251191887, 0.56688069931047, 0.58235614142007,
326cabdff1aSopenharmony_ci    0.59770926827271, 0.61292089506118, 0.62797227945823, 0.64284517745255,
327cabdff1aSopenharmony_ci    0.65752189749349, 0.67198535273209, 0.68621911114984, 0.70020744337099,
328cabdff1aSopenharmony_ci};
329cabdff1aSopenharmony_ci
330cabdff1aSopenharmony_cistatic const uint8_t dc_code_tab[5] = { 0, 0, 0, 1, 1 };
331cabdff1aSopenharmony_ci
332cabdff1aSopenharmony_cistatic const uint8_t ht_code_tab[5] = { 0, 0, 1, 2, 2 };
333cabdff1aSopenharmony_ci
334cabdff1aSopenharmony_cistatic const uint8_t band_ofs_tab[3][4] = {
335cabdff1aSopenharmony_ci    { 12, 8, 4, 0 }, { 14, 10, 6, 0 }, { 12, 8, 4, 0 }
336cabdff1aSopenharmony_ci};
337cabdff1aSopenharmony_ci
338cabdff1aSopenharmony_cistatic const uint8_t band_low_tab[3] = { 9, 17, 24 };
339cabdff1aSopenharmony_ci
340cabdff1aSopenharmony_cistatic const uint16_t fast_gain_tab[8] = {
341cabdff1aSopenharmony_ci    128, 256, 384, 512, 640, 768, 896, 1024
342cabdff1aSopenharmony_ci};
343cabdff1aSopenharmony_ci
344cabdff1aSopenharmony_cistatic const uint16_t slow_decay_tab[2][2] = { { 27, -1 }, { 32, 21 } };
345cabdff1aSopenharmony_ci
346cabdff1aSopenharmony_cistatic const uint16_t misc_decay_tab[3][2][2] = {
347cabdff1aSopenharmony_ci    { { 354, -1 }, { 425, 425 } },
348cabdff1aSopenharmony_ci    { { 266, -1 }, { 320,  -1 } },
349cabdff1aSopenharmony_ci    { { 213, -1 }, { 256,  -1 } }
350cabdff1aSopenharmony_ci};
351cabdff1aSopenharmony_ci
352cabdff1aSopenharmony_cistatic const uint16_t fast_decay_tab[3][2][2][50] = {
353cabdff1aSopenharmony_ci    {{{
354cabdff1aSopenharmony_ci        142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
355cabdff1aSopenharmony_ci        142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
356cabdff1aSopenharmony_ci        142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
357cabdff1aSopenharmony_ci        142, 142, 142, 142, 142, 142, 142, 142,
358cabdff1aSopenharmony_ci    }, {
359cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
360cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
361cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
362cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
363cabdff1aSopenharmony_ci    }}, {{
364cabdff1aSopenharmony_ci        170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
365cabdff1aSopenharmony_ci        170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
366cabdff1aSopenharmony_ci        170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
367cabdff1aSopenharmony_ci        170, 170, 170, 170, 170, 170, 170, 170,
368cabdff1aSopenharmony_ci    }, {
369cabdff1aSopenharmony_ci         64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
370cabdff1aSopenharmony_ci         64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
371cabdff1aSopenharmony_ci         64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
372cabdff1aSopenharmony_ci         64,  64,  64,  64,  64,  64,  64,  64,
373cabdff1aSopenharmony_ci    }}}, {{{
374cabdff1aSopenharmony_ci        266, 266, 106, 106, 106, 106, 106, 106, 106, 106,
375cabdff1aSopenharmony_ci        106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
376cabdff1aSopenharmony_ci        106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
377cabdff1aSopenharmony_ci        106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
378cabdff1aSopenharmony_ci        106, 106, 106, 106,
379cabdff1aSopenharmony_ci    }, {
380cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
381cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
382cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
383cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
384cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,
385cabdff1aSopenharmony_ci    }}, {{
386cabdff1aSopenharmony_ci        319, 319, 128, 128, 128, 128, 128, 128, 128, 128,
387cabdff1aSopenharmony_ci        128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
388cabdff1aSopenharmony_ci        128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
389cabdff1aSopenharmony_ci        128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
390cabdff1aSopenharmony_ci        128, 128, 128, 128,
391cabdff1aSopenharmony_ci    }, {
392cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
393cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
394cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
395cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
396cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,
397cabdff1aSopenharmony_ci    }}}, {{{
398cabdff1aSopenharmony_ci        106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
399cabdff1aSopenharmony_ci        106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
400cabdff1aSopenharmony_ci        106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
401cabdff1aSopenharmony_ci        106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
402cabdff1aSopenharmony_ci        106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
403cabdff1aSopenharmony_ci    }, {
404cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
405cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
406cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
407cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
408cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
409cabdff1aSopenharmony_ci    }}, {{
410cabdff1aSopenharmony_ci        128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
411cabdff1aSopenharmony_ci        128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
412cabdff1aSopenharmony_ci        128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
413cabdff1aSopenharmony_ci        128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
414cabdff1aSopenharmony_ci        128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
415cabdff1aSopenharmony_ci    }, {
416cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
417cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
418cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
419cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
420cabdff1aSopenharmony_ci         -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
421cabdff1aSopenharmony_ci    }}}
422cabdff1aSopenharmony_ci};
423cabdff1aSopenharmony_ci
424cabdff1aSopenharmony_cistatic const uint16_t fast_gain_adj_tab[3][2][62] = {
425cabdff1aSopenharmony_ci    {{
426cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
427cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
428cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
429cabdff1aSopenharmony_ci          0,   1,   2,   4,   7,  11,  16,  29,  44,  59,
430cabdff1aSopenharmony_ci         76,  94, 116, 142, 179, 221, 252, 285, 312, 334,
431cabdff1aSopenharmony_ci    }, {
432cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
433cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
434cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
435cabdff1aSopenharmony_ci          2,   5,   8,  10,  15,  28,  42,  57,  75,  93,
436cabdff1aSopenharmony_ci        115, 140, 177, 219, 247, 280, 308, 330, 427, 533,
437cabdff1aSopenharmony_ci    }}, {{
438cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
439cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
440cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
441cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
442cabdff1aSopenharmony_ci          0,   2,   5,   8,  12,  21,  35,  51,  69,  89,
443cabdff1aSopenharmony_ci        111, 138, 176, 220, 251, 284, 312, 334,
444cabdff1aSopenharmony_ci    }, {
445cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
446cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
447cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
448cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   2,
449cabdff1aSopenharmony_ci          5,   8,  11,  18,  33,  49,  65,  84, 106, 132,
450cabdff1aSopenharmony_ci        168, 214, 245, 279, 308, 329, 427, 533,
451cabdff1aSopenharmony_ci    }}, {{
452cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
453cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
454cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
455cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
456cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   1,   4,   7,  10,  17,
457cabdff1aSopenharmony_ci         31,  47,  65,  84, 107, 134, 171, 215, 250, 283,
458cabdff1aSopenharmony_ci        312, 334,
459cabdff1aSopenharmony_ci    }, {
460cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
461cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
462cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
463cabdff1aSopenharmony_ci          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
464cabdff1aSopenharmony_ci          0,   0,   0,   0,   3,   6,   9,  13,  27,  43,
465cabdff1aSopenharmony_ci         60,  79, 100, 126, 160, 207, 242, 276, 307, 329,
466cabdff1aSopenharmony_ci        427, 533,
467cabdff1aSopenharmony_ci    }}
468cabdff1aSopenharmony_ci};
469cabdff1aSopenharmony_ci
470cabdff1aSopenharmony_cistatic const uint16_t slow_gain_tab[3][2][50] = {
471cabdff1aSopenharmony_ci    {{
472cabdff1aSopenharmony_ci        3072, 3072, 3072, 3072, 3072, 3072, 1063, 1063, 1063, 1063,
473cabdff1aSopenharmony_ci        1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
474cabdff1aSopenharmony_ci        1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
475cabdff1aSopenharmony_ci        1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
476cabdff1aSopenharmony_ci    }, {
477cabdff1aSopenharmony_ci        3072, 3072, 3072, 3072, 3072, 3072,  850,  850,  850,  850,
478cabdff1aSopenharmony_ci         850,  850,  850,  850,  850,  850,  850,  850,  850,  850,
479cabdff1aSopenharmony_ci         850,  850,  850,  850,  850,  850,  850,  850,  850,  850,
480cabdff1aSopenharmony_ci         850,  850,  850,  850,  850,  850,  850,  850,
481cabdff1aSopenharmony_ci    }}, {{
482cabdff1aSopenharmony_ci        3072, 1212, 1212, 1212,  999,  999,  999,  999,  999,  999,
483cabdff1aSopenharmony_ci         999,  999,  999,  999,  999,  999,  999,  999,  999,  999,
484cabdff1aSopenharmony_ci         999,  999,  999,  999,  999,  999,  999,  999,  999,  999,
485cabdff1aSopenharmony_ci         999,  999,  999,  999,  999,  999,  999,  999,  999,  999,
486cabdff1aSopenharmony_ci         999,  999,  999,  999,
487cabdff1aSopenharmony_ci    }, {
488cabdff1aSopenharmony_ci          -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
489cabdff1aSopenharmony_ci          -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
490cabdff1aSopenharmony_ci          -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
491cabdff1aSopenharmony_ci          -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
492cabdff1aSopenharmony_ci          -1,   -1,   -1,   -1,
493cabdff1aSopenharmony_ci    }}, {{
494cabdff1aSopenharmony_ci        3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072,
495cabdff1aSopenharmony_ci         999,  999,  999,  999,  999,  999,  999,  999,  999,  999,
496cabdff1aSopenharmony_ci         999,  999,  999,  999,  999,  999,  999,  999,  999,  999,
497cabdff1aSopenharmony_ci         999,  999,  999,  999,  999,  999,  999,  999,  999,  999,
498cabdff1aSopenharmony_ci         999,  999,  999,  999,  999,  999,  999,  999,  999,  999,
499cabdff1aSopenharmony_ci    }, {
500cabdff1aSopenharmony_ci          -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
501cabdff1aSopenharmony_ci          -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
502cabdff1aSopenharmony_ci          -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
503cabdff1aSopenharmony_ci          -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
504cabdff1aSopenharmony_ci          -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
505cabdff1aSopenharmony_ci    }}
506cabdff1aSopenharmony_ci};
507cabdff1aSopenharmony_ci
508cabdff1aSopenharmony_cistatic const uint16_t hearing_thresh_tab[3][3][50] = {
509cabdff1aSopenharmony_ci    {{
510cabdff1aSopenharmony_ci        1403, 1141, 1000,  959,  948,  957,  946,  925,  899,  871,
511cabdff1aSopenharmony_ci         843,  815,  789,  766,  745,  727,  705,  687,  681,  686,
512cabdff1aSopenharmony_ci         701,  725,  768,  854,  940, 1018, 1075, 1103, 1111, 1106,
513cabdff1aSopenharmony_ci        1098, 1105, 1142, 1237, 1419, 1721, 2169, 2805,
514cabdff1aSopenharmony_ci    }, {
515cabdff1aSopenharmony_ci        1401, 1130,  995,  957,  947,  955,  941,  918,  890,  861,
516cabdff1aSopenharmony_ci         831,  803,  777,  754,  734,  717,  698,  684,  682,  692,
517cabdff1aSopenharmony_ci         712,  743,  798,  894,  976, 1045, 1091, 1109, 1110, 1102,
518cabdff1aSopenharmony_ci        1098, 1116, 1174, 1300, 1526, 1884, 2401, 3072,
519cabdff1aSopenharmony_ci    }, {
520cabdff1aSopenharmony_ci        1393, 1086,  974,  949,  957,  941,  913,  878,  843,  808,
521cabdff1aSopenharmony_ci         777,  750,  727,  708,  695,  686,  681,  689,  714,  752,
522cabdff1aSopenharmony_ci         811,  888,  971, 1044, 1087, 1108, 1110, 1102, 1098, 1115,
523cabdff1aSopenharmony_ci        1172, 1290, 1489, 1812, 2293, 2964, 3072, 3072,
524cabdff1aSopenharmony_ci    }}, {{
525cabdff1aSopenharmony_ci        1412, 1343, 1141, 1047, 1000,  974,  959,  951,  948,  947,
526cabdff1aSopenharmony_ci         957,  953,  946,  936,  925,  906,  878,  850,  822,  795,
527cabdff1aSopenharmony_ci         771,  745,  719,  700,  687,  681,  685,  701,  733,  784,
528cabdff1aSopenharmony_ci         885,  977, 1047, 1092, 1110, 1108, 1099, 1102, 1138, 1233,
529cabdff1aSopenharmony_ci        1413, 1711, 2157, 2797,
530cabdff1aSopenharmony_ci    }, {
531cabdff1aSopenharmony_ci        1412, 1336, 1130, 1040,  995,  970,  957,  950,  947,  947,
532cabdff1aSopenharmony_ci         955,  950,  941,  930,  918,  897,  868,  838,  810,  783,
533cabdff1aSopenharmony_ci         759,  734,  710,  693,  684,  681,  690,  712,  752,  823,
534cabdff1aSopenharmony_ci         924, 1009, 1069, 1102, 1111, 1104, 1098, 1111, 1168, 1295,
535cabdff1aSopenharmony_ci        1518, 1873, 2388, 3072,
536cabdff1aSopenharmony_ci    }, {
537cabdff1aSopenharmony_ci        1411, 1293, 1086, 1009,  974,  957,  949,  947,  957,  951,
538cabdff1aSopenharmony_ci         941,  928,  913,  896,  878,  852,  817,  785,  756,  732,
539cabdff1aSopenharmony_ci         713,  695,  683,  682,  689,  710,  746,  811,  906,  992,
540cabdff1aSopenharmony_ci        1061, 1099, 1111, 1106, 1098, 1107, 1155, 1266, 1471, 1799,
541cabdff1aSopenharmony_ci        2277, 2945, 3072, 3072,
542cabdff1aSopenharmony_ci    }}, {{
543cabdff1aSopenharmony_ci        1431, 1412, 1403, 1379, 1343, 1293, 1229, 1180, 1125, 1075,
544cabdff1aSopenharmony_ci        1040, 1014,  996,  979,  965,  957,  951,  948,  947,  957,
545cabdff1aSopenharmony_ci         951,  940,  924,  903,  877,  846,  815,  785,  753,  725,
546cabdff1aSopenharmony_ci         702,  686,  681,  689,  714,  760,  847,  947, 1028, 1083,
547cabdff1aSopenharmony_ci        1108, 1109, 1101, 1100, 1132, 1222, 1402, 1705, 2160, 2803,
548cabdff1aSopenharmony_ci    }, {
549cabdff1aSopenharmony_ci        1431, 1412, 1401, 1375, 1336, 1278, 1215, 1168, 1115, 1066,
550cabdff1aSopenharmony_ci        1032, 1008,  991,  975,  962,  954,  950,  947,  947,  955,
551cabdff1aSopenharmony_ci         948,  935,  916,  894,  866,  835,  803,  772,  742,  715,
552cabdff1aSopenharmony_ci         695,  683,  683,  697,  729,  784,  887,  982, 1054, 1096,
553cabdff1aSopenharmony_ci        1111, 1106, 1098, 1107, 1159, 1281, 1505, 1865, 2391, 3072,
554cabdff1aSopenharmony_ci    }, {
555cabdff1aSopenharmony_ci        1427, 1411, 1393, 1353, 1293, 1215, 1160, 1118, 1072, 1031,
556cabdff1aSopenharmony_ci        1003,  984,  971,  960,  952,  948,  947,  957,  952,  941,
557cabdff1aSopenharmony_ci         924,  902,  876,  847,  815,  781,  750,  723,  700,  685,
558cabdff1aSopenharmony_ci         681,  691,  719,  766,  858,  958, 1039, 1089, 1109, 1108,
559cabdff1aSopenharmony_ci        1099, 1102, 1141, 1245, 1442, 1766, 2250, 2930, 3072, 3072,
560cabdff1aSopenharmony_ci    }}
561cabdff1aSopenharmony_ci};
562cabdff1aSopenharmony_ci
563cabdff1aSopenharmony_cistatic const int16_t lwc_gain_tab[11][7] = {
564cabdff1aSopenharmony_ci    {   -21,  -197,  -271,  -466, 32767, 32767, 32767 },
565cabdff1aSopenharmony_ci    {  -197,   -29,  -244,  -271,  -540, 32767, 32767 },
566cabdff1aSopenharmony_ci    {  -271,  -244,   -29,  -249,  -271,  -593, 32767 },
567cabdff1aSopenharmony_ci    {  -466,  -271,  -249,   -29,  -251,  -271,  -632 },
568cabdff1aSopenharmony_ci    {  -540,  -271,  -251,   -29,  -251,  -271,  -664 },
569cabdff1aSopenharmony_ci    {  -593,  -271,  -251,   -29,  -252,  -271,  -690 },
570cabdff1aSopenharmony_ci    {  -632,  -271,  -252,   -29,  -252,  -271,  -711 },
571cabdff1aSopenharmony_ci    {  -664,  -271,  -252,   -29,  -252,  -271,  -730 },
572cabdff1aSopenharmony_ci    {  -690,  -271,  -252,   -29,  -252,  -271,  -745 },
573cabdff1aSopenharmony_ci    {  -711,  -271,  -252,   -29,  -253,  -271,  -759 },
574cabdff1aSopenharmony_ci    {  -730,  -271,  -253,   -29,  -253,  -271,  -771 },
575cabdff1aSopenharmony_ci};
576cabdff1aSopenharmony_ci
577cabdff1aSopenharmony_cistatic const int16_t lwc_adj_tab[7] = {
578cabdff1aSopenharmony_ci    -192, -320, -448, -512, -448, -320, -192,
579cabdff1aSopenharmony_ci};
580cabdff1aSopenharmony_ci
581cabdff1aSopenharmony_cistatic const uint8_t log_add_tab[212] = {
582cabdff1aSopenharmony_ci    64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 52, 51, 50,
583cabdff1aSopenharmony_ci    49, 48, 47, 47, 46, 45, 44, 44, 43, 42, 41, 41, 40, 39, 38, 38,
584cabdff1aSopenharmony_ci    37, 36, 36, 35, 35, 34, 33, 33, 32, 32, 31, 30, 30, 29, 29, 28,
585cabdff1aSopenharmony_ci    28, 27, 27, 26, 26, 25, 25, 24, 24, 23, 23, 22, 22, 21, 21, 21,
586cabdff1aSopenharmony_ci    20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 17, 16, 16, 16, 15, 15,
587cabdff1aSopenharmony_ci    15, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 11,
588cabdff1aSopenharmony_ci    10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  8,  8,  8,  8,  8,  8,
589cabdff1aSopenharmony_ci     7,  7,  7,  7,  7,  7,  6,  6,  6,  6,  6,  6,  6,  6,  5,  5,
590cabdff1aSopenharmony_ci     5,  5,  5,  5,  5,  5,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
591cabdff1aSopenharmony_ci     4,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  2,
592cabdff1aSopenharmony_ci     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
593cabdff1aSopenharmony_ci     2,  2,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
594cabdff1aSopenharmony_ci     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
595cabdff1aSopenharmony_ci     1,  1,  0,  0,
596cabdff1aSopenharmony_ci};
597cabdff1aSopenharmony_ci
598cabdff1aSopenharmony_cistatic const uint8_t bap_tab[64] = {
599cabdff1aSopenharmony_ci     0,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  3,  3,  3,  3,  4,
600cabdff1aSopenharmony_ci     4,  4,  4,  5,  5,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,  8,
601cabdff1aSopenharmony_ci     8,  8,  8,  9,  9,  9,  9, 10, 10, 10, 10, 11, 11, 11, 11, 12,
602cabdff1aSopenharmony_ci    12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15,
603cabdff1aSopenharmony_ci};
604cabdff1aSopenharmony_ci
605cabdff1aSopenharmony_cistatic float mantissa_tab1[17][4];
606cabdff1aSopenharmony_cistatic float mantissa_tab2[17][4];
607cabdff1aSopenharmony_cistatic float mantissa_tab3[17][4];
608cabdff1aSopenharmony_cistatic float exponent_tab[50];
609cabdff1aSopenharmony_cistatic float gain_tab[1024];
610cabdff1aSopenharmony_ci
611cabdff1aSopenharmony_ciDECLARE_ALIGNED(32, static float, window)[3712];
612cabdff1aSopenharmony_ci
613cabdff1aSopenharmony_cistatic int skip_input(DBEContext *s, int nb_words)
614cabdff1aSopenharmony_ci{
615cabdff1aSopenharmony_ci    if (nb_words > s->input_size) {
616cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Packet too short\n");
617cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
618cabdff1aSopenharmony_ci    }
619cabdff1aSopenharmony_ci
620cabdff1aSopenharmony_ci    s->input      += nb_words * s->word_bytes;
621cabdff1aSopenharmony_ci    s->input_size -= nb_words;
622cabdff1aSopenharmony_ci    return 0;
623cabdff1aSopenharmony_ci}
624cabdff1aSopenharmony_ci
625cabdff1aSopenharmony_cistatic int parse_key(DBEContext *s)
626cabdff1aSopenharmony_ci{
627cabdff1aSopenharmony_ci    if (s->key_present) {
628cabdff1aSopenharmony_ci        const uint8_t *key = s->input;
629cabdff1aSopenharmony_ci        int      ret = skip_input(s, 1);
630cabdff1aSopenharmony_ci        if (ret < 0)
631cabdff1aSopenharmony_ci            return ret;
632cabdff1aSopenharmony_ci        return AV_RB24(key) >> 24 - s->word_bits;
633cabdff1aSopenharmony_ci    }
634cabdff1aSopenharmony_ci    return 0;
635cabdff1aSopenharmony_ci}
636cabdff1aSopenharmony_ci
637cabdff1aSopenharmony_cistatic int parse_metadata_ext(DBEDecodeContext *s1)
638cabdff1aSopenharmony_ci{
639cabdff1aSopenharmony_ci    DBEContext *s = &s1->dectx;
640cabdff1aSopenharmony_ci    if (s->metadata.mtd_ext_size)
641cabdff1aSopenharmony_ci        return skip_input(s, s->key_present + s->metadata.mtd_ext_size + 1);
642cabdff1aSopenharmony_ci    return 0;
643cabdff1aSopenharmony_ci}
644cabdff1aSopenharmony_ci
645cabdff1aSopenharmony_cistatic void unbias_exponents(DBEContext *s, DBEChannel *c, DBEGroup *g)
646cabdff1aSopenharmony_ci{
647cabdff1aSopenharmony_ci    int mstr_exp[MAX_MSTR_EXP];
648cabdff1aSopenharmony_ci    int bias_exp[MAX_BIAS_EXP];
649cabdff1aSopenharmony_ci    int i, j, k;
650cabdff1aSopenharmony_ci
651cabdff1aSopenharmony_ci    for (i = 0; i < c->nb_mstr_exp; i++)
652cabdff1aSopenharmony_ci        mstr_exp[i] = get_bits(&s->gb, 2) * 6;
653cabdff1aSopenharmony_ci
654cabdff1aSopenharmony_ci    for (i = 0; i < g->nb_exponent; i++)
655cabdff1aSopenharmony_ci        bias_exp[i] = get_bits(&s->gb, 5);
656cabdff1aSopenharmony_ci
657cabdff1aSopenharmony_ci    for (i = k = 0; i < c->nb_mstr_exp; i++)
658cabdff1aSopenharmony_ci        for (j = 0; j < g->nb_bias_exp[i]; j++, k++)
659cabdff1aSopenharmony_ci            c->exponents[g->exp_ofs + k] = mstr_exp[i] + bias_exp[k];
660cabdff1aSopenharmony_ci}
661cabdff1aSopenharmony_ci
662cabdff1aSopenharmony_cistatic int parse_exponents(DBEContext *s, DBEChannel *c)
663cabdff1aSopenharmony_ci{
664cabdff1aSopenharmony_ci    DBEGroup *p, *g;
665cabdff1aSopenharmony_ci    int i;
666cabdff1aSopenharmony_ci
667cabdff1aSopenharmony_ci    for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) {
668cabdff1aSopenharmony_ci        c->exp_strategy[i] = !i || g->nb_exponent != p->nb_exponent || get_bits1(&s->gb);
669cabdff1aSopenharmony_ci        if (c->exp_strategy[i]) {
670cabdff1aSopenharmony_ci            unbias_exponents(s, c, g);
671cabdff1aSopenharmony_ci        } else {
672cabdff1aSopenharmony_ci            memcpy(c->exponents + g->exp_ofs,
673cabdff1aSopenharmony_ci                   c->exponents + p->exp_ofs,
674cabdff1aSopenharmony_ci                   g->nb_exponent * sizeof(c->exponents[0]));
675cabdff1aSopenharmony_ci        }
676cabdff1aSopenharmony_ci    }
677cabdff1aSopenharmony_ci
678cabdff1aSopenharmony_ci    return 0;
679cabdff1aSopenharmony_ci}
680cabdff1aSopenharmony_ci
681cabdff1aSopenharmony_cistatic inline int log_add(int a, int b)
682cabdff1aSopenharmony_ci{
683cabdff1aSopenharmony_ci    int c = FFABS(a - b) >> 1;
684cabdff1aSopenharmony_ci    return FFMAX(a, b) + log_add_tab[FFMIN(c, 211)];
685cabdff1aSopenharmony_ci}
686cabdff1aSopenharmony_ci
687cabdff1aSopenharmony_cistatic void calc_lowcomp(int *msk_val)
688cabdff1aSopenharmony_ci{
689cabdff1aSopenharmony_ci    int lwc_val[17] = { 0 };
690cabdff1aSopenharmony_ci    int i, j, k;
691cabdff1aSopenharmony_ci
692cabdff1aSopenharmony_ci    for (i = 0; i < 11; i++) {
693cabdff1aSopenharmony_ci        int max_j = 0;
694cabdff1aSopenharmony_ci        int max_v = INT_MIN;
695cabdff1aSopenharmony_ci        int thr   = 0;
696cabdff1aSopenharmony_ci
697cabdff1aSopenharmony_ci        for (j = FFMAX(i - 3, 0), k = 0; j <= i + 3; j++, k++) {
698cabdff1aSopenharmony_ci            int v = msk_val[j] + lwc_gain_tab[i][k];
699cabdff1aSopenharmony_ci            if (v > max_v) {
700cabdff1aSopenharmony_ci                max_j = j;
701cabdff1aSopenharmony_ci                max_v = v;
702cabdff1aSopenharmony_ci            }
703cabdff1aSopenharmony_ci            thr = log_add(thr, v);
704cabdff1aSopenharmony_ci        }
705cabdff1aSopenharmony_ci
706cabdff1aSopenharmony_ci        if (msk_val[i] < thr) {
707cabdff1aSopenharmony_ci            for (j = FFMAX(max_j - 3, 0),
708cabdff1aSopenharmony_ci                 k = FFMAX(3 - max_j, 0);
709cabdff1aSopenharmony_ci                 j <= max_j + 3; j++, k++)
710cabdff1aSopenharmony_ci                lwc_val[j] += lwc_adj_tab[k];
711cabdff1aSopenharmony_ci        }
712cabdff1aSopenharmony_ci    }
713cabdff1aSopenharmony_ci
714cabdff1aSopenharmony_ci    for (i = 0; i < 16; i++) {
715cabdff1aSopenharmony_ci        int v = FFMAX(lwc_val[i], -512);
716cabdff1aSopenharmony_ci        msk_val[i] = FFMAX(msk_val[i] + v, 0);
717cabdff1aSopenharmony_ci    }
718cabdff1aSopenharmony_ci}
719cabdff1aSopenharmony_ci
720cabdff1aSopenharmony_cistatic void bit_allocate(int nb_exponent, int nb_code, int fr_code,
721cabdff1aSopenharmony_ci                         int *exp, int *bap,
722cabdff1aSopenharmony_ci                         int fg_spc, int fg_ofs, int msk_mod, int snr_ofs)
723cabdff1aSopenharmony_ci{
724cabdff1aSopenharmony_ci    int msk_val[MAX_BIAS_EXP];
725cabdff1aSopenharmony_ci    int psd_val[MAX_BIAS_EXP];
726cabdff1aSopenharmony_ci    int fast_leak  = 0;
727cabdff1aSopenharmony_ci    int slow_leak  = 0;
728cabdff1aSopenharmony_ci    int dc_code    = dc_code_tab[fr_code - 1];
729cabdff1aSopenharmony_ci    int ht_code    = ht_code_tab[fr_code - 1];
730cabdff1aSopenharmony_ci    int fast_gain  = fast_gain_tab[fg_ofs];
731cabdff1aSopenharmony_ci    int slow_decay = slow_decay_tab[dc_code][msk_mod];
732cabdff1aSopenharmony_ci    int misc_decay = misc_decay_tab[nb_code][dc_code][msk_mod];
733cabdff1aSopenharmony_ci    const uint16_t *slow_gain      = slow_gain_tab[nb_code][msk_mod];
734cabdff1aSopenharmony_ci    const uint16_t *fast_decay     = fast_decay_tab[nb_code][dc_code][msk_mod];
735cabdff1aSopenharmony_ci    const uint16_t *fast_gain_adj  = fast_gain_adj_tab[nb_code][dc_code];
736cabdff1aSopenharmony_ci    const uint16_t *hearing_thresh = hearing_thresh_tab[nb_code][ht_code];
737cabdff1aSopenharmony_ci    int i;
738cabdff1aSopenharmony_ci
739cabdff1aSopenharmony_ci    for (i = 0; i < nb_exponent; i++)
740cabdff1aSopenharmony_ci        psd_val[i] = (48 - exp[i]) * 64;
741cabdff1aSopenharmony_ci
742cabdff1aSopenharmony_ci    fast_gain_adj += band_ofs_tab[nb_code][fg_spc];
743cabdff1aSopenharmony_ci    for (i = 0; i < nb_exponent; i++) {
744cabdff1aSopenharmony_ci        fast_leak = log_add(fast_leak  - fast_decay[i],
745cabdff1aSopenharmony_ci                            psd_val[i] - fast_gain + fast_gain_adj[i]);
746cabdff1aSopenharmony_ci        slow_leak = log_add(slow_leak  - slow_decay,
747cabdff1aSopenharmony_ci                            psd_val[i] - slow_gain[i]);
748cabdff1aSopenharmony_ci        msk_val[i] = FFMAX(fast_leak, slow_leak);
749cabdff1aSopenharmony_ci    }
750cabdff1aSopenharmony_ci
751cabdff1aSopenharmony_ci    fast_leak = 0;
752cabdff1aSopenharmony_ci    for (i = nb_exponent - 1; i > band_low_tab[nb_code]; i--) {
753cabdff1aSopenharmony_ci        fast_leak = log_add(fast_leak - misc_decay, psd_val[i] - fast_gain);
754cabdff1aSopenharmony_ci        msk_val[i] = FFMAX(msk_val[i], fast_leak);
755cabdff1aSopenharmony_ci    }
756cabdff1aSopenharmony_ci
757cabdff1aSopenharmony_ci    for (i = 0; i < nb_exponent; i++)
758cabdff1aSopenharmony_ci        msk_val[i] = FFMAX(msk_val[i], hearing_thresh[i]);
759cabdff1aSopenharmony_ci
760cabdff1aSopenharmony_ci    if (!nb_code)
761cabdff1aSopenharmony_ci        calc_lowcomp(msk_val);
762cabdff1aSopenharmony_ci
763cabdff1aSopenharmony_ci    for (i = 0; i < nb_exponent; i++) {
764cabdff1aSopenharmony_ci        int v = 16 * (snr_ofs - 64) + psd_val[i] - msk_val[i] >> 5;
765cabdff1aSopenharmony_ci        bap[i] = bap_tab[av_clip_uintp2(v, 6)];
766cabdff1aSopenharmony_ci    }
767cabdff1aSopenharmony_ci}
768cabdff1aSopenharmony_ci
769cabdff1aSopenharmony_cistatic int parse_bit_alloc(DBEDecodeContext *s1, DBEChannel *c)
770cabdff1aSopenharmony_ci{
771cabdff1aSopenharmony_ci    DBEContext *s = &s1->dectx;
772cabdff1aSopenharmony_ci    DBEGroup *p, *g;
773cabdff1aSopenharmony_ci    int bap_strategy[MAX_GROUPS], fg_spc[MAX_GROUPS];
774cabdff1aSopenharmony_ci    int fg_ofs[MAX_GROUPS], msk_mod[MAX_GROUPS];
775cabdff1aSopenharmony_ci    int i, snr_ofs;
776cabdff1aSopenharmony_ci
777cabdff1aSopenharmony_ci    for (i = 0; i < c->nb_groups; i++) {
778cabdff1aSopenharmony_ci        bap_strategy[i] = !i || get_bits1(&s->gb);
779cabdff1aSopenharmony_ci        if (bap_strategy[i]) {
780cabdff1aSopenharmony_ci             fg_spc[i] = get_bits(&s->gb, 2);
781cabdff1aSopenharmony_ci             fg_ofs[i] = get_bits(&s->gb, 3);
782cabdff1aSopenharmony_ci            msk_mod[i] = get_bits1(&s->gb);
783cabdff1aSopenharmony_ci        } else {
784cabdff1aSopenharmony_ci             fg_spc[i] =  fg_spc[i - 1];
785cabdff1aSopenharmony_ci             fg_ofs[i] =  fg_ofs[i - 1];
786cabdff1aSopenharmony_ci            msk_mod[i] = msk_mod[i - 1];
787cabdff1aSopenharmony_ci        }
788cabdff1aSopenharmony_ci    }
789cabdff1aSopenharmony_ci
790cabdff1aSopenharmony_ci    if (get_bits1(&s->gb)) {
791cabdff1aSopenharmony_ci        avpriv_report_missing_feature(s->avctx, "Delta bit allocation");
792cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
793cabdff1aSopenharmony_ci    }
794cabdff1aSopenharmony_ci
795cabdff1aSopenharmony_ci    snr_ofs = get_bits(&s->gb, 8);
796cabdff1aSopenharmony_ci    if (!snr_ofs) {
797cabdff1aSopenharmony_ci        memset(c->bap, 0, sizeof(c->bap));
798cabdff1aSopenharmony_ci        return 0;
799cabdff1aSopenharmony_ci    }
800cabdff1aSopenharmony_ci
801cabdff1aSopenharmony_ci    for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) {
802cabdff1aSopenharmony_ci        if (c->exp_strategy[i] || bap_strategy[i]) {
803cabdff1aSopenharmony_ci            bit_allocate(g->nb_exponent, g->imdct_idx, s->metadata.fr_code,
804cabdff1aSopenharmony_ci                         c->exponents + g->exp_ofs, c->bap + g->exp_ofs,
805cabdff1aSopenharmony_ci                         fg_spc[i], fg_ofs[i], msk_mod[i], snr_ofs);
806cabdff1aSopenharmony_ci        } else {
807cabdff1aSopenharmony_ci            memcpy(c->bap + g->exp_ofs,
808cabdff1aSopenharmony_ci                   c->bap + p->exp_ofs,
809cabdff1aSopenharmony_ci                   g->nb_exponent * sizeof(c->bap[0]));
810cabdff1aSopenharmony_ci        }
811cabdff1aSopenharmony_ci    }
812cabdff1aSopenharmony_ci
813cabdff1aSopenharmony_ci    return 0;
814cabdff1aSopenharmony_ci}
815cabdff1aSopenharmony_ci
816cabdff1aSopenharmony_cistatic int parse_indices(DBEContext *s, DBEChannel *c)
817cabdff1aSopenharmony_ci{
818cabdff1aSopenharmony_ci    DBEGroup *p, *g;
819cabdff1aSopenharmony_ci    int i, j;
820cabdff1aSopenharmony_ci
821cabdff1aSopenharmony_ci    for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) {
822cabdff1aSopenharmony_ci        if (get_bits1(&s->gb)) {
823cabdff1aSopenharmony_ci            int start = get_bits(&s->gb, 6);
824cabdff1aSopenharmony_ci
825cabdff1aSopenharmony_ci            if (start > g->nb_exponent) {
826cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "Invalid start index\n");
827cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
828cabdff1aSopenharmony_ci            }
829cabdff1aSopenharmony_ci
830cabdff1aSopenharmony_ci            for (j = 0; j < start; j++)
831cabdff1aSopenharmony_ci                c->idx[g->exp_ofs + j] = 0;
832cabdff1aSopenharmony_ci
833cabdff1aSopenharmony_ci            for (; j < g->nb_exponent; j++)
834cabdff1aSopenharmony_ci                c->idx[g->exp_ofs + j] = get_bits(&s->gb, 2);
835cabdff1aSopenharmony_ci        } else if (i && g->nb_exponent == p->nb_exponent) {
836cabdff1aSopenharmony_ci            memcpy(c->idx + g->exp_ofs,
837cabdff1aSopenharmony_ci                   c->idx + p->exp_ofs,
838cabdff1aSopenharmony_ci                   g->nb_exponent * sizeof(c->idx[0]));
839cabdff1aSopenharmony_ci        } else {
840cabdff1aSopenharmony_ci            memset(c->idx + g->exp_ofs, 0, g->nb_exponent * sizeof(c->idx[0]));
841cabdff1aSopenharmony_ci        }
842cabdff1aSopenharmony_ci    }
843cabdff1aSopenharmony_ci
844cabdff1aSopenharmony_ci    return 0;
845cabdff1aSopenharmony_ci}
846cabdff1aSopenharmony_ci
847cabdff1aSopenharmony_cistatic int parse_mantissas(DBEContext *s, DBEChannel *c)
848cabdff1aSopenharmony_ci{
849cabdff1aSopenharmony_ci    DBEGroup *g;
850cabdff1aSopenharmony_ci    int i, j, k;
851cabdff1aSopenharmony_ci
852cabdff1aSopenharmony_ci    for (i = 0, g = c->groups; i < c->nb_groups; i++, g++) {
853cabdff1aSopenharmony_ci        float *mnt = c->mantissas + g->mnt_ofs;
854cabdff1aSopenharmony_ci
855cabdff1aSopenharmony_ci        for (j = 0; j < g->nb_exponent; j++) {
856cabdff1aSopenharmony_ci            int bap     = c->bap[g->exp_ofs + j];
857cabdff1aSopenharmony_ci            int idx     = c->idx[g->exp_ofs + j];
858cabdff1aSopenharmony_ci            int size1   = mantissa_size1[bap][idx];
859cabdff1aSopenharmony_ci            int count   = g->nb_mantissa[j];
860cabdff1aSopenharmony_ci            float exp   = exponent_tab[c->exponents[g->exp_ofs + j]];
861cabdff1aSopenharmony_ci            float scale = mantissa_tab1[size1][idx] * exp;
862cabdff1aSopenharmony_ci
863cabdff1aSopenharmony_ci            if (!size1) {
864cabdff1aSopenharmony_ci                memset(mnt, 0, count * sizeof(*mnt));
865cabdff1aSopenharmony_ci            } else if (idx) {
866cabdff1aSopenharmony_ci                int values[100];
867cabdff1aSopenharmony_ci                int escape = -(1 << size1 - 1);
868cabdff1aSopenharmony_ci
869cabdff1aSopenharmony_ci                for (k = 0; k < count; k++)
870cabdff1aSopenharmony_ci                    values[k] = get_sbits(&s->gb, size1);
871cabdff1aSopenharmony_ci
872cabdff1aSopenharmony_ci                for (k = 0; k < count; k++) {
873cabdff1aSopenharmony_ci                    if (values[k] != escape) {
874cabdff1aSopenharmony_ci                        mnt[k] = values[k] * scale;
875cabdff1aSopenharmony_ci                    } else {
876cabdff1aSopenharmony_ci                        int size2 = mantissa_size2[bap][idx];
877cabdff1aSopenharmony_ci                        int value = get_sbits(&s->gb, size2);
878cabdff1aSopenharmony_ci                        float a = mantissa_tab2[size2][idx];
879cabdff1aSopenharmony_ci                        float b = mantissa_tab3[size2][idx];
880cabdff1aSopenharmony_ci                        if (value < 0)
881cabdff1aSopenharmony_ci                            mnt[k] = ((value + 1) * a - b) * exp;
882cabdff1aSopenharmony_ci                        else
883cabdff1aSopenharmony_ci                            mnt[k] = (value * a + b) * exp;
884cabdff1aSopenharmony_ci                    }
885cabdff1aSopenharmony_ci                }
886cabdff1aSopenharmony_ci            } else {
887cabdff1aSopenharmony_ci                for (k = 0; k < count; k++)
888cabdff1aSopenharmony_ci                    mnt[k] = get_sbits(&s->gb, size1) * scale;
889cabdff1aSopenharmony_ci            }
890cabdff1aSopenharmony_ci
891cabdff1aSopenharmony_ci            mnt += count;
892cabdff1aSopenharmony_ci        }
893cabdff1aSopenharmony_ci
894cabdff1aSopenharmony_ci        for (; j < g->nb_exponent + c->bw_code; j++) {
895cabdff1aSopenharmony_ci            memset(mnt, 0, g->nb_mantissa[j] * sizeof(*mnt));
896cabdff1aSopenharmony_ci            mnt += g->nb_mantissa[j];
897cabdff1aSopenharmony_ci        }
898cabdff1aSopenharmony_ci    }
899cabdff1aSopenharmony_ci
900cabdff1aSopenharmony_ci    return 0;
901cabdff1aSopenharmony_ci}
902cabdff1aSopenharmony_ci
903cabdff1aSopenharmony_cistatic int parse_channel(DBEDecodeContext *s1, int ch, int seg_id)
904cabdff1aSopenharmony_ci{
905cabdff1aSopenharmony_ci    DBEContext *s = &s1->dectx;
906cabdff1aSopenharmony_ci    DBEChannel *c = &s1->channels[seg_id][ch];
907cabdff1aSopenharmony_ci    int i, ret;
908cabdff1aSopenharmony_ci
909cabdff1aSopenharmony_ci    if (s->metadata.rev_id[ch] > 1) {
910cabdff1aSopenharmony_ci        avpriv_report_missing_feature(s->avctx, "Encoder revision %d", s->metadata.rev_id[ch]);
911cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
912cabdff1aSopenharmony_ci    }
913cabdff1aSopenharmony_ci
914cabdff1aSopenharmony_ci    if (ch == lfe_channel_tab[s->metadata.prog_conf]) {
915cabdff1aSopenharmony_ci        c->gr_code = 3;
916cabdff1aSopenharmony_ci        c->bw_code = 29;
917cabdff1aSopenharmony_ci    } else {
918cabdff1aSopenharmony_ci        c->gr_code = get_bits(&s->gb, 2);
919cabdff1aSopenharmony_ci        c->bw_code = get_bits(&s->gb, 3);
920cabdff1aSopenharmony_ci        if (c->gr_code == 3) {
921cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid group type code\n");
922cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
923cabdff1aSopenharmony_ci        }
924cabdff1aSopenharmony_ci    }
925cabdff1aSopenharmony_ci
926cabdff1aSopenharmony_ci    c->nb_groups   = nb_groups_tab[c->gr_code];
927cabdff1aSopenharmony_ci    c->nb_mstr_exp = nb_mstr_exp_tab[c->gr_code];
928cabdff1aSopenharmony_ci
929cabdff1aSopenharmony_ci    for (i = 0; i < c->nb_groups; i++) {
930cabdff1aSopenharmony_ci        c->groups[i] = frm_ofs_tab[seg_id][c->gr_code][i];
931cabdff1aSopenharmony_ci        if (c->nb_mstr_exp == 2) {
932cabdff1aSopenharmony_ci            c->groups[i].nb_exponent    -= c->bw_code;
933cabdff1aSopenharmony_ci            c->groups[i].nb_bias_exp[1] -= c->bw_code;
934cabdff1aSopenharmony_ci        }
935cabdff1aSopenharmony_ci    }
936cabdff1aSopenharmony_ci
937cabdff1aSopenharmony_ci    if ((ret = parse_exponents(s, c)) < 0)
938cabdff1aSopenharmony_ci        return ret;
939cabdff1aSopenharmony_ci    if ((ret = parse_bit_alloc(s1, c)) < 0)
940cabdff1aSopenharmony_ci        return ret;
941cabdff1aSopenharmony_ci    if ((ret = parse_indices(s, c)) < 0)
942cabdff1aSopenharmony_ci        return ret;
943cabdff1aSopenharmony_ci    if ((ret = parse_mantissas(s, c)) < 0)
944cabdff1aSopenharmony_ci        return ret;
945cabdff1aSopenharmony_ci
946cabdff1aSopenharmony_ci    if (get_bits_left(&s->gb) < 0) {
947cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Read past end of channel %d\n", ch);
948cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
949cabdff1aSopenharmony_ci    }
950cabdff1aSopenharmony_ci
951cabdff1aSopenharmony_ci    return 0;
952cabdff1aSopenharmony_ci}
953cabdff1aSopenharmony_ci
954cabdff1aSopenharmony_cistatic int parse_audio(DBEDecodeContext *s1, int start, int end, int seg_id)
955cabdff1aSopenharmony_ci{
956cabdff1aSopenharmony_ci    DBEContext *s = &s1->dectx;
957cabdff1aSopenharmony_ci    int ch, ret, key;
958cabdff1aSopenharmony_ci
959cabdff1aSopenharmony_ci    if ((key = parse_key(s)) < 0)
960cabdff1aSopenharmony_ci        return key;
961cabdff1aSopenharmony_ci
962cabdff1aSopenharmony_ci    for (ch = start; ch < end; ch++) {
963cabdff1aSopenharmony_ci        if (!s->metadata.ch_size[ch]) {
964cabdff1aSopenharmony_ci            s1->channels[seg_id][ch].nb_groups = 0;
965cabdff1aSopenharmony_ci            continue;
966cabdff1aSopenharmony_ci        }
967cabdff1aSopenharmony_ci        ret = ff_dolby_e_convert_input(s, s->metadata.ch_size[ch], key);
968cabdff1aSopenharmony_ci        if (ret < 0)
969cabdff1aSopenharmony_ci            return ret;
970cabdff1aSopenharmony_ci        if ((ret = parse_channel(s1, ch, seg_id)) < 0) {
971cabdff1aSopenharmony_ci            if (s1->avctx->err_recognition & AV_EF_EXPLODE)
972cabdff1aSopenharmony_ci                return ret;
973cabdff1aSopenharmony_ci            s1->channels[seg_id][ch].nb_groups = 0;
974cabdff1aSopenharmony_ci        }
975cabdff1aSopenharmony_ci        if ((ret = skip_input(s, s->metadata.ch_size[ch])) < 0)
976cabdff1aSopenharmony_ci            return ret;
977cabdff1aSopenharmony_ci    }
978cabdff1aSopenharmony_ci
979cabdff1aSopenharmony_ci    return skip_input(s, 1);
980cabdff1aSopenharmony_ci}
981cabdff1aSopenharmony_ci
982cabdff1aSopenharmony_cistatic int parse_meter(DBEDecodeContext *s1)
983cabdff1aSopenharmony_ci{
984cabdff1aSopenharmony_ci    DBEContext *s = &s1->dectx;
985cabdff1aSopenharmony_ci    if (s->metadata.meter_size)
986cabdff1aSopenharmony_ci        return skip_input(s, s->key_present + s->metadata.meter_size + 1);
987cabdff1aSopenharmony_ci    return 0;
988cabdff1aSopenharmony_ci}
989cabdff1aSopenharmony_ci
990cabdff1aSopenharmony_cistatic void imdct_calc(DBEDecodeContext *s1, DBEGroup *g, float *result, float *values)
991cabdff1aSopenharmony_ci{
992cabdff1aSopenharmony_ci    FFTContext *imdct = &s1->imdct[g->imdct_idx];
993cabdff1aSopenharmony_ci    int n   = 1 << imdct_bits_tab[g->imdct_idx];
994cabdff1aSopenharmony_ci    int n2  = n >> 1;
995cabdff1aSopenharmony_ci    int i;
996cabdff1aSopenharmony_ci
997cabdff1aSopenharmony_ci    switch (g->imdct_phs) {
998cabdff1aSopenharmony_ci    case 0:
999cabdff1aSopenharmony_ci        imdct->imdct_half(imdct, result, values);
1000cabdff1aSopenharmony_ci        for (i = 0; i < n2; i++)
1001cabdff1aSopenharmony_ci            result[n2 + i] = result[n2 - i - 1];
1002cabdff1aSopenharmony_ci        break;
1003cabdff1aSopenharmony_ci    case 1:
1004cabdff1aSopenharmony_ci        imdct->imdct_calc(imdct, result, values);
1005cabdff1aSopenharmony_ci        break;
1006cabdff1aSopenharmony_ci    case 2:
1007cabdff1aSopenharmony_ci        imdct->imdct_half(imdct, result + n2, values);
1008cabdff1aSopenharmony_ci        for (i = 0; i < n2; i++)
1009cabdff1aSopenharmony_ci            result[i] = -result[n - i - 1];
1010cabdff1aSopenharmony_ci        break;
1011cabdff1aSopenharmony_ci    default:
1012cabdff1aSopenharmony_ci        av_assert0(0);
1013cabdff1aSopenharmony_ci    }
1014cabdff1aSopenharmony_ci}
1015cabdff1aSopenharmony_ci
1016cabdff1aSopenharmony_cistatic void transform(DBEDecodeContext *s1, DBEChannel *c, float *history, float *output)
1017cabdff1aSopenharmony_ci{
1018cabdff1aSopenharmony_ci    LOCAL_ALIGNED_32(float, buffer, [2048]);
1019cabdff1aSopenharmony_ci    LOCAL_ALIGNED_32(float, result, [1152]);
1020cabdff1aSopenharmony_ci    DBEGroup *g;
1021cabdff1aSopenharmony_ci    int i;
1022cabdff1aSopenharmony_ci
1023cabdff1aSopenharmony_ci    memset(result, 0, 1152 * sizeof(float));
1024cabdff1aSopenharmony_ci    for (i = 0, g = c->groups; i < c->nb_groups; i++, g++) {
1025cabdff1aSopenharmony_ci        float *src = buffer + g->src_ofs;
1026cabdff1aSopenharmony_ci        float *dst = result + g->dst_ofs;
1027cabdff1aSopenharmony_ci        float *win = window + g->win_ofs;
1028cabdff1aSopenharmony_ci
1029cabdff1aSopenharmony_ci        imdct_calc(s1, g, buffer, c->mantissas + g->mnt_ofs);
1030cabdff1aSopenharmony_ci        s1->fdsp->vector_fmul_add(dst, src, win, dst, g->win_len);
1031cabdff1aSopenharmony_ci    }
1032cabdff1aSopenharmony_ci
1033cabdff1aSopenharmony_ci    for (i = 0; i < 256; i++)
1034cabdff1aSopenharmony_ci        output[i] = history[i] + result[i];
1035cabdff1aSopenharmony_ci    for (i = 256; i < 896; i++)
1036cabdff1aSopenharmony_ci        output[i] = result[i];
1037cabdff1aSopenharmony_ci    for (i = 0; i < 256; i++)
1038cabdff1aSopenharmony_ci        history[i] = result[896 + i];
1039cabdff1aSopenharmony_ci}
1040cabdff1aSopenharmony_ci
1041cabdff1aSopenharmony_cistatic void apply_gain(DBEDecodeContext *s, int begin, int end, float *output)
1042cabdff1aSopenharmony_ci{
1043cabdff1aSopenharmony_ci    if (begin == 960 && end == 960)
1044cabdff1aSopenharmony_ci        return;
1045cabdff1aSopenharmony_ci
1046cabdff1aSopenharmony_ci    if (begin == end) {
1047cabdff1aSopenharmony_ci        s->fdsp->vector_fmul_scalar(output, output, gain_tab[end], FRAME_SAMPLES);
1048cabdff1aSopenharmony_ci    } else {
1049cabdff1aSopenharmony_ci        float a = gain_tab[begin] * (1.0f / (FRAME_SAMPLES - 1));
1050cabdff1aSopenharmony_ci        float b = gain_tab[end  ] * (1.0f / (FRAME_SAMPLES - 1));
1051cabdff1aSopenharmony_ci        int i;
1052cabdff1aSopenharmony_ci
1053cabdff1aSopenharmony_ci        for (i = 0; i < FRAME_SAMPLES; i++)
1054cabdff1aSopenharmony_ci            output[i] *= a * (FRAME_SAMPLES - i - 1) + b * i;
1055cabdff1aSopenharmony_ci    }
1056cabdff1aSopenharmony_ci}
1057cabdff1aSopenharmony_ci
1058cabdff1aSopenharmony_cistatic int filter_frame(DBEDecodeContext *s, AVFrame *frame)
1059cabdff1aSopenharmony_ci{
1060cabdff1aSopenharmony_ci    const DolbyEHeaderInfo *const metadata = &s->dectx.metadata;
1061cabdff1aSopenharmony_ci    const uint8_t *reorder;
1062cabdff1aSopenharmony_ci    int ch, ret;
1063cabdff1aSopenharmony_ci
1064cabdff1aSopenharmony_ci    if (metadata->nb_channels == 4)
1065cabdff1aSopenharmony_ci        reorder = ch_reorder_4;
1066cabdff1aSopenharmony_ci    else if (metadata->nb_channels == 6)
1067cabdff1aSopenharmony_ci        reorder = ch_reorder_6;
1068cabdff1aSopenharmony_ci    else if (metadata->nb_programs == 1 && metadata->output_channel_order == CHANNEL_ORDER_DEFAULT)
1069cabdff1aSopenharmony_ci        reorder = ch_reorder_8;
1070cabdff1aSopenharmony_ci    else
1071cabdff1aSopenharmony_ci        reorder = ch_reorder_n;
1072cabdff1aSopenharmony_ci
1073cabdff1aSopenharmony_ci    frame->nb_samples = FRAME_SAMPLES;
1074cabdff1aSopenharmony_ci    if ((ret = ff_get_buffer(s->avctx, frame, 0)) < 0)
1075cabdff1aSopenharmony_ci        return ret;
1076cabdff1aSopenharmony_ci
1077cabdff1aSopenharmony_ci    for (ch = 0; ch < metadata->nb_channels; ch++) {
1078cabdff1aSopenharmony_ci        float *output = (float *)frame->extended_data[reorder[ch]];
1079cabdff1aSopenharmony_ci        transform(s, &s->channels[0][ch], s->history[ch], output);
1080cabdff1aSopenharmony_ci        transform(s, &s->channels[1][ch], s->history[ch], output + FRAME_SAMPLES / 2);
1081cabdff1aSopenharmony_ci        apply_gain(s, metadata->begin_gain[ch], metadata->end_gain[ch], output);
1082cabdff1aSopenharmony_ci    }
1083cabdff1aSopenharmony_ci
1084cabdff1aSopenharmony_ci    return 0;
1085cabdff1aSopenharmony_ci}
1086cabdff1aSopenharmony_ci
1087cabdff1aSopenharmony_cistatic int dolby_e_decode_frame(AVCodecContext *avctx, AVFrame *frame,
1088cabdff1aSopenharmony_ci                                int *got_frame_ptr, AVPacket *avpkt)
1089cabdff1aSopenharmony_ci{
1090cabdff1aSopenharmony_ci    DBEDecodeContext *s1 = avctx->priv_data;
1091cabdff1aSopenharmony_ci    DBEContext *s = &s1->dectx;
1092cabdff1aSopenharmony_ci    int i, j, ret;
1093cabdff1aSopenharmony_ci
1094cabdff1aSopenharmony_ci    if ((ret = ff_dolby_e_parse_header(s, avpkt->data, avpkt->size)) < 0)
1095cabdff1aSopenharmony_ci        return ret;
1096cabdff1aSopenharmony_ci
1097cabdff1aSopenharmony_ci    if (s->metadata.nb_programs > 1 && !s->metadata.multi_prog_warned) {
1098cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_WARNING, "Stream has %d programs (configuration %d), "
1099cabdff1aSopenharmony_ci               "channels will be output in native order.\n",
1100cabdff1aSopenharmony_ci               s->metadata.nb_programs, s->metadata.prog_conf);
1101cabdff1aSopenharmony_ci        s->metadata.multi_prog_warned = 1;
1102cabdff1aSopenharmony_ci    }
1103cabdff1aSopenharmony_ci
1104cabdff1aSopenharmony_ci    av_channel_layout_uninit(&avctx->ch_layout);
1105cabdff1aSopenharmony_ci    switch (s->metadata.nb_channels) {
1106cabdff1aSopenharmony_ci    case 4:
1107cabdff1aSopenharmony_ci        avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_4POINT0;
1108cabdff1aSopenharmony_ci        break;
1109cabdff1aSopenharmony_ci    case 6:
1110cabdff1aSopenharmony_ci        avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1;
1111cabdff1aSopenharmony_ci        break;
1112cabdff1aSopenharmony_ci    case 8:
1113cabdff1aSopenharmony_ci        avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_7POINT1;
1114cabdff1aSopenharmony_ci        break;
1115cabdff1aSopenharmony_ci    default:
1116cabdff1aSopenharmony_ci        avctx->ch_layout.order       = AV_CHANNEL_ORDER_UNSPEC;
1117cabdff1aSopenharmony_ci        avctx->ch_layout.nb_channels = s->metadata.nb_channels;
1118cabdff1aSopenharmony_ci        break;
1119cabdff1aSopenharmony_ci    }
1120cabdff1aSopenharmony_ci
1121cabdff1aSopenharmony_ci    avctx->sample_rate = s->metadata.sample_rate;
1122cabdff1aSopenharmony_ci    avctx->sample_fmt  = AV_SAMPLE_FMT_FLTP;
1123cabdff1aSopenharmony_ci
1124cabdff1aSopenharmony_ci    i = s->metadata.nb_channels / 2;
1125cabdff1aSopenharmony_ci    j = s->metadata.nb_channels;
1126cabdff1aSopenharmony_ci    if ((ret = parse_audio(s1, 0, i, 0)) < 0)
1127cabdff1aSopenharmony_ci        return ret;
1128cabdff1aSopenharmony_ci    if ((ret = parse_audio(s1, i, j, 0)) < 0)
1129cabdff1aSopenharmony_ci        return ret;
1130cabdff1aSopenharmony_ci    if ((ret = parse_metadata_ext(s1)) < 0)
1131cabdff1aSopenharmony_ci        return ret;
1132cabdff1aSopenharmony_ci    if ((ret = parse_audio(s1, 0, i, 1)) < 0)
1133cabdff1aSopenharmony_ci        return ret;
1134cabdff1aSopenharmony_ci    if ((ret = parse_audio(s1, i, j, 1)) < 0)
1135cabdff1aSopenharmony_ci        return ret;
1136cabdff1aSopenharmony_ci    if ((ret = parse_meter(s1)) < 0)
1137cabdff1aSopenharmony_ci        return ret;
1138cabdff1aSopenharmony_ci    if ((ret = filter_frame(s1, frame)) < 0)
1139cabdff1aSopenharmony_ci        return ret;
1140cabdff1aSopenharmony_ci
1141cabdff1aSopenharmony_ci    *got_frame_ptr = 1;
1142cabdff1aSopenharmony_ci    return avpkt->size;
1143cabdff1aSopenharmony_ci}
1144cabdff1aSopenharmony_ci
1145cabdff1aSopenharmony_cistatic av_cold void dolby_e_flush(AVCodecContext *avctx)
1146cabdff1aSopenharmony_ci{
1147cabdff1aSopenharmony_ci    DBEDecodeContext *s = avctx->priv_data;
1148cabdff1aSopenharmony_ci
1149cabdff1aSopenharmony_ci    memset(s->history, 0, sizeof(s->history));
1150cabdff1aSopenharmony_ci}
1151cabdff1aSopenharmony_ci
1152cabdff1aSopenharmony_cistatic av_cold int dolby_e_close(AVCodecContext *avctx)
1153cabdff1aSopenharmony_ci{
1154cabdff1aSopenharmony_ci    DBEDecodeContext *s = avctx->priv_data;
1155cabdff1aSopenharmony_ci    int i;
1156cabdff1aSopenharmony_ci
1157cabdff1aSopenharmony_ci    for (i = 0; i < 3; i++)
1158cabdff1aSopenharmony_ci        ff_mdct_end(&s->imdct[i]);
1159cabdff1aSopenharmony_ci
1160cabdff1aSopenharmony_ci    av_freep(&s->fdsp);
1161cabdff1aSopenharmony_ci    return 0;
1162cabdff1aSopenharmony_ci}
1163cabdff1aSopenharmony_ci
1164cabdff1aSopenharmony_ci
1165cabdff1aSopenharmony_cistatic av_cold void init_tables(void)
1166cabdff1aSopenharmony_ci{
1167cabdff1aSopenharmony_ci    int i, j;
1168cabdff1aSopenharmony_ci
1169cabdff1aSopenharmony_ci    for (i = 1; i < 17; i++)
1170cabdff1aSopenharmony_ci        mantissa_tab1[i][0] = 1.0f / (1 << i - 1);
1171cabdff1aSopenharmony_ci
1172cabdff1aSopenharmony_ci    for (i = 2; i < 16; i++) {
1173cabdff1aSopenharmony_ci        mantissa_tab1[i][1] = 1.0f  / ((1 << i) - 1);
1174cabdff1aSopenharmony_ci        mantissa_tab1[i][2] = 0.5f  / ((1 << i) - 1);
1175cabdff1aSopenharmony_ci        mantissa_tab1[i][3] = 0.25f / ((1 << i) - 1);
1176cabdff1aSopenharmony_ci    }
1177cabdff1aSopenharmony_ci
1178cabdff1aSopenharmony_ci    mantissa_tab1[i][1] = 0.5f   / (1 << 15);
1179cabdff1aSopenharmony_ci    mantissa_tab1[i][2] = 0.75f  / (1 << 15);
1180cabdff1aSopenharmony_ci    mantissa_tab1[i][3] = 0.875f / (1 << 15);
1181cabdff1aSopenharmony_ci
1182cabdff1aSopenharmony_ci    for (i = 1; i < 17; i++) {
1183cabdff1aSopenharmony_ci        mantissa_tab2[i][1] = mantissa_tab1[i][0] * 0.5f;
1184cabdff1aSopenharmony_ci        mantissa_tab2[i][2] = mantissa_tab1[i][0] * 0.75f;
1185cabdff1aSopenharmony_ci        mantissa_tab2[i][3] = mantissa_tab1[i][0] * 0.875f;
1186cabdff1aSopenharmony_ci        for (j = 1; j < 4; j++)
1187cabdff1aSopenharmony_ci            mantissa_tab3[i][j] = 1.0f / (1 << i) + 1.0f / (1 << j) - 1.0f / (1 << i + j);
1188cabdff1aSopenharmony_ci    }
1189cabdff1aSopenharmony_ci
1190cabdff1aSopenharmony_ci    mantissa_tab3[1][3] = 0.6875f;
1191cabdff1aSopenharmony_ci
1192cabdff1aSopenharmony_ci    for (i = 0; i < 25; i++) {
1193cabdff1aSopenharmony_ci        exponent_tab[i * 2    ] = 1.0f      / (1 << i);
1194cabdff1aSopenharmony_ci        exponent_tab[i * 2 + 1] = M_SQRT1_2 / (1 << i);
1195cabdff1aSopenharmony_ci    }
1196cabdff1aSopenharmony_ci
1197cabdff1aSopenharmony_ci    for (i = 1; i < 1024; i++)
1198cabdff1aSopenharmony_ci        gain_tab[i] = exp2f((i - 960) / 64.0f);
1199cabdff1aSopenharmony_ci
1200cabdff1aSopenharmony_ci    // short 1
1201cabdff1aSopenharmony_ci    ff_kbd_window_init(window, 3.0f, 128);
1202cabdff1aSopenharmony_ci    for (i = 0; i < 128; i++)
1203cabdff1aSopenharmony_ci        window[128 + i] = window[127 - i];
1204cabdff1aSopenharmony_ci
1205cabdff1aSopenharmony_ci    // start
1206cabdff1aSopenharmony_ci    for (i = 0; i < 192; i++)
1207cabdff1aSopenharmony_ci        window[256 + i] = start_window[i];
1208cabdff1aSopenharmony_ci
1209cabdff1aSopenharmony_ci    // short 2
1210cabdff1aSopenharmony_ci    for (i = 0; i < 192; i++)
1211cabdff1aSopenharmony_ci        window[448 + i] = short_window2[i];
1212cabdff1aSopenharmony_ci    for (i = 0; i < 64; i++)
1213cabdff1aSopenharmony_ci        window[640 + i] = window[63 - i];
1214cabdff1aSopenharmony_ci
1215cabdff1aSopenharmony_ci    // short 3
1216cabdff1aSopenharmony_ci    for (i = 0; i < 64; i++)
1217cabdff1aSopenharmony_ci        window[704 + i] = short_window3[i];
1218cabdff1aSopenharmony_ci    for (i = 0; i < 192; i++)
1219cabdff1aSopenharmony_ci        window[768 + i] = window[64 + i];
1220cabdff1aSopenharmony_ci
1221cabdff1aSopenharmony_ci    // bridge
1222cabdff1aSopenharmony_ci    for (i = 0; i < 128; i++)
1223cabdff1aSopenharmony_ci        window[960 + i] = window[i];
1224cabdff1aSopenharmony_ci    for (i = 0; i < 64; i++)
1225cabdff1aSopenharmony_ci        window[1088 + i] = 1.0f;
1226cabdff1aSopenharmony_ci
1227cabdff1aSopenharmony_ci    // long
1228cabdff1aSopenharmony_ci    ff_kbd_window_init(window + 1408, 3.0f, 256);
1229cabdff1aSopenharmony_ci    for (i = 0; i < 640; i++)
1230cabdff1aSopenharmony_ci        window[1664 + i] = 1.0f;
1231cabdff1aSopenharmony_ci    for (i = 0; i < 256; i++)
1232cabdff1aSopenharmony_ci        window[2304 + i] = window[1152 + i] = window[1663 - i];
1233cabdff1aSopenharmony_ci
1234cabdff1aSopenharmony_ci    // reverse start
1235cabdff1aSopenharmony_ci    for (i = 0; i < 192; i++)
1236cabdff1aSopenharmony_ci        window[2560 + i] = window[447 - i];
1237cabdff1aSopenharmony_ci
1238cabdff1aSopenharmony_ci    // reverse short 2
1239cabdff1aSopenharmony_ci    for (i = 0; i < 256; i++)
1240cabdff1aSopenharmony_ci        window[2752 + i] = window[703 - i];
1241cabdff1aSopenharmony_ci
1242cabdff1aSopenharmony_ci    // reverse short 3
1243cabdff1aSopenharmony_ci    for (i = 0; i < 256; i++)
1244cabdff1aSopenharmony_ci        window[3008 + i] = window[959 - i];
1245cabdff1aSopenharmony_ci
1246cabdff1aSopenharmony_ci    // reverse bridge
1247cabdff1aSopenharmony_ci    for (i = 0; i < 448; i++)
1248cabdff1aSopenharmony_ci        window[3264 + i] = window[1407 - i];
1249cabdff1aSopenharmony_ci}
1250cabdff1aSopenharmony_ci
1251cabdff1aSopenharmony_cistatic av_cold int dolby_e_init(AVCodecContext *avctx)
1252cabdff1aSopenharmony_ci{
1253cabdff1aSopenharmony_ci    static AVOnce init_once = AV_ONCE_INIT;
1254cabdff1aSopenharmony_ci    DBEDecodeContext *s = avctx->priv_data;
1255cabdff1aSopenharmony_ci    int i;
1256cabdff1aSopenharmony_ci
1257cabdff1aSopenharmony_ci    if (ff_thread_once(&init_once, init_tables))
1258cabdff1aSopenharmony_ci        return AVERROR_UNKNOWN;
1259cabdff1aSopenharmony_ci
1260cabdff1aSopenharmony_ci    for (i = 0; i < 3; i++)
1261cabdff1aSopenharmony_ci        if (ff_mdct_init(&s->imdct[i], imdct_bits_tab[i], 1, 2.0) < 0)
1262cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
1263cabdff1aSopenharmony_ci
1264cabdff1aSopenharmony_ci    if (!(s->fdsp = avpriv_float_dsp_alloc(0)))
1265cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
1266cabdff1aSopenharmony_ci
1267cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT
1268cabdff1aSopenharmony_ciFF_DISABLE_DEPRECATION_WARNINGS
1269cabdff1aSopenharmony_ci    if (avctx->request_channel_layout & AV_CH_LAYOUT_NATIVE)
1270cabdff1aSopenharmony_ci        s->dectx.metadata.output_channel_order = CHANNEL_ORDER_CODED;
1271cabdff1aSopenharmony_ciFF_ENABLE_DEPRECATION_WARNINGS
1272cabdff1aSopenharmony_ci#endif
1273cabdff1aSopenharmony_ci
1274cabdff1aSopenharmony_ci    s->dectx.metadata.multi_prog_warned = s->dectx.metadata.output_channel_order == CHANNEL_ORDER_CODED;
1275cabdff1aSopenharmony_ci    s->dectx.avctx = s->avctx = avctx;
1276cabdff1aSopenharmony_ci    return 0;
1277cabdff1aSopenharmony_ci}
1278cabdff1aSopenharmony_ci
1279cabdff1aSopenharmony_ci#define OFFSET(x) offsetof(DBEDecodeContext, x)
1280cabdff1aSopenharmony_ci#define FLAGS (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM)
1281cabdff1aSopenharmony_cistatic const AVOption options[] = {
1282cabdff1aSopenharmony_ci    { "channel_order", "Order in which the channels are to be exported",
1283cabdff1aSopenharmony_ci        OFFSET(dectx.metadata.output_channel_order), AV_OPT_TYPE_INT,
1284cabdff1aSopenharmony_ci        { .i64 = CHANNEL_ORDER_DEFAULT }, 0, 1, FLAGS, "channel_order" },
1285cabdff1aSopenharmony_ci      { "default", "normal libavcodec channel order", 0, AV_OPT_TYPE_CONST,
1286cabdff1aSopenharmony_ci        { .i64 = CHANNEL_ORDER_DEFAULT }, .flags = FLAGS, "channel_order" },
1287cabdff1aSopenharmony_ci      { "coded",    "order in which the channels are coded in the bitstream",
1288cabdff1aSopenharmony_ci        0, AV_OPT_TYPE_CONST, { .i64 = CHANNEL_ORDER_CODED }, .flags = FLAGS, "channel_order" },
1289cabdff1aSopenharmony_ci
1290cabdff1aSopenharmony_ci      { NULL },
1291cabdff1aSopenharmony_ci};
1292cabdff1aSopenharmony_ci
1293cabdff1aSopenharmony_cistatic const AVClass dolby_e_decoder_class = {
1294cabdff1aSopenharmony_ci    .class_name = "Dolby E decoder",
1295cabdff1aSopenharmony_ci    .item_name  = av_default_item_name,
1296cabdff1aSopenharmony_ci    .option     = options,
1297cabdff1aSopenharmony_ci    .version    = LIBAVUTIL_VERSION_INT,
1298cabdff1aSopenharmony_ci};
1299cabdff1aSopenharmony_ci
1300cabdff1aSopenharmony_ciconst FFCodec ff_dolby_e_decoder = {
1301cabdff1aSopenharmony_ci    .p.name         = "dolby_e",
1302cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("Dolby E"),
1303cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_AUDIO,
1304cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_DOLBY_E,
1305cabdff1aSopenharmony_ci    .priv_data_size = sizeof(DBEDecodeContext),
1306cabdff1aSopenharmony_ci    .p.priv_class   = &dolby_e_decoder_class,
1307cabdff1aSopenharmony_ci    .init           = dolby_e_init,
1308cabdff1aSopenharmony_ci    FF_CODEC_DECODE_CB(dolby_e_decode_frame),
1309cabdff1aSopenharmony_ci    .close          = dolby_e_close,
1310cabdff1aSopenharmony_ci    .flush          = dolby_e_flush,
1311cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
1312cabdff1aSopenharmony_ci    .p.sample_fmts  = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE },
1313cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
1314cabdff1aSopenharmony_ci};
1315