1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * WMA compatible decoder
3cabdff1aSopenharmony_ci * Copyright (c) 2002 The FFmpeg Project
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci/**
23cabdff1aSopenharmony_ci * @file
24cabdff1aSopenharmony_ci * WMA compatible decoder.
25cabdff1aSopenharmony_ci * This decoder handles Microsoft Windows Media Audio data, versions 1 & 2.
26cabdff1aSopenharmony_ci * WMA v1 is identified by audio format 0x160 in Microsoft media files
27cabdff1aSopenharmony_ci * (ASF/AVI/WAV). WMA v2 is identified by audio format 0x161.
28cabdff1aSopenharmony_ci *
29cabdff1aSopenharmony_ci * To use this decoder, a calling application must supply the extra data
30cabdff1aSopenharmony_ci * bytes provided with the WMA data. These are the extra, codec-specific
31cabdff1aSopenharmony_ci * bytes at the end of a WAVEFORMATEX data structure. Transmit these bytes
32cabdff1aSopenharmony_ci * to the decoder using the extradata[_size] fields in AVCodecContext. There
33cabdff1aSopenharmony_ci * should be 4 extra bytes for v1 data and 6 extra bytes for v2 data.
34cabdff1aSopenharmony_ci */
35cabdff1aSopenharmony_ci
36cabdff1aSopenharmony_ci#include "config_components.h"
37cabdff1aSopenharmony_ci
38cabdff1aSopenharmony_ci#include "libavutil/attributes.h"
39cabdff1aSopenharmony_ci#include "libavutil/ffmath.h"
40cabdff1aSopenharmony_ci
41cabdff1aSopenharmony_ci#include "avcodec.h"
42cabdff1aSopenharmony_ci#include "codec_internal.h"
43cabdff1aSopenharmony_ci#include "internal.h"
44cabdff1aSopenharmony_ci#include "wma.h"
45cabdff1aSopenharmony_ci
46cabdff1aSopenharmony_ci#define EXPVLCBITS 8
47cabdff1aSopenharmony_ci#define EXPMAX     ((19 + EXPVLCBITS - 1) / EXPVLCBITS)
48cabdff1aSopenharmony_ci
49cabdff1aSopenharmony_ci#define HGAINVLCBITS 9
50cabdff1aSopenharmony_ci#define HGAINMAX     ((13 + HGAINVLCBITS - 1) / HGAINVLCBITS)
51cabdff1aSopenharmony_ci
52cabdff1aSopenharmony_cistatic void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len);
53cabdff1aSopenharmony_ci
54cabdff1aSopenharmony_ci#ifdef TRACE
55cabdff1aSopenharmony_cistatic void dump_floats(WMACodecContext *s, const char *name,
56cabdff1aSopenharmony_ci                        int prec, const float *tab, int n)
57cabdff1aSopenharmony_ci{
58cabdff1aSopenharmony_ci    int i;
59cabdff1aSopenharmony_ci
60cabdff1aSopenharmony_ci    ff_tlog(s->avctx, "%s[%d]:\n", name, n);
61cabdff1aSopenharmony_ci    for (i = 0; i < n; i++) {
62cabdff1aSopenharmony_ci        if ((i & 7) == 0)
63cabdff1aSopenharmony_ci            ff_tlog(s->avctx, "%4d: ", i);
64cabdff1aSopenharmony_ci        ff_tlog(s->avctx, " %8.*f", prec, tab[i]);
65cabdff1aSopenharmony_ci        if ((i & 7) == 7)
66cabdff1aSopenharmony_ci            ff_tlog(s->avctx, "\n");
67cabdff1aSopenharmony_ci    }
68cabdff1aSopenharmony_ci    if ((i & 7) != 0)
69cabdff1aSopenharmony_ci        ff_tlog(s->avctx, "\n");
70cabdff1aSopenharmony_ci}
71cabdff1aSopenharmony_ci#endif /* TRACE */
72cabdff1aSopenharmony_ci
73cabdff1aSopenharmony_cistatic av_cold int wma_decode_init(AVCodecContext *avctx)
74cabdff1aSopenharmony_ci{
75cabdff1aSopenharmony_ci    WMACodecContext *s = avctx->priv_data;
76cabdff1aSopenharmony_ci    int i, flags2, ret;
77cabdff1aSopenharmony_ci    uint8_t *extradata;
78cabdff1aSopenharmony_ci
79cabdff1aSopenharmony_ci    if (!avctx->block_align) {
80cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "block_align is not set\n");
81cabdff1aSopenharmony_ci        return AVERROR(EINVAL);
82cabdff1aSopenharmony_ci    }
83cabdff1aSopenharmony_ci
84cabdff1aSopenharmony_ci    s->avctx = avctx;
85cabdff1aSopenharmony_ci
86cabdff1aSopenharmony_ci    /* extract flag info */
87cabdff1aSopenharmony_ci    flags2    = 0;
88cabdff1aSopenharmony_ci    extradata = avctx->extradata;
89cabdff1aSopenharmony_ci    if (avctx->codec->id == AV_CODEC_ID_WMAV1 && avctx->extradata_size >= 4)
90cabdff1aSopenharmony_ci        flags2 = AV_RL16(extradata + 2);
91cabdff1aSopenharmony_ci    else if (avctx->codec->id == AV_CODEC_ID_WMAV2 && avctx->extradata_size >= 6)
92cabdff1aSopenharmony_ci        flags2 = AV_RL16(extradata + 4);
93cabdff1aSopenharmony_ci
94cabdff1aSopenharmony_ci    s->use_exp_vlc            = flags2 & 0x0001;
95cabdff1aSopenharmony_ci    s->use_bit_reservoir      = flags2 & 0x0002;
96cabdff1aSopenharmony_ci    s->use_variable_block_len = flags2 & 0x0004;
97cabdff1aSopenharmony_ci
98cabdff1aSopenharmony_ci    if (avctx->codec->id == AV_CODEC_ID_WMAV2 && avctx->extradata_size >= 8){
99cabdff1aSopenharmony_ci        if (AV_RL16(extradata+4)==0xd && s->use_variable_block_len){
100cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_WARNING, "Disabling use_variable_block_len, if this fails contact the ffmpeg developers and send us the file\n");
101cabdff1aSopenharmony_ci            s->use_variable_block_len= 0; // this fixes issue1503
102cabdff1aSopenharmony_ci        }
103cabdff1aSopenharmony_ci    }
104cabdff1aSopenharmony_ci
105cabdff1aSopenharmony_ci    for (i=0; i<MAX_CHANNELS; i++)
106cabdff1aSopenharmony_ci        s->max_exponent[i] = 1.0;
107cabdff1aSopenharmony_ci
108cabdff1aSopenharmony_ci    if ((ret = ff_wma_init(avctx, flags2)) < 0)
109cabdff1aSopenharmony_ci        return ret;
110cabdff1aSopenharmony_ci
111cabdff1aSopenharmony_ci    /* init MDCT */
112cabdff1aSopenharmony_ci    for (i = 0; i < s->nb_block_sizes; i++) {
113cabdff1aSopenharmony_ci        ret = ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1,
114cabdff1aSopenharmony_ci                           1, 1.0 / 32768.0);
115cabdff1aSopenharmony_ci        if (ret < 0)
116cabdff1aSopenharmony_ci            return ret;
117cabdff1aSopenharmony_ci    }
118cabdff1aSopenharmony_ci
119cabdff1aSopenharmony_ci    if (s->use_noise_coding) {
120cabdff1aSopenharmony_ci        ret = ff_init_vlc_from_lengths(&s->hgain_vlc, HGAINVLCBITS,
121cabdff1aSopenharmony_ci                                       FF_ARRAY_ELEMS(ff_wma_hgain_hufftab),
122cabdff1aSopenharmony_ci                                       &ff_wma_hgain_hufftab[0][1], 2,
123cabdff1aSopenharmony_ci                                       &ff_wma_hgain_hufftab[0][0], 2, 1,
124cabdff1aSopenharmony_ci                                       -18, 0, avctx);
125cabdff1aSopenharmony_ci        if (ret < 0)
126cabdff1aSopenharmony_ci            return ret;
127cabdff1aSopenharmony_ci    }
128cabdff1aSopenharmony_ci
129cabdff1aSopenharmony_ci    if (s->use_exp_vlc) {
130cabdff1aSopenharmony_ci        // FIXME move out of context
131cabdff1aSopenharmony_ci        ret = init_vlc(&s->exp_vlc, EXPVLCBITS, sizeof(ff_aac_scalefactor_bits),
132cabdff1aSopenharmony_ci                       ff_aac_scalefactor_bits, 1, 1,
133cabdff1aSopenharmony_ci                       ff_aac_scalefactor_code, 4, 4, 0);
134cabdff1aSopenharmony_ci        if (ret < 0)
135cabdff1aSopenharmony_ci            return ret;
136cabdff1aSopenharmony_ci    } else
137cabdff1aSopenharmony_ci        wma_lsp_to_curve_init(s, s->frame_len);
138cabdff1aSopenharmony_ci
139cabdff1aSopenharmony_ci    avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
140cabdff1aSopenharmony_ci
141cabdff1aSopenharmony_ci    avctx->internal->skip_samples = s->frame_len * 2;
142cabdff1aSopenharmony_ci
143cabdff1aSopenharmony_ci    return 0;
144cabdff1aSopenharmony_ci}
145cabdff1aSopenharmony_ci
146cabdff1aSopenharmony_ci/**
147cabdff1aSopenharmony_ci * compute x^-0.25 with an exponent and mantissa table. We use linear
148cabdff1aSopenharmony_ci * interpolation to reduce the mantissa table size at a small speed
149cabdff1aSopenharmony_ci * expense (linear interpolation approximately doubles the number of
150cabdff1aSopenharmony_ci * bits of precision).
151cabdff1aSopenharmony_ci */
152cabdff1aSopenharmony_cistatic inline float pow_m1_4(WMACodecContext *s, float x)
153cabdff1aSopenharmony_ci{
154cabdff1aSopenharmony_ci    union {
155cabdff1aSopenharmony_ci        float f;
156cabdff1aSopenharmony_ci        unsigned int v;
157cabdff1aSopenharmony_ci    } u, t;
158cabdff1aSopenharmony_ci    unsigned int e, m;
159cabdff1aSopenharmony_ci    float a, b;
160cabdff1aSopenharmony_ci
161cabdff1aSopenharmony_ci    u.f = x;
162cabdff1aSopenharmony_ci    e   =  u.v >>  23;
163cabdff1aSopenharmony_ci    m   = (u.v >> (23 - LSP_POW_BITS)) & ((1 << LSP_POW_BITS) - 1);
164cabdff1aSopenharmony_ci    /* build interpolation scale: 1 <= t < 2. */
165cabdff1aSopenharmony_ci    t.v = ((u.v << LSP_POW_BITS) & ((1 << 23) - 1)) | (127 << 23);
166cabdff1aSopenharmony_ci    a   = s->lsp_pow_m_table1[m];
167cabdff1aSopenharmony_ci    b   = s->lsp_pow_m_table2[m];
168cabdff1aSopenharmony_ci    return s->lsp_pow_e_table[e] * (a + b * t.f);
169cabdff1aSopenharmony_ci}
170cabdff1aSopenharmony_ci
171cabdff1aSopenharmony_cistatic av_cold void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len)
172cabdff1aSopenharmony_ci{
173cabdff1aSopenharmony_ci    float wdel, a, b;
174cabdff1aSopenharmony_ci    int i, e, m;
175cabdff1aSopenharmony_ci
176cabdff1aSopenharmony_ci    wdel = M_PI / frame_len;
177cabdff1aSopenharmony_ci    for (i = 0; i < frame_len; i++)
178cabdff1aSopenharmony_ci        s->lsp_cos_table[i] = 2.0f * cos(wdel * i);
179cabdff1aSopenharmony_ci
180cabdff1aSopenharmony_ci    /* tables for x^-0.25 computation */
181cabdff1aSopenharmony_ci    for (i = 0; i < 256; i++) {
182cabdff1aSopenharmony_ci        e                     = i - 126;
183cabdff1aSopenharmony_ci        s->lsp_pow_e_table[i] = exp2f(e * -0.25);
184cabdff1aSopenharmony_ci    }
185cabdff1aSopenharmony_ci
186cabdff1aSopenharmony_ci    /* NOTE: these two tables are needed to avoid two operations in
187cabdff1aSopenharmony_ci     * pow_m1_4 */
188cabdff1aSopenharmony_ci    b = 1.0;
189cabdff1aSopenharmony_ci    for (i = (1 << LSP_POW_BITS) - 1; i >= 0; i--) {
190cabdff1aSopenharmony_ci        m                      = (1 << LSP_POW_BITS) + i;
191cabdff1aSopenharmony_ci        a                      = (float) m * (0.5 / (1 << LSP_POW_BITS));
192cabdff1aSopenharmony_ci        a                      = 1/sqrt(sqrt(a));
193cabdff1aSopenharmony_ci        s->lsp_pow_m_table1[i] = 2 * a - b;
194cabdff1aSopenharmony_ci        s->lsp_pow_m_table2[i] = b - a;
195cabdff1aSopenharmony_ci        b                      = a;
196cabdff1aSopenharmony_ci    }
197cabdff1aSopenharmony_ci}
198cabdff1aSopenharmony_ci
199cabdff1aSopenharmony_ci/**
200cabdff1aSopenharmony_ci * NOTE: We use the same code as Vorbis here
201cabdff1aSopenharmony_ci * @todo optimize it further with SSE/3Dnow
202cabdff1aSopenharmony_ci */
203cabdff1aSopenharmony_cistatic void wma_lsp_to_curve(WMACodecContext *s, float *out, float *val_max_ptr,
204cabdff1aSopenharmony_ci                             int n, float *lsp)
205cabdff1aSopenharmony_ci{
206cabdff1aSopenharmony_ci    int i, j;
207cabdff1aSopenharmony_ci    float p, q, w, v, val_max;
208cabdff1aSopenharmony_ci
209cabdff1aSopenharmony_ci    val_max = 0;
210cabdff1aSopenharmony_ci    for (i = 0; i < n; i++) {
211cabdff1aSopenharmony_ci        p = 0.5f;
212cabdff1aSopenharmony_ci        q = 0.5f;
213cabdff1aSopenharmony_ci        w = s->lsp_cos_table[i];
214cabdff1aSopenharmony_ci        for (j = 1; j < NB_LSP_COEFS; j += 2) {
215cabdff1aSopenharmony_ci            q *= w - lsp[j - 1];
216cabdff1aSopenharmony_ci            p *= w - lsp[j];
217cabdff1aSopenharmony_ci        }
218cabdff1aSopenharmony_ci        p *= p * (2.0f - w);
219cabdff1aSopenharmony_ci        q *= q * (2.0f + w);
220cabdff1aSopenharmony_ci        v  = p + q;
221cabdff1aSopenharmony_ci        v  = pow_m1_4(s, v);
222cabdff1aSopenharmony_ci        if (v > val_max)
223cabdff1aSopenharmony_ci            val_max = v;
224cabdff1aSopenharmony_ci        out[i] = v;
225cabdff1aSopenharmony_ci    }
226cabdff1aSopenharmony_ci    *val_max_ptr = val_max;
227cabdff1aSopenharmony_ci}
228cabdff1aSopenharmony_ci
229cabdff1aSopenharmony_ci/**
230cabdff1aSopenharmony_ci * decode exponents coded with LSP coefficients (same idea as Vorbis)
231cabdff1aSopenharmony_ci */
232cabdff1aSopenharmony_cistatic void decode_exp_lsp(WMACodecContext *s, int ch)
233cabdff1aSopenharmony_ci{
234cabdff1aSopenharmony_ci    float lsp_coefs[NB_LSP_COEFS];
235cabdff1aSopenharmony_ci    int val, i;
236cabdff1aSopenharmony_ci
237cabdff1aSopenharmony_ci    for (i = 0; i < NB_LSP_COEFS; i++) {
238cabdff1aSopenharmony_ci        if (i == 0 || i >= 8)
239cabdff1aSopenharmony_ci            val = get_bits(&s->gb, 3);
240cabdff1aSopenharmony_ci        else
241cabdff1aSopenharmony_ci            val = get_bits(&s->gb, 4);
242cabdff1aSopenharmony_ci        lsp_coefs[i] = ff_wma_lsp_codebook[i][val];
243cabdff1aSopenharmony_ci    }
244cabdff1aSopenharmony_ci
245cabdff1aSopenharmony_ci    wma_lsp_to_curve(s, s->exponents[ch], &s->max_exponent[ch],
246cabdff1aSopenharmony_ci                     s->block_len, lsp_coefs);
247cabdff1aSopenharmony_ci}
248cabdff1aSopenharmony_ci
249cabdff1aSopenharmony_ci/** pow(10, i / 16.0) for i in -60..95 */
250cabdff1aSopenharmony_cistatic const float pow_tab[] = {
251cabdff1aSopenharmony_ci    1.7782794100389e-04, 2.0535250264571e-04,
252cabdff1aSopenharmony_ci    2.3713737056617e-04, 2.7384196342644e-04,
253cabdff1aSopenharmony_ci    3.1622776601684e-04, 3.6517412725484e-04,
254cabdff1aSopenharmony_ci    4.2169650342858e-04, 4.8696752516586e-04,
255cabdff1aSopenharmony_ci    5.6234132519035e-04, 6.4938163157621e-04,
256cabdff1aSopenharmony_ci    7.4989420933246e-04, 8.6596432336006e-04,
257cabdff1aSopenharmony_ci    1.0000000000000e-03, 1.1547819846895e-03,
258cabdff1aSopenharmony_ci    1.3335214321633e-03, 1.5399265260595e-03,
259cabdff1aSopenharmony_ci    1.7782794100389e-03, 2.0535250264571e-03,
260cabdff1aSopenharmony_ci    2.3713737056617e-03, 2.7384196342644e-03,
261cabdff1aSopenharmony_ci    3.1622776601684e-03, 3.6517412725484e-03,
262cabdff1aSopenharmony_ci    4.2169650342858e-03, 4.8696752516586e-03,
263cabdff1aSopenharmony_ci    5.6234132519035e-03, 6.4938163157621e-03,
264cabdff1aSopenharmony_ci    7.4989420933246e-03, 8.6596432336006e-03,
265cabdff1aSopenharmony_ci    1.0000000000000e-02, 1.1547819846895e-02,
266cabdff1aSopenharmony_ci    1.3335214321633e-02, 1.5399265260595e-02,
267cabdff1aSopenharmony_ci    1.7782794100389e-02, 2.0535250264571e-02,
268cabdff1aSopenharmony_ci    2.3713737056617e-02, 2.7384196342644e-02,
269cabdff1aSopenharmony_ci    3.1622776601684e-02, 3.6517412725484e-02,
270cabdff1aSopenharmony_ci    4.2169650342858e-02, 4.8696752516586e-02,
271cabdff1aSopenharmony_ci    5.6234132519035e-02, 6.4938163157621e-02,
272cabdff1aSopenharmony_ci    7.4989420933246e-02, 8.6596432336007e-02,
273cabdff1aSopenharmony_ci    1.0000000000000e-01, 1.1547819846895e-01,
274cabdff1aSopenharmony_ci    1.3335214321633e-01, 1.5399265260595e-01,
275cabdff1aSopenharmony_ci    1.7782794100389e-01, 2.0535250264571e-01,
276cabdff1aSopenharmony_ci    2.3713737056617e-01, 2.7384196342644e-01,
277cabdff1aSopenharmony_ci    3.1622776601684e-01, 3.6517412725484e-01,
278cabdff1aSopenharmony_ci    4.2169650342858e-01, 4.8696752516586e-01,
279cabdff1aSopenharmony_ci    5.6234132519035e-01, 6.4938163157621e-01,
280cabdff1aSopenharmony_ci    7.4989420933246e-01, 8.6596432336007e-01,
281cabdff1aSopenharmony_ci    1.0000000000000e+00, 1.1547819846895e+00,
282cabdff1aSopenharmony_ci    1.3335214321633e+00, 1.5399265260595e+00,
283cabdff1aSopenharmony_ci    1.7782794100389e+00, 2.0535250264571e+00,
284cabdff1aSopenharmony_ci    2.3713737056617e+00, 2.7384196342644e+00,
285cabdff1aSopenharmony_ci    3.1622776601684e+00, 3.6517412725484e+00,
286cabdff1aSopenharmony_ci    4.2169650342858e+00, 4.8696752516586e+00,
287cabdff1aSopenharmony_ci    5.6234132519035e+00, 6.4938163157621e+00,
288cabdff1aSopenharmony_ci    7.4989420933246e+00, 8.6596432336007e+00,
289cabdff1aSopenharmony_ci    1.0000000000000e+01, 1.1547819846895e+01,
290cabdff1aSopenharmony_ci    1.3335214321633e+01, 1.5399265260595e+01,
291cabdff1aSopenharmony_ci    1.7782794100389e+01, 2.0535250264571e+01,
292cabdff1aSopenharmony_ci    2.3713737056617e+01, 2.7384196342644e+01,
293cabdff1aSopenharmony_ci    3.1622776601684e+01, 3.6517412725484e+01,
294cabdff1aSopenharmony_ci    4.2169650342858e+01, 4.8696752516586e+01,
295cabdff1aSopenharmony_ci    5.6234132519035e+01, 6.4938163157621e+01,
296cabdff1aSopenharmony_ci    7.4989420933246e+01, 8.6596432336007e+01,
297cabdff1aSopenharmony_ci    1.0000000000000e+02, 1.1547819846895e+02,
298cabdff1aSopenharmony_ci    1.3335214321633e+02, 1.5399265260595e+02,
299cabdff1aSopenharmony_ci    1.7782794100389e+02, 2.0535250264571e+02,
300cabdff1aSopenharmony_ci    2.3713737056617e+02, 2.7384196342644e+02,
301cabdff1aSopenharmony_ci    3.1622776601684e+02, 3.6517412725484e+02,
302cabdff1aSopenharmony_ci    4.2169650342858e+02, 4.8696752516586e+02,
303cabdff1aSopenharmony_ci    5.6234132519035e+02, 6.4938163157621e+02,
304cabdff1aSopenharmony_ci    7.4989420933246e+02, 8.6596432336007e+02,
305cabdff1aSopenharmony_ci    1.0000000000000e+03, 1.1547819846895e+03,
306cabdff1aSopenharmony_ci    1.3335214321633e+03, 1.5399265260595e+03,
307cabdff1aSopenharmony_ci    1.7782794100389e+03, 2.0535250264571e+03,
308cabdff1aSopenharmony_ci    2.3713737056617e+03, 2.7384196342644e+03,
309cabdff1aSopenharmony_ci    3.1622776601684e+03, 3.6517412725484e+03,
310cabdff1aSopenharmony_ci    4.2169650342858e+03, 4.8696752516586e+03,
311cabdff1aSopenharmony_ci    5.6234132519035e+03, 6.4938163157621e+03,
312cabdff1aSopenharmony_ci    7.4989420933246e+03, 8.6596432336007e+03,
313cabdff1aSopenharmony_ci    1.0000000000000e+04, 1.1547819846895e+04,
314cabdff1aSopenharmony_ci    1.3335214321633e+04, 1.5399265260595e+04,
315cabdff1aSopenharmony_ci    1.7782794100389e+04, 2.0535250264571e+04,
316cabdff1aSopenharmony_ci    2.3713737056617e+04, 2.7384196342644e+04,
317cabdff1aSopenharmony_ci    3.1622776601684e+04, 3.6517412725484e+04,
318cabdff1aSopenharmony_ci    4.2169650342858e+04, 4.8696752516586e+04,
319cabdff1aSopenharmony_ci    5.6234132519035e+04, 6.4938163157621e+04,
320cabdff1aSopenharmony_ci    7.4989420933246e+04, 8.6596432336007e+04,
321cabdff1aSopenharmony_ci    1.0000000000000e+05, 1.1547819846895e+05,
322cabdff1aSopenharmony_ci    1.3335214321633e+05, 1.5399265260595e+05,
323cabdff1aSopenharmony_ci    1.7782794100389e+05, 2.0535250264571e+05,
324cabdff1aSopenharmony_ci    2.3713737056617e+05, 2.7384196342644e+05,
325cabdff1aSopenharmony_ci    3.1622776601684e+05, 3.6517412725484e+05,
326cabdff1aSopenharmony_ci    4.2169650342858e+05, 4.8696752516586e+05,
327cabdff1aSopenharmony_ci    5.6234132519035e+05, 6.4938163157621e+05,
328cabdff1aSopenharmony_ci    7.4989420933246e+05, 8.6596432336007e+05,
329cabdff1aSopenharmony_ci};
330cabdff1aSopenharmony_ci
331cabdff1aSopenharmony_ci/**
332cabdff1aSopenharmony_ci * decode exponents coded with VLC codes
333cabdff1aSopenharmony_ci */
334cabdff1aSopenharmony_cistatic int decode_exp_vlc(WMACodecContext *s, int ch)
335cabdff1aSopenharmony_ci{
336cabdff1aSopenharmony_ci    int last_exp, n, code;
337cabdff1aSopenharmony_ci    const uint16_t *ptr;
338cabdff1aSopenharmony_ci    float v, max_scale;
339cabdff1aSopenharmony_ci    uint32_t *q, *q_end, iv;
340cabdff1aSopenharmony_ci    const float *ptab = pow_tab + 60;
341cabdff1aSopenharmony_ci    const uint32_t *iptab = (const uint32_t *) ptab;
342cabdff1aSopenharmony_ci
343cabdff1aSopenharmony_ci    ptr       = s->exponent_bands[s->frame_len_bits - s->block_len_bits];
344cabdff1aSopenharmony_ci    q         = (uint32_t *) s->exponents[ch];
345cabdff1aSopenharmony_ci    q_end     = q + s->block_len;
346cabdff1aSopenharmony_ci    max_scale = 0;
347cabdff1aSopenharmony_ci    if (s->version == 1) {
348cabdff1aSopenharmony_ci        last_exp  = get_bits(&s->gb, 5) + 10;
349cabdff1aSopenharmony_ci        v         = ptab[last_exp];
350cabdff1aSopenharmony_ci        iv        = iptab[last_exp];
351cabdff1aSopenharmony_ci        max_scale = v;
352cabdff1aSopenharmony_ci        n         = *ptr++;
353cabdff1aSopenharmony_ci        switch (n & 3) do {
354cabdff1aSopenharmony_ci        case 0: *q++ = iv;
355cabdff1aSopenharmony_ci        case 3: *q++ = iv;
356cabdff1aSopenharmony_ci        case 2: *q++ = iv;
357cabdff1aSopenharmony_ci        case 1: *q++ = iv;
358cabdff1aSopenharmony_ci        } while ((n -= 4) > 0);
359cabdff1aSopenharmony_ci    } else
360cabdff1aSopenharmony_ci        last_exp = 36;
361cabdff1aSopenharmony_ci
362cabdff1aSopenharmony_ci    while (q < q_end) {
363cabdff1aSopenharmony_ci        code = get_vlc2(&s->gb, s->exp_vlc.table, EXPVLCBITS, EXPMAX);
364cabdff1aSopenharmony_ci        /* NOTE: this offset is the same as MPEG-4 AAC! */
365cabdff1aSopenharmony_ci        last_exp += code - 60;
366cabdff1aSopenharmony_ci        if ((unsigned) last_exp + 60 >= FF_ARRAY_ELEMS(pow_tab)) {
367cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Exponent out of range: %d\n",
368cabdff1aSopenharmony_ci                   last_exp);
369cabdff1aSopenharmony_ci            return -1;
370cabdff1aSopenharmony_ci        }
371cabdff1aSopenharmony_ci        v  = ptab[last_exp];
372cabdff1aSopenharmony_ci        iv = iptab[last_exp];
373cabdff1aSopenharmony_ci        if (v > max_scale)
374cabdff1aSopenharmony_ci            max_scale = v;
375cabdff1aSopenharmony_ci        n = *ptr++;
376cabdff1aSopenharmony_ci        switch (n & 3) do {
377cabdff1aSopenharmony_ci        case 0: *q++ = iv;
378cabdff1aSopenharmony_ci        case 3: *q++ = iv;
379cabdff1aSopenharmony_ci        case 2: *q++ = iv;
380cabdff1aSopenharmony_ci        case 1: *q++ = iv;
381cabdff1aSopenharmony_ci        } while ((n -= 4) > 0);
382cabdff1aSopenharmony_ci    }
383cabdff1aSopenharmony_ci    s->max_exponent[ch] = max_scale;
384cabdff1aSopenharmony_ci    return 0;
385cabdff1aSopenharmony_ci}
386cabdff1aSopenharmony_ci
387cabdff1aSopenharmony_ci/**
388cabdff1aSopenharmony_ci * Apply MDCT window and add into output.
389cabdff1aSopenharmony_ci *
390cabdff1aSopenharmony_ci * We ensure that when the windows overlap their squared sum
391cabdff1aSopenharmony_ci * is always 1 (MDCT reconstruction rule).
392cabdff1aSopenharmony_ci */
393cabdff1aSopenharmony_cistatic void wma_window(WMACodecContext *s, float *out)
394cabdff1aSopenharmony_ci{
395cabdff1aSopenharmony_ci    float *in = s->output;
396cabdff1aSopenharmony_ci    int block_len, bsize, n;
397cabdff1aSopenharmony_ci
398cabdff1aSopenharmony_ci    /* left part */
399cabdff1aSopenharmony_ci    if (s->block_len_bits <= s->prev_block_len_bits) {
400cabdff1aSopenharmony_ci        block_len = s->block_len;
401cabdff1aSopenharmony_ci        bsize     = s->frame_len_bits - s->block_len_bits;
402cabdff1aSopenharmony_ci
403cabdff1aSopenharmony_ci        s->fdsp->vector_fmul_add(out, in, s->windows[bsize],
404cabdff1aSopenharmony_ci                                out, block_len);
405cabdff1aSopenharmony_ci    } else {
406cabdff1aSopenharmony_ci        block_len = 1 << s->prev_block_len_bits;
407cabdff1aSopenharmony_ci        n         = (s->block_len - block_len) / 2;
408cabdff1aSopenharmony_ci        bsize     = s->frame_len_bits - s->prev_block_len_bits;
409cabdff1aSopenharmony_ci
410cabdff1aSopenharmony_ci        s->fdsp->vector_fmul_add(out + n, in + n, s->windows[bsize],
411cabdff1aSopenharmony_ci                                out + n, block_len);
412cabdff1aSopenharmony_ci
413cabdff1aSopenharmony_ci        memcpy(out + n + block_len, in + n + block_len, n * sizeof(float));
414cabdff1aSopenharmony_ci    }
415cabdff1aSopenharmony_ci
416cabdff1aSopenharmony_ci    out += s->block_len;
417cabdff1aSopenharmony_ci    in  += s->block_len;
418cabdff1aSopenharmony_ci
419cabdff1aSopenharmony_ci    /* right part */
420cabdff1aSopenharmony_ci    if (s->block_len_bits <= s->next_block_len_bits) {
421cabdff1aSopenharmony_ci        block_len = s->block_len;
422cabdff1aSopenharmony_ci        bsize     = s->frame_len_bits - s->block_len_bits;
423cabdff1aSopenharmony_ci
424cabdff1aSopenharmony_ci        s->fdsp->vector_fmul_reverse(out, in, s->windows[bsize], block_len);
425cabdff1aSopenharmony_ci    } else {
426cabdff1aSopenharmony_ci        block_len = 1 << s->next_block_len_bits;
427cabdff1aSopenharmony_ci        n         = (s->block_len - block_len) / 2;
428cabdff1aSopenharmony_ci        bsize     = s->frame_len_bits - s->next_block_len_bits;
429cabdff1aSopenharmony_ci
430cabdff1aSopenharmony_ci        memcpy(out, in, n * sizeof(float));
431cabdff1aSopenharmony_ci
432cabdff1aSopenharmony_ci        s->fdsp->vector_fmul_reverse(out + n, in + n, s->windows[bsize],
433cabdff1aSopenharmony_ci                                    block_len);
434cabdff1aSopenharmony_ci
435cabdff1aSopenharmony_ci        memset(out + n + block_len, 0, n * sizeof(float));
436cabdff1aSopenharmony_ci    }
437cabdff1aSopenharmony_ci}
438cabdff1aSopenharmony_ci
439cabdff1aSopenharmony_ci/**
440cabdff1aSopenharmony_ci * @return 0 if OK. 1 if last block of frame. return -1 if
441cabdff1aSopenharmony_ci * unrecoverable error.
442cabdff1aSopenharmony_ci */
443cabdff1aSopenharmony_cistatic int wma_decode_block(WMACodecContext *s)
444cabdff1aSopenharmony_ci{
445cabdff1aSopenharmony_ci    int channels = s->avctx->ch_layout.nb_channels;
446cabdff1aSopenharmony_ci    int n, v, a, ch, bsize;
447cabdff1aSopenharmony_ci    int coef_nb_bits, total_gain;
448cabdff1aSopenharmony_ci    int nb_coefs[MAX_CHANNELS];
449cabdff1aSopenharmony_ci    float mdct_norm;
450cabdff1aSopenharmony_ci    FFTContext *mdct;
451cabdff1aSopenharmony_ci
452cabdff1aSopenharmony_ci#ifdef TRACE
453cabdff1aSopenharmony_ci    ff_tlog(s->avctx, "***decode_block: %d:%d\n",
454cabdff1aSopenharmony_ci            s->frame_count - 1, s->block_num);
455cabdff1aSopenharmony_ci#endif /* TRACE */
456cabdff1aSopenharmony_ci
457cabdff1aSopenharmony_ci    /* compute current block length */
458cabdff1aSopenharmony_ci    if (s->use_variable_block_len) {
459cabdff1aSopenharmony_ci        n = av_log2(s->nb_block_sizes - 1) + 1;
460cabdff1aSopenharmony_ci
461cabdff1aSopenharmony_ci        if (s->reset_block_lengths) {
462cabdff1aSopenharmony_ci            s->reset_block_lengths = 0;
463cabdff1aSopenharmony_ci            v                      = get_bits(&s->gb, n);
464cabdff1aSopenharmony_ci            if (v >= s->nb_block_sizes) {
465cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR,
466cabdff1aSopenharmony_ci                       "prev_block_len_bits %d out of range\n",
467cabdff1aSopenharmony_ci                       s->frame_len_bits - v);
468cabdff1aSopenharmony_ci                return -1;
469cabdff1aSopenharmony_ci            }
470cabdff1aSopenharmony_ci            s->prev_block_len_bits = s->frame_len_bits - v;
471cabdff1aSopenharmony_ci            v                      = get_bits(&s->gb, n);
472cabdff1aSopenharmony_ci            if (v >= s->nb_block_sizes) {
473cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR,
474cabdff1aSopenharmony_ci                       "block_len_bits %d out of range\n",
475cabdff1aSopenharmony_ci                       s->frame_len_bits - v);
476cabdff1aSopenharmony_ci                return -1;
477cabdff1aSopenharmony_ci            }
478cabdff1aSopenharmony_ci            s->block_len_bits = s->frame_len_bits - v;
479cabdff1aSopenharmony_ci        } else {
480cabdff1aSopenharmony_ci            /* update block lengths */
481cabdff1aSopenharmony_ci            s->prev_block_len_bits = s->block_len_bits;
482cabdff1aSopenharmony_ci            s->block_len_bits      = s->next_block_len_bits;
483cabdff1aSopenharmony_ci        }
484cabdff1aSopenharmony_ci        v = get_bits(&s->gb, n);
485cabdff1aSopenharmony_ci        if (v >= s->nb_block_sizes) {
486cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR,
487cabdff1aSopenharmony_ci                   "next_block_len_bits %d out of range\n",
488cabdff1aSopenharmony_ci                   s->frame_len_bits - v);
489cabdff1aSopenharmony_ci            return -1;
490cabdff1aSopenharmony_ci        }
491cabdff1aSopenharmony_ci        s->next_block_len_bits = s->frame_len_bits - v;
492cabdff1aSopenharmony_ci    } else {
493cabdff1aSopenharmony_ci        /* fixed block len */
494cabdff1aSopenharmony_ci        s->next_block_len_bits = s->frame_len_bits;
495cabdff1aSopenharmony_ci        s->prev_block_len_bits = s->frame_len_bits;
496cabdff1aSopenharmony_ci        s->block_len_bits      = s->frame_len_bits;
497cabdff1aSopenharmony_ci    }
498cabdff1aSopenharmony_ci
499cabdff1aSopenharmony_ci    if (s->frame_len_bits - s->block_len_bits >= s->nb_block_sizes){
500cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "block_len_bits not initialized to a valid value\n");
501cabdff1aSopenharmony_ci        return -1;
502cabdff1aSopenharmony_ci    }
503cabdff1aSopenharmony_ci
504cabdff1aSopenharmony_ci    /* now check if the block length is coherent with the frame length */
505cabdff1aSopenharmony_ci    s->block_len = 1 << s->block_len_bits;
506cabdff1aSopenharmony_ci    if ((s->block_pos + s->block_len) > s->frame_len) {
507cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "frame_len overflow\n");
508cabdff1aSopenharmony_ci        return -1;
509cabdff1aSopenharmony_ci    }
510cabdff1aSopenharmony_ci
511cabdff1aSopenharmony_ci    if (channels == 2)
512cabdff1aSopenharmony_ci        s->ms_stereo = get_bits1(&s->gb);
513cabdff1aSopenharmony_ci    v = 0;
514cabdff1aSopenharmony_ci    for (ch = 0; ch < channels; ch++) {
515cabdff1aSopenharmony_ci        a                    = get_bits1(&s->gb);
516cabdff1aSopenharmony_ci        s->channel_coded[ch] = a;
517cabdff1aSopenharmony_ci        v                   |= a;
518cabdff1aSopenharmony_ci    }
519cabdff1aSopenharmony_ci
520cabdff1aSopenharmony_ci    bsize = s->frame_len_bits - s->block_len_bits;
521cabdff1aSopenharmony_ci
522cabdff1aSopenharmony_ci    /* if no channel coded, no need to go further */
523cabdff1aSopenharmony_ci    /* XXX: fix potential framing problems */
524cabdff1aSopenharmony_ci    if (!v)
525cabdff1aSopenharmony_ci        goto next;
526cabdff1aSopenharmony_ci
527cabdff1aSopenharmony_ci    /* read total gain and extract corresponding number of bits for
528cabdff1aSopenharmony_ci     * coef escape coding */
529cabdff1aSopenharmony_ci    total_gain = 1;
530cabdff1aSopenharmony_ci    for (;;) {
531cabdff1aSopenharmony_ci        if (get_bits_left(&s->gb) < 7) {
532cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "total_gain overread\n");
533cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
534cabdff1aSopenharmony_ci        }
535cabdff1aSopenharmony_ci        a           = get_bits(&s->gb, 7);
536cabdff1aSopenharmony_ci        total_gain += a;
537cabdff1aSopenharmony_ci        if (a != 127)
538cabdff1aSopenharmony_ci            break;
539cabdff1aSopenharmony_ci    }
540cabdff1aSopenharmony_ci
541cabdff1aSopenharmony_ci    coef_nb_bits = ff_wma_total_gain_to_bits(total_gain);
542cabdff1aSopenharmony_ci
543cabdff1aSopenharmony_ci    /* compute number of coefficients */
544cabdff1aSopenharmony_ci    n = s->coefs_end[bsize] - s->coefs_start;
545cabdff1aSopenharmony_ci    for (ch = 0; ch < channels; ch++)
546cabdff1aSopenharmony_ci        nb_coefs[ch] = n;
547cabdff1aSopenharmony_ci
548cabdff1aSopenharmony_ci    /* complex coding */
549cabdff1aSopenharmony_ci    if (s->use_noise_coding) {
550cabdff1aSopenharmony_ci        for (ch = 0; ch < channels; ch++) {
551cabdff1aSopenharmony_ci            if (s->channel_coded[ch]) {
552cabdff1aSopenharmony_ci                int i, n, a;
553cabdff1aSopenharmony_ci                n = s->exponent_high_sizes[bsize];
554cabdff1aSopenharmony_ci                for (i = 0; i < n; i++) {
555cabdff1aSopenharmony_ci                    a                         = get_bits1(&s->gb);
556cabdff1aSopenharmony_ci                    s->high_band_coded[ch][i] = a;
557cabdff1aSopenharmony_ci                    /* if noise coding, the coefficients are not transmitted */
558cabdff1aSopenharmony_ci                    if (a)
559cabdff1aSopenharmony_ci                        nb_coefs[ch] -= s->exponent_high_bands[bsize][i];
560cabdff1aSopenharmony_ci                }
561cabdff1aSopenharmony_ci            }
562cabdff1aSopenharmony_ci        }
563cabdff1aSopenharmony_ci        for (ch = 0; ch < channels; ch++) {
564cabdff1aSopenharmony_ci            if (s->channel_coded[ch]) {
565cabdff1aSopenharmony_ci                int i, n, val;
566cabdff1aSopenharmony_ci
567cabdff1aSopenharmony_ci                n   = s->exponent_high_sizes[bsize];
568cabdff1aSopenharmony_ci                val = (int) 0x80000000;
569cabdff1aSopenharmony_ci                for (i = 0; i < n; i++) {
570cabdff1aSopenharmony_ci                    if (s->high_band_coded[ch][i]) {
571cabdff1aSopenharmony_ci                        if (val == (int) 0x80000000) {
572cabdff1aSopenharmony_ci                            val = get_bits(&s->gb, 7) - 19;
573cabdff1aSopenharmony_ci                        } else {
574cabdff1aSopenharmony_ci                            val += get_vlc2(&s->gb, s->hgain_vlc.table,
575cabdff1aSopenharmony_ci                                            HGAINVLCBITS, HGAINMAX);
576cabdff1aSopenharmony_ci                        }
577cabdff1aSopenharmony_ci                        s->high_band_values[ch][i] = val;
578cabdff1aSopenharmony_ci                    }
579cabdff1aSopenharmony_ci                }
580cabdff1aSopenharmony_ci            }
581cabdff1aSopenharmony_ci        }
582cabdff1aSopenharmony_ci    }
583cabdff1aSopenharmony_ci
584cabdff1aSopenharmony_ci    /* exponents can be reused in short blocks. */
585cabdff1aSopenharmony_ci    if ((s->block_len_bits == s->frame_len_bits) || get_bits1(&s->gb)) {
586cabdff1aSopenharmony_ci        for (ch = 0; ch < channels; ch++) {
587cabdff1aSopenharmony_ci            if (s->channel_coded[ch]) {
588cabdff1aSopenharmony_ci                if (s->use_exp_vlc) {
589cabdff1aSopenharmony_ci                    if (decode_exp_vlc(s, ch) < 0)
590cabdff1aSopenharmony_ci                        return -1;
591cabdff1aSopenharmony_ci                } else {
592cabdff1aSopenharmony_ci                    decode_exp_lsp(s, ch);
593cabdff1aSopenharmony_ci                }
594cabdff1aSopenharmony_ci                s->exponents_bsize[ch] = bsize;
595cabdff1aSopenharmony_ci                s->exponents_initialized[ch] = 1;
596cabdff1aSopenharmony_ci            }
597cabdff1aSopenharmony_ci        }
598cabdff1aSopenharmony_ci    }
599cabdff1aSopenharmony_ci
600cabdff1aSopenharmony_ci    for (ch = 0; ch < channels; ch++) {
601cabdff1aSopenharmony_ci        if (s->channel_coded[ch] && !s->exponents_initialized[ch])
602cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
603cabdff1aSopenharmony_ci    }
604cabdff1aSopenharmony_ci
605cabdff1aSopenharmony_ci    /* parse spectral coefficients : just RLE encoding */
606cabdff1aSopenharmony_ci    for (ch = 0; ch < channels; ch++) {
607cabdff1aSopenharmony_ci        if (s->channel_coded[ch]) {
608cabdff1aSopenharmony_ci            int tindex;
609cabdff1aSopenharmony_ci            WMACoef *ptr = &s->coefs1[ch][0];
610cabdff1aSopenharmony_ci            int ret;
611cabdff1aSopenharmony_ci
612cabdff1aSopenharmony_ci            /* special VLC tables are used for ms stereo because
613cabdff1aSopenharmony_ci             * there is potentially less energy there */
614cabdff1aSopenharmony_ci            tindex = (ch == 1 && s->ms_stereo);
615cabdff1aSopenharmony_ci            memset(ptr, 0, s->block_len * sizeof(WMACoef));
616cabdff1aSopenharmony_ci            ret = ff_wma_run_level_decode(s->avctx, &s->gb, &s->coef_vlc[tindex],
617cabdff1aSopenharmony_ci                                          s->level_table[tindex], s->run_table[tindex],
618cabdff1aSopenharmony_ci                                          0, ptr, 0, nb_coefs[ch],
619cabdff1aSopenharmony_ci                                          s->block_len, s->frame_len_bits, coef_nb_bits);
620cabdff1aSopenharmony_ci            if (ret < 0)
621cabdff1aSopenharmony_ci                return ret;
622cabdff1aSopenharmony_ci        }
623cabdff1aSopenharmony_ci        if (s->version == 1 && channels >= 2)
624cabdff1aSopenharmony_ci            align_get_bits(&s->gb);
625cabdff1aSopenharmony_ci    }
626cabdff1aSopenharmony_ci
627cabdff1aSopenharmony_ci    /* normalize */
628cabdff1aSopenharmony_ci    {
629cabdff1aSopenharmony_ci        int n4 = s->block_len / 2;
630cabdff1aSopenharmony_ci        mdct_norm = 1.0 / (float) n4;
631cabdff1aSopenharmony_ci        if (s->version == 1)
632cabdff1aSopenharmony_ci            mdct_norm *= sqrt(n4);
633cabdff1aSopenharmony_ci    }
634cabdff1aSopenharmony_ci
635cabdff1aSopenharmony_ci    /* finally compute the MDCT coefficients */
636cabdff1aSopenharmony_ci    for (ch = 0; ch < channels; ch++) {
637cabdff1aSopenharmony_ci        if (s->channel_coded[ch]) {
638cabdff1aSopenharmony_ci            WMACoef *coefs1;
639cabdff1aSopenharmony_ci            float *coefs, *exponents, mult, mult1, noise;
640cabdff1aSopenharmony_ci            int i, j, n, n1, last_high_band, esize;
641cabdff1aSopenharmony_ci            float exp_power[HIGH_BAND_MAX_SIZE];
642cabdff1aSopenharmony_ci
643cabdff1aSopenharmony_ci            coefs1    = s->coefs1[ch];
644cabdff1aSopenharmony_ci            exponents = s->exponents[ch];
645cabdff1aSopenharmony_ci            esize     = s->exponents_bsize[ch];
646cabdff1aSopenharmony_ci            mult      = ff_exp10(total_gain * 0.05) / s->max_exponent[ch];
647cabdff1aSopenharmony_ci            mult     *= mdct_norm;
648cabdff1aSopenharmony_ci            coefs     = s->coefs[ch];
649cabdff1aSopenharmony_ci            if (s->use_noise_coding) {
650cabdff1aSopenharmony_ci                mult1 = mult;
651cabdff1aSopenharmony_ci                /* very low freqs : noise */
652cabdff1aSopenharmony_ci                for (i = 0; i < s->coefs_start; i++) {
653cabdff1aSopenharmony_ci                    *coefs++ = s->noise_table[s->noise_index] *
654cabdff1aSopenharmony_ci                               exponents[i << bsize >> esize] * mult1;
655cabdff1aSopenharmony_ci                    s->noise_index = (s->noise_index + 1) &
656cabdff1aSopenharmony_ci                                     (NOISE_TAB_SIZE - 1);
657cabdff1aSopenharmony_ci                }
658cabdff1aSopenharmony_ci
659cabdff1aSopenharmony_ci                n1 = s->exponent_high_sizes[bsize];
660cabdff1aSopenharmony_ci
661cabdff1aSopenharmony_ci                /* compute power of high bands */
662cabdff1aSopenharmony_ci                exponents = s->exponents[ch] +
663cabdff1aSopenharmony_ci                            (s->high_band_start[bsize] << bsize >> esize);
664cabdff1aSopenharmony_ci                last_high_band = 0; /* avoid warning */
665cabdff1aSopenharmony_ci                for (j = 0; j < n1; j++) {
666cabdff1aSopenharmony_ci                    n = s->exponent_high_bands[s->frame_len_bits -
667cabdff1aSopenharmony_ci                                               s->block_len_bits][j];
668cabdff1aSopenharmony_ci                    if (s->high_band_coded[ch][j]) {
669cabdff1aSopenharmony_ci                        float e2, v;
670cabdff1aSopenharmony_ci                        e2 = 0;
671cabdff1aSopenharmony_ci                        for (i = 0; i < n; i++) {
672cabdff1aSopenharmony_ci                            v   = exponents[i << bsize >> esize];
673cabdff1aSopenharmony_ci                            e2 += v * v;
674cabdff1aSopenharmony_ci                        }
675cabdff1aSopenharmony_ci                        exp_power[j]   = e2 / n;
676cabdff1aSopenharmony_ci                        last_high_band = j;
677cabdff1aSopenharmony_ci                        ff_tlog(s->avctx, "%d: power=%f (%d)\n", j, exp_power[j], n);
678cabdff1aSopenharmony_ci                    }
679cabdff1aSopenharmony_ci                    exponents += n << bsize >> esize;
680cabdff1aSopenharmony_ci                }
681cabdff1aSopenharmony_ci
682cabdff1aSopenharmony_ci                /* main freqs and high freqs */
683cabdff1aSopenharmony_ci                exponents = s->exponents[ch] + (s->coefs_start << bsize >> esize);
684cabdff1aSopenharmony_ci                for (j = -1; j < n1; j++) {
685cabdff1aSopenharmony_ci                    if (j < 0)
686cabdff1aSopenharmony_ci                        n = s->high_band_start[bsize] - s->coefs_start;
687cabdff1aSopenharmony_ci                    else
688cabdff1aSopenharmony_ci                        n = s->exponent_high_bands[s->frame_len_bits -
689cabdff1aSopenharmony_ci                                                   s->block_len_bits][j];
690cabdff1aSopenharmony_ci                    if (j >= 0 && s->high_band_coded[ch][j]) {
691cabdff1aSopenharmony_ci                        /* use noise with specified power */
692cabdff1aSopenharmony_ci                        mult1 = sqrt(exp_power[j] / exp_power[last_high_band]);
693cabdff1aSopenharmony_ci                        /* XXX: use a table */
694cabdff1aSopenharmony_ci                        mult1  = mult1 * ff_exp10(s->high_band_values[ch][j] * 0.05);
695cabdff1aSopenharmony_ci                        mult1  = mult1 / (s->max_exponent[ch] * s->noise_mult);
696cabdff1aSopenharmony_ci                        mult1 *= mdct_norm;
697cabdff1aSopenharmony_ci                        for (i = 0; i < n; i++) {
698cabdff1aSopenharmony_ci                            noise          = s->noise_table[s->noise_index];
699cabdff1aSopenharmony_ci                            s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
700cabdff1aSopenharmony_ci                            *coefs++       = noise * exponents[i << bsize >> esize] * mult1;
701cabdff1aSopenharmony_ci                        }
702cabdff1aSopenharmony_ci                        exponents += n << bsize >> esize;
703cabdff1aSopenharmony_ci                    } else {
704cabdff1aSopenharmony_ci                        /* coded values + small noise */
705cabdff1aSopenharmony_ci                        for (i = 0; i < n; i++) {
706cabdff1aSopenharmony_ci                            noise          = s->noise_table[s->noise_index];
707cabdff1aSopenharmony_ci                            s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
708cabdff1aSopenharmony_ci                            *coefs++       = ((*coefs1++) + noise) *
709cabdff1aSopenharmony_ci                                             exponents[i << bsize >> esize] * mult;
710cabdff1aSopenharmony_ci                        }
711cabdff1aSopenharmony_ci                        exponents += n << bsize >> esize;
712cabdff1aSopenharmony_ci                    }
713cabdff1aSopenharmony_ci                }
714cabdff1aSopenharmony_ci
715cabdff1aSopenharmony_ci                /* very high freqs : noise */
716cabdff1aSopenharmony_ci                n     = s->block_len - s->coefs_end[bsize];
717cabdff1aSopenharmony_ci                mult1 = mult * exponents[(-(1 << bsize)) >> esize];
718cabdff1aSopenharmony_ci                for (i = 0; i < n; i++) {
719cabdff1aSopenharmony_ci                    *coefs++       = s->noise_table[s->noise_index] * mult1;
720cabdff1aSopenharmony_ci                    s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
721cabdff1aSopenharmony_ci                }
722cabdff1aSopenharmony_ci            } else {
723cabdff1aSopenharmony_ci                /* XXX: optimize more */
724cabdff1aSopenharmony_ci                for (i = 0; i < s->coefs_start; i++)
725cabdff1aSopenharmony_ci                    *coefs++ = 0.0;
726cabdff1aSopenharmony_ci                n = nb_coefs[ch];
727cabdff1aSopenharmony_ci                for (i = 0; i < n; i++)
728cabdff1aSopenharmony_ci                    *coefs++ = coefs1[i] * exponents[i << bsize >> esize] * mult;
729cabdff1aSopenharmony_ci                n = s->block_len - s->coefs_end[bsize];
730cabdff1aSopenharmony_ci                for (i = 0; i < n; i++)
731cabdff1aSopenharmony_ci                    *coefs++ = 0.0;
732cabdff1aSopenharmony_ci            }
733cabdff1aSopenharmony_ci        }
734cabdff1aSopenharmony_ci    }
735cabdff1aSopenharmony_ci
736cabdff1aSopenharmony_ci#ifdef TRACE
737cabdff1aSopenharmony_ci    for (ch = 0; ch < channels; ch++) {
738cabdff1aSopenharmony_ci        if (s->channel_coded[ch]) {
739cabdff1aSopenharmony_ci            dump_floats(s, "exponents", 3, s->exponents[ch], s->block_len);
740cabdff1aSopenharmony_ci            dump_floats(s, "coefs", 1, s->coefs[ch], s->block_len);
741cabdff1aSopenharmony_ci        }
742cabdff1aSopenharmony_ci    }
743cabdff1aSopenharmony_ci#endif /* TRACE */
744cabdff1aSopenharmony_ci
745cabdff1aSopenharmony_ci    if (s->ms_stereo && s->channel_coded[1]) {
746cabdff1aSopenharmony_ci        /* nominal case for ms stereo: we do it before mdct */
747cabdff1aSopenharmony_ci        /* no need to optimize this case because it should almost
748cabdff1aSopenharmony_ci         * never happen */
749cabdff1aSopenharmony_ci        if (!s->channel_coded[0]) {
750cabdff1aSopenharmony_ci            ff_tlog(s->avctx, "rare ms-stereo case happened\n");
751cabdff1aSopenharmony_ci            memset(s->coefs[0], 0, sizeof(float) * s->block_len);
752cabdff1aSopenharmony_ci            s->channel_coded[0] = 1;
753cabdff1aSopenharmony_ci        }
754cabdff1aSopenharmony_ci
755cabdff1aSopenharmony_ci        s->fdsp->butterflies_float(s->coefs[0], s->coefs[1], s->block_len);
756cabdff1aSopenharmony_ci    }
757cabdff1aSopenharmony_ci
758cabdff1aSopenharmony_cinext:
759cabdff1aSopenharmony_ci    mdct = &s->mdct_ctx[bsize];
760cabdff1aSopenharmony_ci
761cabdff1aSopenharmony_ci    for (ch = 0; ch < channels; ch++) {
762cabdff1aSopenharmony_ci        int n4, index;
763cabdff1aSopenharmony_ci
764cabdff1aSopenharmony_ci        n4 = s->block_len / 2;
765cabdff1aSopenharmony_ci        if (s->channel_coded[ch])
766cabdff1aSopenharmony_ci            mdct->imdct_calc(mdct, s->output, s->coefs[ch]);
767cabdff1aSopenharmony_ci        else if (!(s->ms_stereo && ch == 1))
768cabdff1aSopenharmony_ci            memset(s->output, 0, sizeof(s->output));
769cabdff1aSopenharmony_ci
770cabdff1aSopenharmony_ci        /* multiply by the window and add in the frame */
771cabdff1aSopenharmony_ci        index = (s->frame_len / 2) + s->block_pos - n4;
772cabdff1aSopenharmony_ci        wma_window(s, &s->frame_out[ch][index]);
773cabdff1aSopenharmony_ci    }
774cabdff1aSopenharmony_ci
775cabdff1aSopenharmony_ci    /* update block number */
776cabdff1aSopenharmony_ci    s->block_num++;
777cabdff1aSopenharmony_ci    s->block_pos += s->block_len;
778cabdff1aSopenharmony_ci    if (s->block_pos >= s->frame_len)
779cabdff1aSopenharmony_ci        return 1;
780cabdff1aSopenharmony_ci    else
781cabdff1aSopenharmony_ci        return 0;
782cabdff1aSopenharmony_ci}
783cabdff1aSopenharmony_ci
784cabdff1aSopenharmony_ci/* decode a frame of frame_len samples */
785cabdff1aSopenharmony_cistatic int wma_decode_frame(WMACodecContext *s, float **samples,
786cabdff1aSopenharmony_ci                            int samples_offset)
787cabdff1aSopenharmony_ci{
788cabdff1aSopenharmony_ci    int ret, ch;
789cabdff1aSopenharmony_ci
790cabdff1aSopenharmony_ci#ifdef TRACE
791cabdff1aSopenharmony_ci    ff_tlog(s->avctx, "***decode_frame: %d size=%d\n",
792cabdff1aSopenharmony_ci            s->frame_count++, s->frame_len);
793cabdff1aSopenharmony_ci#endif /* TRACE */
794cabdff1aSopenharmony_ci
795cabdff1aSopenharmony_ci    /* read each block */
796cabdff1aSopenharmony_ci    s->block_num = 0;
797cabdff1aSopenharmony_ci    s->block_pos = 0;
798cabdff1aSopenharmony_ci    for (;;) {
799cabdff1aSopenharmony_ci        ret = wma_decode_block(s);
800cabdff1aSopenharmony_ci        if (ret < 0)
801cabdff1aSopenharmony_ci            return -1;
802cabdff1aSopenharmony_ci        if (ret)
803cabdff1aSopenharmony_ci            break;
804cabdff1aSopenharmony_ci    }
805cabdff1aSopenharmony_ci
806cabdff1aSopenharmony_ci    for (ch = 0; ch < s->avctx->ch_layout.nb_channels; ch++) {
807cabdff1aSopenharmony_ci        /* copy current block to output */
808cabdff1aSopenharmony_ci        memcpy(samples[ch] + samples_offset, s->frame_out[ch],
809cabdff1aSopenharmony_ci               s->frame_len * sizeof(*s->frame_out[ch]));
810cabdff1aSopenharmony_ci        /* prepare for next block */
811cabdff1aSopenharmony_ci        memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len],
812cabdff1aSopenharmony_ci                s->frame_len * sizeof(*s->frame_out[ch]));
813cabdff1aSopenharmony_ci
814cabdff1aSopenharmony_ci#ifdef TRACE
815cabdff1aSopenharmony_ci        dump_floats(s, "samples", 6, samples[ch] + samples_offset,
816cabdff1aSopenharmony_ci                    s->frame_len);
817cabdff1aSopenharmony_ci#endif /* TRACE */
818cabdff1aSopenharmony_ci    }
819cabdff1aSopenharmony_ci
820cabdff1aSopenharmony_ci    return 0;
821cabdff1aSopenharmony_ci}
822cabdff1aSopenharmony_ci
823cabdff1aSopenharmony_cistatic int wma_decode_superframe(AVCodecContext *avctx, AVFrame *frame,
824cabdff1aSopenharmony_ci                                 int *got_frame_ptr, AVPacket *avpkt)
825cabdff1aSopenharmony_ci{
826cabdff1aSopenharmony_ci    const uint8_t *buf = avpkt->data;
827cabdff1aSopenharmony_ci    int buf_size       = avpkt->size;
828cabdff1aSopenharmony_ci    WMACodecContext *s = avctx->priv_data;
829cabdff1aSopenharmony_ci    int nb_frames, bit_offset, i, pos, len, ret;
830cabdff1aSopenharmony_ci    uint8_t *q;
831cabdff1aSopenharmony_ci    float **samples;
832cabdff1aSopenharmony_ci    int samples_offset;
833cabdff1aSopenharmony_ci
834cabdff1aSopenharmony_ci    ff_tlog(avctx, "***decode_superframe:\n");
835cabdff1aSopenharmony_ci
836cabdff1aSopenharmony_ci    if (buf_size == 0) {
837cabdff1aSopenharmony_ci        if (s->eof_done)
838cabdff1aSopenharmony_ci            return 0;
839cabdff1aSopenharmony_ci
840cabdff1aSopenharmony_ci        frame->nb_samples = s->frame_len;
841cabdff1aSopenharmony_ci        if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
842cabdff1aSopenharmony_ci            return ret;
843cabdff1aSopenharmony_ci
844cabdff1aSopenharmony_ci        for (i = 0; i < s->avctx->ch_layout.nb_channels; i++)
845cabdff1aSopenharmony_ci            memcpy(frame->extended_data[i], &s->frame_out[i][0],
846cabdff1aSopenharmony_ci                   frame->nb_samples * sizeof(s->frame_out[i][0]));
847cabdff1aSopenharmony_ci
848cabdff1aSopenharmony_ci        s->last_superframe_len = 0;
849cabdff1aSopenharmony_ci        s->eof_done = 1;
850cabdff1aSopenharmony_ci        *got_frame_ptr = 1;
851cabdff1aSopenharmony_ci        return 0;
852cabdff1aSopenharmony_ci    }
853cabdff1aSopenharmony_ci    if (buf_size < avctx->block_align) {
854cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR,
855cabdff1aSopenharmony_ci               "Input packet size too small (%d < %d)\n",
856cabdff1aSopenharmony_ci               buf_size, avctx->block_align);
857cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
858cabdff1aSopenharmony_ci    }
859cabdff1aSopenharmony_ci    if (avctx->block_align)
860cabdff1aSopenharmony_ci        buf_size = avctx->block_align;
861cabdff1aSopenharmony_ci
862cabdff1aSopenharmony_ci    init_get_bits(&s->gb, buf, buf_size * 8);
863cabdff1aSopenharmony_ci
864cabdff1aSopenharmony_ci    if (s->use_bit_reservoir) {
865cabdff1aSopenharmony_ci        /* read super frame header */
866cabdff1aSopenharmony_ci        skip_bits(&s->gb, 4); /* super frame index */
867cabdff1aSopenharmony_ci        nb_frames = get_bits(&s->gb, 4) - (s->last_superframe_len <= 0);
868cabdff1aSopenharmony_ci        if (nb_frames <= 0) {
869cabdff1aSopenharmony_ci            int is_error = nb_frames < 0 || get_bits_left(&s->gb) <= 8;
870cabdff1aSopenharmony_ci            av_log(avctx, is_error ? AV_LOG_ERROR : AV_LOG_WARNING,
871cabdff1aSopenharmony_ci                   "nb_frames is %d bits left %d\n",
872cabdff1aSopenharmony_ci                   nb_frames, get_bits_left(&s->gb));
873cabdff1aSopenharmony_ci            if (is_error)
874cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
875cabdff1aSopenharmony_ci
876cabdff1aSopenharmony_ci            if ((s->last_superframe_len + buf_size - 1) >
877cabdff1aSopenharmony_ci                MAX_CODED_SUPERFRAME_SIZE)
878cabdff1aSopenharmony_ci                goto fail;
879cabdff1aSopenharmony_ci
880cabdff1aSopenharmony_ci            q   = s->last_superframe + s->last_superframe_len;
881cabdff1aSopenharmony_ci            len = buf_size - 1;
882cabdff1aSopenharmony_ci            while (len > 0) {
883cabdff1aSopenharmony_ci                *q++ = get_bits (&s->gb, 8);
884cabdff1aSopenharmony_ci                len --;
885cabdff1aSopenharmony_ci            }
886cabdff1aSopenharmony_ci            memset(q, 0, AV_INPUT_BUFFER_PADDING_SIZE);
887cabdff1aSopenharmony_ci
888cabdff1aSopenharmony_ci            s->last_superframe_len += 8*buf_size - 8;
889cabdff1aSopenharmony_ci//             s->reset_block_lengths = 1; //XXX is this needed ?
890cabdff1aSopenharmony_ci            *got_frame_ptr = 0;
891cabdff1aSopenharmony_ci            return buf_size;
892cabdff1aSopenharmony_ci        }
893cabdff1aSopenharmony_ci    } else
894cabdff1aSopenharmony_ci        nb_frames = 1;
895cabdff1aSopenharmony_ci
896cabdff1aSopenharmony_ci    /* get output buffer */
897cabdff1aSopenharmony_ci    frame->nb_samples = nb_frames * s->frame_len;
898cabdff1aSopenharmony_ci    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
899cabdff1aSopenharmony_ci        return ret;
900cabdff1aSopenharmony_ci    samples        = (float **) frame->extended_data;
901cabdff1aSopenharmony_ci    samples_offset = 0;
902cabdff1aSopenharmony_ci
903cabdff1aSopenharmony_ci    if (s->use_bit_reservoir) {
904cabdff1aSopenharmony_ci        bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3);
905cabdff1aSopenharmony_ci        if (bit_offset > get_bits_left(&s->gb)) {
906cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR,
907cabdff1aSopenharmony_ci                   "Invalid last frame bit offset %d > buf size %d (%d)\n",
908cabdff1aSopenharmony_ci                   bit_offset, get_bits_left(&s->gb), buf_size);
909cabdff1aSopenharmony_ci            goto fail;
910cabdff1aSopenharmony_ci        }
911cabdff1aSopenharmony_ci
912cabdff1aSopenharmony_ci        if (s->last_superframe_len > 0) {
913cabdff1aSopenharmony_ci            /* add bit_offset bits to last frame */
914cabdff1aSopenharmony_ci            if ((s->last_superframe_len + ((bit_offset + 7) >> 3)) >
915cabdff1aSopenharmony_ci                MAX_CODED_SUPERFRAME_SIZE)
916cabdff1aSopenharmony_ci                goto fail;
917cabdff1aSopenharmony_ci            q   = s->last_superframe + s->last_superframe_len;
918cabdff1aSopenharmony_ci            len = bit_offset;
919cabdff1aSopenharmony_ci            while (len > 7) {
920cabdff1aSopenharmony_ci                *q++ = get_bits(&s->gb, 8);
921cabdff1aSopenharmony_ci                len -= 8;
922cabdff1aSopenharmony_ci            }
923cabdff1aSopenharmony_ci            if (len > 0)
924cabdff1aSopenharmony_ci                *q++ = get_bits(&s->gb, len) << (8 - len);
925cabdff1aSopenharmony_ci            memset(q, 0, AV_INPUT_BUFFER_PADDING_SIZE);
926cabdff1aSopenharmony_ci
927cabdff1aSopenharmony_ci            /* XXX: bit_offset bits into last frame */
928cabdff1aSopenharmony_ci            init_get_bits(&s->gb, s->last_superframe,
929cabdff1aSopenharmony_ci                          s->last_superframe_len * 8 + bit_offset);
930cabdff1aSopenharmony_ci            /* skip unused bits */
931cabdff1aSopenharmony_ci            if (s->last_bitoffset > 0)
932cabdff1aSopenharmony_ci                skip_bits(&s->gb, s->last_bitoffset);
933cabdff1aSopenharmony_ci            /* this frame is stored in the last superframe and in the
934cabdff1aSopenharmony_ci             * current one */
935cabdff1aSopenharmony_ci            if (wma_decode_frame(s, samples, samples_offset) < 0)
936cabdff1aSopenharmony_ci                goto fail;
937cabdff1aSopenharmony_ci            samples_offset += s->frame_len;
938cabdff1aSopenharmony_ci            nb_frames--;
939cabdff1aSopenharmony_ci        }
940cabdff1aSopenharmony_ci
941cabdff1aSopenharmony_ci        /* read each frame starting from bit_offset */
942cabdff1aSopenharmony_ci        pos = bit_offset + 4 + 4 + s->byte_offset_bits + 3;
943cabdff1aSopenharmony_ci        if (pos >= MAX_CODED_SUPERFRAME_SIZE * 8 || pos > buf_size * 8)
944cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
945cabdff1aSopenharmony_ci        init_get_bits(&s->gb, buf + (pos >> 3), (buf_size - (pos >> 3)) * 8);
946cabdff1aSopenharmony_ci        len = pos & 7;
947cabdff1aSopenharmony_ci        if (len > 0)
948cabdff1aSopenharmony_ci            skip_bits(&s->gb, len);
949cabdff1aSopenharmony_ci
950cabdff1aSopenharmony_ci        s->reset_block_lengths = 1;
951cabdff1aSopenharmony_ci        for (i = 0; i < nb_frames; i++) {
952cabdff1aSopenharmony_ci            if (wma_decode_frame(s, samples, samples_offset) < 0)
953cabdff1aSopenharmony_ci                goto fail;
954cabdff1aSopenharmony_ci            samples_offset += s->frame_len;
955cabdff1aSopenharmony_ci        }
956cabdff1aSopenharmony_ci
957cabdff1aSopenharmony_ci        /* we copy the end of the frame in the last frame buffer */
958cabdff1aSopenharmony_ci        pos               = get_bits_count(&s->gb) +
959cabdff1aSopenharmony_ci                            ((bit_offset + 4 + 4 + s->byte_offset_bits + 3) & ~7);
960cabdff1aSopenharmony_ci        s->last_bitoffset = pos & 7;
961cabdff1aSopenharmony_ci        pos             >>= 3;
962cabdff1aSopenharmony_ci        len               = buf_size - pos;
963cabdff1aSopenharmony_ci        if (len > MAX_CODED_SUPERFRAME_SIZE || len < 0) {
964cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "len %d invalid\n", len);
965cabdff1aSopenharmony_ci            goto fail;
966cabdff1aSopenharmony_ci        }
967cabdff1aSopenharmony_ci        s->last_superframe_len = len;
968cabdff1aSopenharmony_ci        memcpy(s->last_superframe, buf + pos, len);
969cabdff1aSopenharmony_ci    } else {
970cabdff1aSopenharmony_ci        /* single frame decode */
971cabdff1aSopenharmony_ci        if (wma_decode_frame(s, samples, samples_offset) < 0)
972cabdff1aSopenharmony_ci            goto fail;
973cabdff1aSopenharmony_ci        samples_offset += s->frame_len;
974cabdff1aSopenharmony_ci    }
975cabdff1aSopenharmony_ci
976cabdff1aSopenharmony_ci    ff_dlog(s->avctx, "%d %d %d %d eaten:%d\n",
977cabdff1aSopenharmony_ci            s->frame_len_bits, s->block_len_bits, s->frame_len, s->block_len,
978cabdff1aSopenharmony_ci            avctx->block_align);
979cabdff1aSopenharmony_ci
980cabdff1aSopenharmony_ci    *got_frame_ptr = 1;
981cabdff1aSopenharmony_ci
982cabdff1aSopenharmony_ci    return buf_size;
983cabdff1aSopenharmony_ci
984cabdff1aSopenharmony_cifail:
985cabdff1aSopenharmony_ci    /* when error, we reset the bit reservoir */
986cabdff1aSopenharmony_ci    s->last_superframe_len = 0;
987cabdff1aSopenharmony_ci    return -1;
988cabdff1aSopenharmony_ci}
989cabdff1aSopenharmony_ci
990cabdff1aSopenharmony_cistatic av_cold void flush(AVCodecContext *avctx)
991cabdff1aSopenharmony_ci{
992cabdff1aSopenharmony_ci    WMACodecContext *s = avctx->priv_data;
993cabdff1aSopenharmony_ci
994cabdff1aSopenharmony_ci    s->last_bitoffset      =
995cabdff1aSopenharmony_ci    s->last_superframe_len = 0;
996cabdff1aSopenharmony_ci
997cabdff1aSopenharmony_ci    s->eof_done = 0;
998cabdff1aSopenharmony_ci    avctx->internal->skip_samples = s->frame_len * 2;
999cabdff1aSopenharmony_ci}
1000cabdff1aSopenharmony_ci
1001cabdff1aSopenharmony_ci#if CONFIG_WMAV1_DECODER
1002cabdff1aSopenharmony_ciconst FFCodec ff_wmav1_decoder = {
1003cabdff1aSopenharmony_ci    .p.name         = "wmav1",
1004cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"),
1005cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_AUDIO,
1006cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_WMAV1,
1007cabdff1aSopenharmony_ci    .priv_data_size = sizeof(WMACodecContext),
1008cabdff1aSopenharmony_ci    .init           = wma_decode_init,
1009cabdff1aSopenharmony_ci    .close          = ff_wma_end,
1010cabdff1aSopenharmony_ci    FF_CODEC_DECODE_CB(wma_decode_superframe),
1011cabdff1aSopenharmony_ci    .flush          = flush,
1012cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
1013cabdff1aSopenharmony_ci    .p.sample_fmts  = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
1014cabdff1aSopenharmony_ci                                                      AV_SAMPLE_FMT_NONE },
1015cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
1016cabdff1aSopenharmony_ci};
1017cabdff1aSopenharmony_ci#endif
1018cabdff1aSopenharmony_ci#if CONFIG_WMAV2_DECODER
1019cabdff1aSopenharmony_ciconst FFCodec ff_wmav2_decoder = {
1020cabdff1aSopenharmony_ci    .p.name         = "wmav2",
1021cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"),
1022cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_AUDIO,
1023cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_WMAV2,
1024cabdff1aSopenharmony_ci    .priv_data_size = sizeof(WMACodecContext),
1025cabdff1aSopenharmony_ci    .init           = wma_decode_init,
1026cabdff1aSopenharmony_ci    .close          = ff_wma_end,
1027cabdff1aSopenharmony_ci    FF_CODEC_DECODE_CB(wma_decode_superframe),
1028cabdff1aSopenharmony_ci    .flush          = flush,
1029cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
1030cabdff1aSopenharmony_ci    .p.sample_fmts  = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
1031cabdff1aSopenharmony_ci                                                      AV_SAMPLE_FMT_NONE },
1032cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
1033cabdff1aSopenharmony_ci};
1034cabdff1aSopenharmony_ci#endif
1035