1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Windows Media Audio Lossless decoder
3cabdff1aSopenharmony_ci * Copyright (c) 2007 Baptiste Coudurier, Benjamin Larsson, Ulion
4cabdff1aSopenharmony_ci * Copyright (c) 2008 - 2011 Sascha Sommer, Benjamin Larsson
5cabdff1aSopenharmony_ci * Copyright (c) 2011 Andreas Öman
6cabdff1aSopenharmony_ci * Copyright (c) 2011 - 2012 Mashiat Sarker Shakkhar
7cabdff1aSopenharmony_ci *
8cabdff1aSopenharmony_ci * This file is part of FFmpeg.
9cabdff1aSopenharmony_ci *
10cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
11cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
12cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
13cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
14cabdff1aSopenharmony_ci *
15cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
16cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
17cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18cabdff1aSopenharmony_ci * Lesser General Public License for more details.
19cabdff1aSopenharmony_ci *
20cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
21cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
22cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23cabdff1aSopenharmony_ci */
24cabdff1aSopenharmony_ci
25cabdff1aSopenharmony_ci#include <inttypes.h>
26cabdff1aSopenharmony_ci
27cabdff1aSopenharmony_ci#include "libavutil/attributes.h"
28cabdff1aSopenharmony_ci#include "libavutil/avassert.h"
29cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h"
30cabdff1aSopenharmony_ci
31cabdff1aSopenharmony_ci#include "avcodec.h"
32cabdff1aSopenharmony_ci#include "codec_internal.h"
33cabdff1aSopenharmony_ci#include "internal.h"
34cabdff1aSopenharmony_ci#include "get_bits.h"
35cabdff1aSopenharmony_ci#include "put_bits.h"
36cabdff1aSopenharmony_ci#include "lossless_audiodsp.h"
37cabdff1aSopenharmony_ci#include "wma.h"
38cabdff1aSopenharmony_ci#include "wma_common.h"
39cabdff1aSopenharmony_ci
40cabdff1aSopenharmony_ci/** current decoder limitations */
41cabdff1aSopenharmony_ci#define WMALL_MAX_CHANNELS      8                       ///< max number of handled channels
42cabdff1aSopenharmony_ci#define MAX_SUBFRAMES          32                       ///< max number of subframes per channel
43cabdff1aSopenharmony_ci#define MAX_BANDS              29                       ///< max number of scale factor bands
44cabdff1aSopenharmony_ci#define MAX_FRAMESIZE       32768                       ///< maximum compressed frame size
45cabdff1aSopenharmony_ci#define MAX_ORDER             256
46cabdff1aSopenharmony_ci
47cabdff1aSopenharmony_ci#define WMALL_BLOCK_MIN_BITS    6                       ///< log2 of min block size
48cabdff1aSopenharmony_ci#define WMALL_BLOCK_MAX_BITS   14                       ///< log2 of max block size
49cabdff1aSopenharmony_ci#define WMALL_BLOCK_MAX_SIZE (1 << WMALL_BLOCK_MAX_BITS)    ///< maximum block size
50cabdff1aSopenharmony_ci#define WMALL_BLOCK_SIZES    (WMALL_BLOCK_MAX_BITS - WMALL_BLOCK_MIN_BITS + 1) ///< possible block sizes
51cabdff1aSopenharmony_ci
52cabdff1aSopenharmony_ci#define WMALL_COEFF_PAD_SIZE   16                       ///< pad coef buffers with 0 for use with SIMD
53cabdff1aSopenharmony_ci
54cabdff1aSopenharmony_ci/**
55cabdff1aSopenharmony_ci * @brief frame-specific decoder context for a single channel
56cabdff1aSopenharmony_ci */
57cabdff1aSopenharmony_citypedef struct WmallChannelCtx {
58cabdff1aSopenharmony_ci    int16_t     prev_block_len;                         ///< length of the previous block
59cabdff1aSopenharmony_ci    uint8_t     transmit_coefs;
60cabdff1aSopenharmony_ci    uint8_t     num_subframes;
61cabdff1aSopenharmony_ci    uint16_t    subframe_len[MAX_SUBFRAMES];            ///< subframe length in samples
62cabdff1aSopenharmony_ci    uint16_t    subframe_offsets[MAX_SUBFRAMES];        ///< subframe positions in the current frame
63cabdff1aSopenharmony_ci    uint8_t     cur_subframe;                           ///< current subframe number
64cabdff1aSopenharmony_ci    uint16_t    decoded_samples;                        ///< number of already processed samples
65cabdff1aSopenharmony_ci    int         quant_step;                             ///< quantization step for the current subframe
66cabdff1aSopenharmony_ci    int         transient_counter;                      ///< number of transient samples from the beginning of the transient zone
67cabdff1aSopenharmony_ci} WmallChannelCtx;
68cabdff1aSopenharmony_ci
69cabdff1aSopenharmony_ci/**
70cabdff1aSopenharmony_ci * @brief main decoder context
71cabdff1aSopenharmony_ci */
72cabdff1aSopenharmony_citypedef struct WmallDecodeCtx {
73cabdff1aSopenharmony_ci    /* generic decoder variables */
74cabdff1aSopenharmony_ci    AVCodecContext  *avctx;
75cabdff1aSopenharmony_ci    AVFrame         *frame;
76cabdff1aSopenharmony_ci    LLAudDSPContext dsp;                           ///< accelerated DSP functions
77cabdff1aSopenharmony_ci    uint8_t         *frame_data;                    ///< compressed frame data
78cabdff1aSopenharmony_ci    int             max_frame_size;                 ///< max bitstream size
79cabdff1aSopenharmony_ci    PutBitContext   pb;                             ///< context for filling the frame_data buffer
80cabdff1aSopenharmony_ci
81cabdff1aSopenharmony_ci    /* frame size dependent frame information (set during initialization) */
82cabdff1aSopenharmony_ci    uint32_t        decode_flags;                   ///< used compression features
83cabdff1aSopenharmony_ci    int             len_prefix;                     ///< frame is prefixed with its length
84cabdff1aSopenharmony_ci    int             dynamic_range_compression;      ///< frame contains DRC data
85cabdff1aSopenharmony_ci    uint8_t         bits_per_sample;                ///< integer audio sample size for the unscaled IMDCT output (used to scale to [-1.0, 1.0])
86cabdff1aSopenharmony_ci    uint16_t        samples_per_frame;              ///< number of samples to output
87cabdff1aSopenharmony_ci    uint16_t        log2_frame_size;
88cabdff1aSopenharmony_ci    int8_t          num_channels;                   ///< number of channels in the stream (same as AVCodecContext.num_channels)
89cabdff1aSopenharmony_ci    int8_t          lfe_channel;                    ///< lfe channel index
90cabdff1aSopenharmony_ci    uint8_t         max_num_subframes;
91cabdff1aSopenharmony_ci    uint8_t         subframe_len_bits;              ///< number of bits used for the subframe length
92cabdff1aSopenharmony_ci    uint8_t         max_subframe_len_bit;           ///< flag indicating that the subframe is of maximum size when the first subframe length bit is 1
93cabdff1aSopenharmony_ci    uint16_t        min_samples_per_subframe;
94cabdff1aSopenharmony_ci
95cabdff1aSopenharmony_ci    /* packet decode state */
96cabdff1aSopenharmony_ci    GetBitContext   pgb;                            ///< bitstream reader context for the packet
97cabdff1aSopenharmony_ci    int             next_packet_start;              ///< start offset of the next WMA packet in the demuxer packet
98cabdff1aSopenharmony_ci    uint8_t         packet_offset;                  ///< offset to the frame in the packet
99cabdff1aSopenharmony_ci    uint8_t         packet_sequence_number;         ///< current packet number
100cabdff1aSopenharmony_ci    int             num_saved_bits;                 ///< saved number of bits
101cabdff1aSopenharmony_ci    int             frame_offset;                   ///< frame offset in the bit reservoir
102cabdff1aSopenharmony_ci    int             subframe_offset;                ///< subframe offset in the bit reservoir
103cabdff1aSopenharmony_ci    uint8_t         packet_loss;                    ///< set in case of bitstream error
104cabdff1aSopenharmony_ci    uint8_t         packet_done;                    ///< set when a packet is fully decoded
105cabdff1aSopenharmony_ci
106cabdff1aSopenharmony_ci    /* frame decode state */
107cabdff1aSopenharmony_ci    uint32_t        frame_num;                      ///< current frame number (not used for decoding)
108cabdff1aSopenharmony_ci    GetBitContext   gb;                             ///< bitstream reader context
109cabdff1aSopenharmony_ci    int             buf_bit_size;                   ///< buffer size in bits
110cabdff1aSopenharmony_ci    int16_t         *samples_16[WMALL_MAX_CHANNELS]; ///< current sample buffer pointer (16-bit)
111cabdff1aSopenharmony_ci    int32_t         *samples_32[WMALL_MAX_CHANNELS]; ///< current sample buffer pointer (24-bit)
112cabdff1aSopenharmony_ci    uint8_t         drc_gain;                       ///< gain for the DRC tool
113cabdff1aSopenharmony_ci    int8_t          skip_frame;                     ///< skip output step
114cabdff1aSopenharmony_ci    int8_t          parsed_all_subframes;           ///< all subframes decoded?
115cabdff1aSopenharmony_ci
116cabdff1aSopenharmony_ci    /* subframe/block decode state */
117cabdff1aSopenharmony_ci    int16_t         subframe_len;                   ///< current subframe length
118cabdff1aSopenharmony_ci    int8_t          channels_for_cur_subframe;      ///< number of channels that contain the subframe
119cabdff1aSopenharmony_ci    int8_t          channel_indexes_for_cur_subframe[WMALL_MAX_CHANNELS];
120cabdff1aSopenharmony_ci
121cabdff1aSopenharmony_ci    WmallChannelCtx channel[WMALL_MAX_CHANNELS];    ///< per channel data
122cabdff1aSopenharmony_ci
123cabdff1aSopenharmony_ci    // WMA Lossless-specific
124cabdff1aSopenharmony_ci
125cabdff1aSopenharmony_ci    uint8_t do_arith_coding;
126cabdff1aSopenharmony_ci    uint8_t do_ac_filter;
127cabdff1aSopenharmony_ci    uint8_t do_inter_ch_decorr;
128cabdff1aSopenharmony_ci    uint8_t do_mclms;
129cabdff1aSopenharmony_ci    uint8_t do_lpc;
130cabdff1aSopenharmony_ci
131cabdff1aSopenharmony_ci    int8_t  acfilter_order;
132cabdff1aSopenharmony_ci    int8_t  acfilter_scaling;
133cabdff1aSopenharmony_ci    int16_t acfilter_coeffs[16];
134cabdff1aSopenharmony_ci    int     acfilter_prevvalues[WMALL_MAX_CHANNELS][16];
135cabdff1aSopenharmony_ci
136cabdff1aSopenharmony_ci    int8_t  mclms_order;
137cabdff1aSopenharmony_ci    int8_t  mclms_scaling;
138cabdff1aSopenharmony_ci    int16_t mclms_coeffs[WMALL_MAX_CHANNELS * WMALL_MAX_CHANNELS * 32];
139cabdff1aSopenharmony_ci    int16_t mclms_coeffs_cur[WMALL_MAX_CHANNELS * WMALL_MAX_CHANNELS];
140cabdff1aSopenharmony_ci    int32_t mclms_prevvalues[WMALL_MAX_CHANNELS * 2 * 32];
141cabdff1aSopenharmony_ci    int32_t mclms_updates[WMALL_MAX_CHANNELS * 2 * 32];
142cabdff1aSopenharmony_ci    int     mclms_recent;
143cabdff1aSopenharmony_ci
144cabdff1aSopenharmony_ci    int     movave_scaling;
145cabdff1aSopenharmony_ci    int     quant_stepsize;
146cabdff1aSopenharmony_ci
147cabdff1aSopenharmony_ci    struct {
148cabdff1aSopenharmony_ci        int order;
149cabdff1aSopenharmony_ci        int scaling;
150cabdff1aSopenharmony_ci        int coefsend;
151cabdff1aSopenharmony_ci        int bitsend;
152cabdff1aSopenharmony_ci        DECLARE_ALIGNED(16, int16_t, coefs)[MAX_ORDER + WMALL_COEFF_PAD_SIZE/sizeof(int16_t)];
153cabdff1aSopenharmony_ci        DECLARE_ALIGNED(16, int32_t, lms_prevvalues)[MAX_ORDER * 2 + WMALL_COEFF_PAD_SIZE/sizeof(int16_t)];
154cabdff1aSopenharmony_ci        DECLARE_ALIGNED(16, int16_t, lms_updates)[MAX_ORDER * 2 + WMALL_COEFF_PAD_SIZE/sizeof(int16_t)];
155cabdff1aSopenharmony_ci        int recent;
156cabdff1aSopenharmony_ci    } cdlms[WMALL_MAX_CHANNELS][9];
157cabdff1aSopenharmony_ci
158cabdff1aSopenharmony_ci    int cdlms_ttl[WMALL_MAX_CHANNELS];
159cabdff1aSopenharmony_ci
160cabdff1aSopenharmony_ci    int bV3RTM;
161cabdff1aSopenharmony_ci
162cabdff1aSopenharmony_ci    int is_channel_coded[WMALL_MAX_CHANNELS];
163cabdff1aSopenharmony_ci    int update_speed[WMALL_MAX_CHANNELS];
164cabdff1aSopenharmony_ci
165cabdff1aSopenharmony_ci    int transient[WMALL_MAX_CHANNELS];
166cabdff1aSopenharmony_ci    int transient_pos[WMALL_MAX_CHANNELS];
167cabdff1aSopenharmony_ci    int seekable_tile;
168cabdff1aSopenharmony_ci
169cabdff1aSopenharmony_ci    unsigned ave_sum[WMALL_MAX_CHANNELS];
170cabdff1aSopenharmony_ci
171cabdff1aSopenharmony_ci    int channel_residues[WMALL_MAX_CHANNELS][WMALL_BLOCK_MAX_SIZE];
172cabdff1aSopenharmony_ci
173cabdff1aSopenharmony_ci    int lpc_coefs[WMALL_MAX_CHANNELS][40];
174cabdff1aSopenharmony_ci    int lpc_order;
175cabdff1aSopenharmony_ci    int lpc_scaling;
176cabdff1aSopenharmony_ci    int lpc_intbits;
177cabdff1aSopenharmony_ci} WmallDecodeCtx;
178cabdff1aSopenharmony_ci
179cabdff1aSopenharmony_ci/** Get sign of integer (1 for positive, -1 for negative and 0 for zero) */
180cabdff1aSopenharmony_ci#define WMASIGN(x) (((x) > 0) - ((x) < 0))
181cabdff1aSopenharmony_ci
182cabdff1aSopenharmony_cistatic av_cold int decode_init(AVCodecContext *avctx)
183cabdff1aSopenharmony_ci{
184cabdff1aSopenharmony_ci    WmallDecodeCtx *s  = avctx->priv_data;
185cabdff1aSopenharmony_ci    uint8_t *edata_ptr = avctx->extradata;
186cabdff1aSopenharmony_ci    unsigned int channel_mask;
187cabdff1aSopenharmony_ci    int i, log2_max_num_subframes;
188cabdff1aSopenharmony_ci
189cabdff1aSopenharmony_ci    if (avctx->block_align <= 0 || avctx->block_align > (1<<21)) {
190cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "block_align is not set or invalid\n");
191cabdff1aSopenharmony_ci        return AVERROR(EINVAL);
192cabdff1aSopenharmony_ci    }
193cabdff1aSopenharmony_ci
194cabdff1aSopenharmony_ci    if (avctx->extradata_size >= 18) {
195cabdff1aSopenharmony_ci        s->decode_flags    = AV_RL16(edata_ptr + 14);
196cabdff1aSopenharmony_ci        channel_mask       = AV_RL32(edata_ptr +  2);
197cabdff1aSopenharmony_ci        s->bits_per_sample = AV_RL16(edata_ptr);
198cabdff1aSopenharmony_ci        if (s->bits_per_sample == 16)
199cabdff1aSopenharmony_ci            avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
200cabdff1aSopenharmony_ci        else if (s->bits_per_sample == 24) {
201cabdff1aSopenharmony_ci            avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
202cabdff1aSopenharmony_ci            avctx->bits_per_raw_sample = 24;
203cabdff1aSopenharmony_ci        } else {
204cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "Unknown bit-depth: %"PRIu8"\n",
205cabdff1aSopenharmony_ci                   s->bits_per_sample);
206cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
207cabdff1aSopenharmony_ci        }
208cabdff1aSopenharmony_ci        /* dump the extradata */
209cabdff1aSopenharmony_ci        for (i = 0; i < avctx->extradata_size; i++)
210cabdff1aSopenharmony_ci            ff_dlog(avctx, "[%x] ", avctx->extradata[i]);
211cabdff1aSopenharmony_ci        ff_dlog(avctx, "\n");
212cabdff1aSopenharmony_ci
213cabdff1aSopenharmony_ci    } else {
214cabdff1aSopenharmony_ci        avpriv_request_sample(avctx, "Unsupported extradata size");
215cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
216cabdff1aSopenharmony_ci    }
217cabdff1aSopenharmony_ci
218cabdff1aSopenharmony_ci    if (channel_mask) {
219cabdff1aSopenharmony_ci        av_channel_layout_uninit(&avctx->ch_layout);
220cabdff1aSopenharmony_ci        av_channel_layout_from_mask(&avctx->ch_layout, channel_mask);
221cabdff1aSopenharmony_ci    }
222cabdff1aSopenharmony_ci    av_assert0(avctx->ch_layout.nb_channels >= 0);
223cabdff1aSopenharmony_ci    if (avctx->ch_layout.nb_channels > WMALL_MAX_CHANNELS) {
224cabdff1aSopenharmony_ci        avpriv_request_sample(avctx,
225cabdff1aSopenharmony_ci                            "More than " AV_STRINGIFY(WMALL_MAX_CHANNELS) " channels");
226cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
227cabdff1aSopenharmony_ci    }
228cabdff1aSopenharmony_ci
229cabdff1aSopenharmony_ci    s->num_channels = avctx->ch_layout.nb_channels;
230cabdff1aSopenharmony_ci
231cabdff1aSopenharmony_ci    /* extract lfe channel position */
232cabdff1aSopenharmony_ci    s->lfe_channel = -1;
233cabdff1aSopenharmony_ci
234cabdff1aSopenharmony_ci    if (channel_mask & 8) {
235cabdff1aSopenharmony_ci        unsigned int mask;
236cabdff1aSopenharmony_ci        for (mask = 1; mask < 16; mask <<= 1)
237cabdff1aSopenharmony_ci            if (channel_mask & mask)
238cabdff1aSopenharmony_ci                ++s->lfe_channel;
239cabdff1aSopenharmony_ci    }
240cabdff1aSopenharmony_ci
241cabdff1aSopenharmony_ci    s->max_frame_size = MAX_FRAMESIZE * avctx->ch_layout.nb_channels;
242cabdff1aSopenharmony_ci    s->frame_data = av_mallocz(s->max_frame_size + AV_INPUT_BUFFER_PADDING_SIZE);
243cabdff1aSopenharmony_ci    if (!s->frame_data)
244cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
245cabdff1aSopenharmony_ci
246cabdff1aSopenharmony_ci    s->avctx = avctx;
247cabdff1aSopenharmony_ci    ff_llauddsp_init(&s->dsp);
248cabdff1aSopenharmony_ci    init_put_bits(&s->pb, s->frame_data, s->max_frame_size);
249cabdff1aSopenharmony_ci
250cabdff1aSopenharmony_ci    /* generic init */
251cabdff1aSopenharmony_ci    s->log2_frame_size = av_log2(avctx->block_align) + 4;
252cabdff1aSopenharmony_ci
253cabdff1aSopenharmony_ci    /* frame info */
254cabdff1aSopenharmony_ci    s->skip_frame  = 1; /* skip first frame */
255cabdff1aSopenharmony_ci    s->packet_loss = 1;
256cabdff1aSopenharmony_ci    s->len_prefix  = s->decode_flags & 0x40;
257cabdff1aSopenharmony_ci
258cabdff1aSopenharmony_ci    /* get frame len */
259cabdff1aSopenharmony_ci    s->samples_per_frame = 1 << ff_wma_get_frame_len_bits(avctx->sample_rate,
260cabdff1aSopenharmony_ci                                                          3, s->decode_flags);
261cabdff1aSopenharmony_ci    av_assert0(s->samples_per_frame <= WMALL_BLOCK_MAX_SIZE);
262cabdff1aSopenharmony_ci
263cabdff1aSopenharmony_ci    /* init previous block len */
264cabdff1aSopenharmony_ci    for (i = 0; i < avctx->ch_layout.nb_channels; i++)
265cabdff1aSopenharmony_ci        s->channel[i].prev_block_len = s->samples_per_frame;
266cabdff1aSopenharmony_ci
267cabdff1aSopenharmony_ci    /* subframe info */
268cabdff1aSopenharmony_ci    log2_max_num_subframes  = (s->decode_flags & 0x38) >> 3;
269cabdff1aSopenharmony_ci    s->max_num_subframes    = 1 << log2_max_num_subframes;
270cabdff1aSopenharmony_ci    s->max_subframe_len_bit = 0;
271cabdff1aSopenharmony_ci    s->subframe_len_bits    = av_log2(log2_max_num_subframes) + 1;
272cabdff1aSopenharmony_ci
273cabdff1aSopenharmony_ci    s->min_samples_per_subframe  = s->samples_per_frame / s->max_num_subframes;
274cabdff1aSopenharmony_ci    s->dynamic_range_compression = s->decode_flags & 0x80;
275cabdff1aSopenharmony_ci    s->bV3RTM                    = s->decode_flags & 0x100;
276cabdff1aSopenharmony_ci
277cabdff1aSopenharmony_ci    if (s->max_num_subframes > MAX_SUBFRAMES) {
278cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "invalid number of subframes %"PRIu8"\n",
279cabdff1aSopenharmony_ci               s->max_num_subframes);
280cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
281cabdff1aSopenharmony_ci    }
282cabdff1aSopenharmony_ci
283cabdff1aSopenharmony_ci    s->frame = av_frame_alloc();
284cabdff1aSopenharmony_ci    if (!s->frame)
285cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
286cabdff1aSopenharmony_ci
287cabdff1aSopenharmony_ci    return 0;
288cabdff1aSopenharmony_ci}
289cabdff1aSopenharmony_ci
290cabdff1aSopenharmony_ci/**
291cabdff1aSopenharmony_ci * @brief Decode the subframe length.
292cabdff1aSopenharmony_ci * @param s      context
293cabdff1aSopenharmony_ci * @param offset sample offset in the frame
294cabdff1aSopenharmony_ci * @return decoded subframe length on success, < 0 in case of an error
295cabdff1aSopenharmony_ci */
296cabdff1aSopenharmony_cistatic int decode_subframe_length(WmallDecodeCtx *s, int offset)
297cabdff1aSopenharmony_ci{
298cabdff1aSopenharmony_ci    int frame_len_ratio, subframe_len, len;
299cabdff1aSopenharmony_ci
300cabdff1aSopenharmony_ci    /* no need to read from the bitstream when only one length is possible */
301cabdff1aSopenharmony_ci    if (offset == s->samples_per_frame - s->min_samples_per_subframe)
302cabdff1aSopenharmony_ci        return s->min_samples_per_subframe;
303cabdff1aSopenharmony_ci
304cabdff1aSopenharmony_ci    len             = av_log2(s->max_num_subframes - 1) + 1;
305cabdff1aSopenharmony_ci    frame_len_ratio = get_bits(&s->gb, len);
306cabdff1aSopenharmony_ci    subframe_len    = s->min_samples_per_subframe * (frame_len_ratio + 1);
307cabdff1aSopenharmony_ci
308cabdff1aSopenharmony_ci    /* sanity check the length */
309cabdff1aSopenharmony_ci    if (subframe_len < s->min_samples_per_subframe ||
310cabdff1aSopenharmony_ci        subframe_len > s->samples_per_frame) {
311cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "broken frame: subframe_len %i\n",
312cabdff1aSopenharmony_ci               subframe_len);
313cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
314cabdff1aSopenharmony_ci    }
315cabdff1aSopenharmony_ci    return subframe_len;
316cabdff1aSopenharmony_ci}
317cabdff1aSopenharmony_ci
318cabdff1aSopenharmony_ci/**
319cabdff1aSopenharmony_ci * @brief Decode how the data in the frame is split into subframes.
320cabdff1aSopenharmony_ci *       Every WMA frame contains the encoded data for a fixed number of
321cabdff1aSopenharmony_ci *       samples per channel. The data for every channel might be split
322cabdff1aSopenharmony_ci *       into several subframes. This function will reconstruct the list of
323cabdff1aSopenharmony_ci *       subframes for every channel.
324cabdff1aSopenharmony_ci *
325cabdff1aSopenharmony_ci *       If the subframes are not evenly split, the algorithm estimates the
326cabdff1aSopenharmony_ci *       channels with the lowest number of total samples.
327cabdff1aSopenharmony_ci *       Afterwards, for each of these channels a bit is read from the
328cabdff1aSopenharmony_ci *       bitstream that indicates if the channel contains a subframe with the
329cabdff1aSopenharmony_ci *       next subframe size that is going to be read from the bitstream or not.
330cabdff1aSopenharmony_ci *       If a channel contains such a subframe, the subframe size gets added to
331cabdff1aSopenharmony_ci *       the channel's subframe list.
332cabdff1aSopenharmony_ci *       The algorithm repeats these steps until the frame is properly divided
333cabdff1aSopenharmony_ci *       between the individual channels.
334cabdff1aSopenharmony_ci *
335cabdff1aSopenharmony_ci * @param s context
336cabdff1aSopenharmony_ci * @return 0 on success, < 0 in case of an error
337cabdff1aSopenharmony_ci */
338cabdff1aSopenharmony_cistatic int decode_tilehdr(WmallDecodeCtx *s)
339cabdff1aSopenharmony_ci{
340cabdff1aSopenharmony_ci    uint16_t num_samples[WMALL_MAX_CHANNELS] = { 0 }; /* sum of samples for all currently known subframes of a channel */
341cabdff1aSopenharmony_ci    uint8_t  contains_subframe[WMALL_MAX_CHANNELS];   /* flag indicating if a channel contains the current subframe */
342cabdff1aSopenharmony_ci    int channels_for_cur_subframe = s->num_channels;  /* number of channels that contain the current subframe */
343cabdff1aSopenharmony_ci    int fixed_channel_layout = 0;                     /* flag indicating that all channels use the same subfra2me offsets and sizes */
344cabdff1aSopenharmony_ci    int min_channel_len = 0;                          /* smallest sum of samples (channels with this length will be processed first) */
345cabdff1aSopenharmony_ci    int c, tile_aligned;
346cabdff1aSopenharmony_ci
347cabdff1aSopenharmony_ci    /* reset tiling information */
348cabdff1aSopenharmony_ci    for (c = 0; c < s->num_channels; c++)
349cabdff1aSopenharmony_ci        s->channel[c].num_subframes = 0;
350cabdff1aSopenharmony_ci
351cabdff1aSopenharmony_ci    tile_aligned = get_bits1(&s->gb);
352cabdff1aSopenharmony_ci    if (s->max_num_subframes == 1 || tile_aligned)
353cabdff1aSopenharmony_ci        fixed_channel_layout = 1;
354cabdff1aSopenharmony_ci
355cabdff1aSopenharmony_ci    /* loop until the frame data is split between the subframes */
356cabdff1aSopenharmony_ci    do {
357cabdff1aSopenharmony_ci        int subframe_len, in_use = 0;
358cabdff1aSopenharmony_ci
359cabdff1aSopenharmony_ci        /* check which channels contain the subframe */
360cabdff1aSopenharmony_ci        for (c = 0; c < s->num_channels; c++) {
361cabdff1aSopenharmony_ci            if (num_samples[c] == min_channel_len) {
362cabdff1aSopenharmony_ci                if (fixed_channel_layout || channels_for_cur_subframe == 1 ||
363cabdff1aSopenharmony_ci                   (min_channel_len == s->samples_per_frame - s->min_samples_per_subframe)) {
364cabdff1aSopenharmony_ci                    contains_subframe[c] = 1;
365cabdff1aSopenharmony_ci                } else {
366cabdff1aSopenharmony_ci                    contains_subframe[c] = get_bits1(&s->gb);
367cabdff1aSopenharmony_ci                }
368cabdff1aSopenharmony_ci                in_use |= contains_subframe[c];
369cabdff1aSopenharmony_ci            } else
370cabdff1aSopenharmony_ci                contains_subframe[c] = 0;
371cabdff1aSopenharmony_ci        }
372cabdff1aSopenharmony_ci
373cabdff1aSopenharmony_ci        if (!in_use) {
374cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR,
375cabdff1aSopenharmony_ci                   "Found empty subframe\n");
376cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
377cabdff1aSopenharmony_ci        }
378cabdff1aSopenharmony_ci
379cabdff1aSopenharmony_ci        /* get subframe length, subframe_len == 0 is not allowed */
380cabdff1aSopenharmony_ci        if ((subframe_len = decode_subframe_length(s, min_channel_len)) <= 0)
381cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
382cabdff1aSopenharmony_ci        /* add subframes to the individual channels and find new min_channel_len */
383cabdff1aSopenharmony_ci        min_channel_len += subframe_len;
384cabdff1aSopenharmony_ci        for (c = 0; c < s->num_channels; c++) {
385cabdff1aSopenharmony_ci            WmallChannelCtx *chan = &s->channel[c];
386cabdff1aSopenharmony_ci
387cabdff1aSopenharmony_ci            if (contains_subframe[c]) {
388cabdff1aSopenharmony_ci                if (chan->num_subframes >= MAX_SUBFRAMES) {
389cabdff1aSopenharmony_ci                    av_log(s->avctx, AV_LOG_ERROR,
390cabdff1aSopenharmony_ci                           "broken frame: num subframes > 31\n");
391cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
392cabdff1aSopenharmony_ci                }
393cabdff1aSopenharmony_ci                chan->subframe_len[chan->num_subframes] = subframe_len;
394cabdff1aSopenharmony_ci                num_samples[c] += subframe_len;
395cabdff1aSopenharmony_ci                ++chan->num_subframes;
396cabdff1aSopenharmony_ci                if (num_samples[c] > s->samples_per_frame) {
397cabdff1aSopenharmony_ci                    av_log(s->avctx, AV_LOG_ERROR, "broken frame: "
398cabdff1aSopenharmony_ci                           "channel len(%"PRIu16") > samples_per_frame(%"PRIu16")\n",
399cabdff1aSopenharmony_ci                           num_samples[c], s->samples_per_frame);
400cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
401cabdff1aSopenharmony_ci                }
402cabdff1aSopenharmony_ci            } else if (num_samples[c] <= min_channel_len) {
403cabdff1aSopenharmony_ci                if (num_samples[c] < min_channel_len) {
404cabdff1aSopenharmony_ci                    channels_for_cur_subframe = 0;
405cabdff1aSopenharmony_ci                    min_channel_len = num_samples[c];
406cabdff1aSopenharmony_ci                }
407cabdff1aSopenharmony_ci                ++channels_for_cur_subframe;
408cabdff1aSopenharmony_ci            }
409cabdff1aSopenharmony_ci        }
410cabdff1aSopenharmony_ci    } while (min_channel_len < s->samples_per_frame);
411cabdff1aSopenharmony_ci
412cabdff1aSopenharmony_ci    for (c = 0; c < s->num_channels; c++) {
413cabdff1aSopenharmony_ci        int i, offset = 0;
414cabdff1aSopenharmony_ci        for (i = 0; i < s->channel[c].num_subframes; i++) {
415cabdff1aSopenharmony_ci            s->channel[c].subframe_offsets[i] = offset;
416cabdff1aSopenharmony_ci            offset += s->channel[c].subframe_len[i];
417cabdff1aSopenharmony_ci        }
418cabdff1aSopenharmony_ci    }
419cabdff1aSopenharmony_ci
420cabdff1aSopenharmony_ci    return 0;
421cabdff1aSopenharmony_ci}
422cabdff1aSopenharmony_ci
423cabdff1aSopenharmony_cistatic void decode_ac_filter(WmallDecodeCtx *s)
424cabdff1aSopenharmony_ci{
425cabdff1aSopenharmony_ci    int i;
426cabdff1aSopenharmony_ci    s->acfilter_order   = get_bits(&s->gb, 4) + 1;
427cabdff1aSopenharmony_ci    s->acfilter_scaling = get_bits(&s->gb, 4);
428cabdff1aSopenharmony_ci
429cabdff1aSopenharmony_ci    for (i = 0; i < s->acfilter_order; i++)
430cabdff1aSopenharmony_ci        s->acfilter_coeffs[i] = get_bitsz(&s->gb, s->acfilter_scaling) + 1;
431cabdff1aSopenharmony_ci}
432cabdff1aSopenharmony_ci
433cabdff1aSopenharmony_cistatic void decode_mclms(WmallDecodeCtx *s)
434cabdff1aSopenharmony_ci{
435cabdff1aSopenharmony_ci    s->mclms_order   = (get_bits(&s->gb, 4) + 1) * 2;
436cabdff1aSopenharmony_ci    s->mclms_scaling = get_bits(&s->gb, 4);
437cabdff1aSopenharmony_ci    if (get_bits1(&s->gb)) {
438cabdff1aSopenharmony_ci        int i, send_coef_bits;
439cabdff1aSopenharmony_ci        int cbits = av_log2(s->mclms_scaling + 1);
440cabdff1aSopenharmony_ci        if (1 << cbits < s->mclms_scaling + 1)
441cabdff1aSopenharmony_ci            cbits++;
442cabdff1aSopenharmony_ci
443cabdff1aSopenharmony_ci        send_coef_bits = get_bitsz(&s->gb, cbits) + 2;
444cabdff1aSopenharmony_ci
445cabdff1aSopenharmony_ci        for (i = 0; i < s->mclms_order * s->num_channels * s->num_channels; i++)
446cabdff1aSopenharmony_ci            s->mclms_coeffs[i] = get_bits(&s->gb, send_coef_bits);
447cabdff1aSopenharmony_ci
448cabdff1aSopenharmony_ci        for (i = 0; i < s->num_channels; i++) {
449cabdff1aSopenharmony_ci            int c;
450cabdff1aSopenharmony_ci            for (c = 0; c < i; c++)
451cabdff1aSopenharmony_ci                s->mclms_coeffs_cur[i * s->num_channels + c] = get_bits(&s->gb, send_coef_bits);
452cabdff1aSopenharmony_ci        }
453cabdff1aSopenharmony_ci    }
454cabdff1aSopenharmony_ci}
455cabdff1aSopenharmony_ci
456cabdff1aSopenharmony_cistatic int decode_cdlms(WmallDecodeCtx *s)
457cabdff1aSopenharmony_ci{
458cabdff1aSopenharmony_ci    int c, i;
459cabdff1aSopenharmony_ci    int cdlms_send_coef = get_bits1(&s->gb);
460cabdff1aSopenharmony_ci
461cabdff1aSopenharmony_ci    for (c = 0; c < s->num_channels; c++) {
462cabdff1aSopenharmony_ci        s->cdlms_ttl[c] = get_bits(&s->gb, 3) + 1;
463cabdff1aSopenharmony_ci        for (i = 0; i < s->cdlms_ttl[c]; i++) {
464cabdff1aSopenharmony_ci            s->cdlms[c][i].order = (get_bits(&s->gb, 7) + 1) * 8;
465cabdff1aSopenharmony_ci            if (s->cdlms[c][i].order > MAX_ORDER) {
466cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR,
467cabdff1aSopenharmony_ci                       "Order[%d][%d] %d > max (%d), not supported\n",
468cabdff1aSopenharmony_ci                       c, i, s->cdlms[c][i].order, MAX_ORDER);
469cabdff1aSopenharmony_ci                s->cdlms[0][0].order = 0;
470cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
471cabdff1aSopenharmony_ci            }
472cabdff1aSopenharmony_ci            if(s->cdlms[c][i].order & 8 && s->bits_per_sample == 16) {
473cabdff1aSopenharmony_ci                static int warned;
474cabdff1aSopenharmony_ci                if(!warned)
475cabdff1aSopenharmony_ci                    avpriv_request_sample(s->avctx, "CDLMS of order %d",
476cabdff1aSopenharmony_ci                                          s->cdlms[c][i].order);
477cabdff1aSopenharmony_ci                warned = 1;
478cabdff1aSopenharmony_ci            }
479cabdff1aSopenharmony_ci        }
480cabdff1aSopenharmony_ci
481cabdff1aSopenharmony_ci        for (i = 0; i < s->cdlms_ttl[c]; i++)
482cabdff1aSopenharmony_ci            s->cdlms[c][i].scaling = get_bits(&s->gb, 4);
483cabdff1aSopenharmony_ci
484cabdff1aSopenharmony_ci        if (cdlms_send_coef) {
485cabdff1aSopenharmony_ci            for (i = 0; i < s->cdlms_ttl[c]; i++) {
486cabdff1aSopenharmony_ci                int cbits, shift_l, shift_r, j;
487cabdff1aSopenharmony_ci                cbits = av_log2(s->cdlms[c][i].order);
488cabdff1aSopenharmony_ci                if ((1 << cbits) < s->cdlms[c][i].order)
489cabdff1aSopenharmony_ci                    cbits++;
490cabdff1aSopenharmony_ci                s->cdlms[c][i].coefsend = get_bits(&s->gb, cbits) + 1;
491cabdff1aSopenharmony_ci
492cabdff1aSopenharmony_ci                cbits = av_log2(s->cdlms[c][i].scaling + 1);
493cabdff1aSopenharmony_ci                if ((1 << cbits) < s->cdlms[c][i].scaling + 1)
494cabdff1aSopenharmony_ci                    cbits++;
495cabdff1aSopenharmony_ci
496cabdff1aSopenharmony_ci                s->cdlms[c][i].bitsend = get_bitsz(&s->gb, cbits) + 2;
497cabdff1aSopenharmony_ci                shift_l = 32 - s->cdlms[c][i].bitsend;
498cabdff1aSopenharmony_ci                shift_r = 32 - s->cdlms[c][i].scaling - 2;
499cabdff1aSopenharmony_ci                for (j = 0; j < s->cdlms[c][i].coefsend; j++)
500cabdff1aSopenharmony_ci                    s->cdlms[c][i].coefs[j] =
501cabdff1aSopenharmony_ci                        (get_bits(&s->gb, s->cdlms[c][i].bitsend) << shift_l) >> shift_r;
502cabdff1aSopenharmony_ci            }
503cabdff1aSopenharmony_ci        }
504cabdff1aSopenharmony_ci
505cabdff1aSopenharmony_ci        for (i = 0; i < s->cdlms_ttl[c]; i++)
506cabdff1aSopenharmony_ci            memset(s->cdlms[c][i].coefs + s->cdlms[c][i].order,
507cabdff1aSopenharmony_ci                   0, WMALL_COEFF_PAD_SIZE);
508cabdff1aSopenharmony_ci    }
509cabdff1aSopenharmony_ci
510cabdff1aSopenharmony_ci    return 0;
511cabdff1aSopenharmony_ci}
512cabdff1aSopenharmony_ci
513cabdff1aSopenharmony_cistatic int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size)
514cabdff1aSopenharmony_ci{
515cabdff1aSopenharmony_ci    int i = 0;
516cabdff1aSopenharmony_ci    unsigned int ave_mean;
517cabdff1aSopenharmony_ci    s->transient[ch] = get_bits1(&s->gb);
518cabdff1aSopenharmony_ci    if (s->transient[ch]) {
519cabdff1aSopenharmony_ci        s->transient_pos[ch] = get_bits(&s->gb, av_log2(tile_size));
520cabdff1aSopenharmony_ci        if (s->transient_pos[ch])
521cabdff1aSopenharmony_ci            s->transient[ch] = 0;
522cabdff1aSopenharmony_ci        s->channel[ch].transient_counter =
523cabdff1aSopenharmony_ci            FFMAX(s->channel[ch].transient_counter, s->samples_per_frame / 2);
524cabdff1aSopenharmony_ci    } else if (s->channel[ch].transient_counter)
525cabdff1aSopenharmony_ci        s->transient[ch] = 1;
526cabdff1aSopenharmony_ci
527cabdff1aSopenharmony_ci    if (s->seekable_tile) {
528cabdff1aSopenharmony_ci        ave_mean = get_bits(&s->gb, s->bits_per_sample);
529cabdff1aSopenharmony_ci        s->ave_sum[ch] = ave_mean << (s->movave_scaling + 1);
530cabdff1aSopenharmony_ci    }
531cabdff1aSopenharmony_ci
532cabdff1aSopenharmony_ci    if (s->seekable_tile) {
533cabdff1aSopenharmony_ci        if (s->do_inter_ch_decorr)
534cabdff1aSopenharmony_ci            s->channel_residues[ch][0] = get_sbits_long(&s->gb, s->bits_per_sample + 1);
535cabdff1aSopenharmony_ci        else
536cabdff1aSopenharmony_ci            s->channel_residues[ch][0] = get_sbits_long(&s->gb, s->bits_per_sample);
537cabdff1aSopenharmony_ci        i++;
538cabdff1aSopenharmony_ci    }
539cabdff1aSopenharmony_ci    for (; i < tile_size; i++) {
540cabdff1aSopenharmony_ci        int rem, rem_bits;
541cabdff1aSopenharmony_ci        unsigned quo = 0, residue;
542cabdff1aSopenharmony_ci        while(get_bits1(&s->gb)) {
543cabdff1aSopenharmony_ci            quo++;
544cabdff1aSopenharmony_ci            if (get_bits_left(&s->gb) <= 0)
545cabdff1aSopenharmony_ci                return -1;
546cabdff1aSopenharmony_ci        }
547cabdff1aSopenharmony_ci        if (quo >= 32)
548cabdff1aSopenharmony_ci            quo += get_bits_long(&s->gb, get_bits(&s->gb, 5) + 1);
549cabdff1aSopenharmony_ci
550cabdff1aSopenharmony_ci        ave_mean = (s->ave_sum[ch] + (1 << s->movave_scaling)) >> (s->movave_scaling + 1);
551cabdff1aSopenharmony_ci        if (ave_mean <= 1)
552cabdff1aSopenharmony_ci            residue = quo;
553cabdff1aSopenharmony_ci        else {
554cabdff1aSopenharmony_ci            rem_bits = av_ceil_log2(ave_mean);
555cabdff1aSopenharmony_ci            rem      = get_bits_long(&s->gb, rem_bits);
556cabdff1aSopenharmony_ci            residue  = (quo << rem_bits) + rem;
557cabdff1aSopenharmony_ci        }
558cabdff1aSopenharmony_ci
559cabdff1aSopenharmony_ci        s->ave_sum[ch] = residue + s->ave_sum[ch] -
560cabdff1aSopenharmony_ci                         (s->ave_sum[ch] >> s->movave_scaling);
561cabdff1aSopenharmony_ci
562cabdff1aSopenharmony_ci        residue = (residue >> 1) ^ -(residue & 1);
563cabdff1aSopenharmony_ci        s->channel_residues[ch][i] = residue;
564cabdff1aSopenharmony_ci    }
565cabdff1aSopenharmony_ci
566cabdff1aSopenharmony_ci    return 0;
567cabdff1aSopenharmony_ci
568cabdff1aSopenharmony_ci}
569cabdff1aSopenharmony_ci
570cabdff1aSopenharmony_cistatic void decode_lpc(WmallDecodeCtx *s)
571cabdff1aSopenharmony_ci{
572cabdff1aSopenharmony_ci    int ch, i, cbits;
573cabdff1aSopenharmony_ci    s->lpc_order   = get_bits(&s->gb, 5) + 1;
574cabdff1aSopenharmony_ci    s->lpc_scaling = get_bits(&s->gb, 4);
575cabdff1aSopenharmony_ci    s->lpc_intbits = get_bits(&s->gb, 3) + 1;
576cabdff1aSopenharmony_ci    cbits = s->lpc_scaling + s->lpc_intbits;
577cabdff1aSopenharmony_ci    for (ch = 0; ch < s->num_channels; ch++)
578cabdff1aSopenharmony_ci        for (i = 0; i < s->lpc_order; i++)
579cabdff1aSopenharmony_ci            s->lpc_coefs[ch][i] = get_sbits(&s->gb, cbits);
580cabdff1aSopenharmony_ci}
581cabdff1aSopenharmony_ci
582cabdff1aSopenharmony_cistatic void clear_codec_buffers(WmallDecodeCtx *s)
583cabdff1aSopenharmony_ci{
584cabdff1aSopenharmony_ci    int ich, ilms;
585cabdff1aSopenharmony_ci
586cabdff1aSopenharmony_ci    memset(s->acfilter_coeffs,     0, sizeof(s->acfilter_coeffs));
587cabdff1aSopenharmony_ci    memset(s->acfilter_prevvalues, 0, sizeof(s->acfilter_prevvalues));
588cabdff1aSopenharmony_ci    memset(s->lpc_coefs,           0, sizeof(s->lpc_coefs));
589cabdff1aSopenharmony_ci
590cabdff1aSopenharmony_ci    memset(s->mclms_coeffs,     0, sizeof(s->mclms_coeffs));
591cabdff1aSopenharmony_ci    memset(s->mclms_coeffs_cur, 0, sizeof(s->mclms_coeffs_cur));
592cabdff1aSopenharmony_ci    memset(s->mclms_prevvalues, 0, sizeof(s->mclms_prevvalues));
593cabdff1aSopenharmony_ci    memset(s->mclms_updates,    0, sizeof(s->mclms_updates));
594cabdff1aSopenharmony_ci
595cabdff1aSopenharmony_ci    for (ich = 0; ich < s->num_channels; ich++) {
596cabdff1aSopenharmony_ci        for (ilms = 0; ilms < s->cdlms_ttl[ich]; ilms++) {
597cabdff1aSopenharmony_ci            memset(s->cdlms[ich][ilms].coefs, 0,
598cabdff1aSopenharmony_ci                   sizeof(s->cdlms[ich][ilms].coefs));
599cabdff1aSopenharmony_ci            memset(s->cdlms[ich][ilms].lms_prevvalues, 0,
600cabdff1aSopenharmony_ci                   sizeof(s->cdlms[ich][ilms].lms_prevvalues));
601cabdff1aSopenharmony_ci            memset(s->cdlms[ich][ilms].lms_updates, 0,
602cabdff1aSopenharmony_ci                   sizeof(s->cdlms[ich][ilms].lms_updates));
603cabdff1aSopenharmony_ci        }
604cabdff1aSopenharmony_ci        s->ave_sum[ich] = 0;
605cabdff1aSopenharmony_ci    }
606cabdff1aSopenharmony_ci}
607cabdff1aSopenharmony_ci
608cabdff1aSopenharmony_ci/**
609cabdff1aSopenharmony_ci * @brief Reset filter parameters and transient area at new seekable tile.
610cabdff1aSopenharmony_ci */
611cabdff1aSopenharmony_cistatic void reset_codec(WmallDecodeCtx *s)
612cabdff1aSopenharmony_ci{
613cabdff1aSopenharmony_ci    int ich, ilms;
614cabdff1aSopenharmony_ci    s->mclms_recent = s->mclms_order * s->num_channels;
615cabdff1aSopenharmony_ci    for (ich = 0; ich < s->num_channels; ich++) {
616cabdff1aSopenharmony_ci        for (ilms = 0; ilms < s->cdlms_ttl[ich]; ilms++)
617cabdff1aSopenharmony_ci            s->cdlms[ich][ilms].recent = s->cdlms[ich][ilms].order;
618cabdff1aSopenharmony_ci        /* first sample of a seekable subframe is considered as the starting of
619cabdff1aSopenharmony_ci            a transient area which is samples_per_frame samples long */
620cabdff1aSopenharmony_ci        s->channel[ich].transient_counter = s->samples_per_frame;
621cabdff1aSopenharmony_ci        s->transient[ich]     = 1;
622cabdff1aSopenharmony_ci        s->transient_pos[ich] = 0;
623cabdff1aSopenharmony_ci    }
624cabdff1aSopenharmony_ci}
625cabdff1aSopenharmony_ci
626cabdff1aSopenharmony_cistatic void mclms_update(WmallDecodeCtx *s, int icoef, int *pred)
627cabdff1aSopenharmony_ci{
628cabdff1aSopenharmony_ci    int i, j, ich, pred_error;
629cabdff1aSopenharmony_ci    int order        = s->mclms_order;
630cabdff1aSopenharmony_ci    int num_channels = s->num_channels;
631cabdff1aSopenharmony_ci    int range        = 1 << (s->bits_per_sample - 1);
632cabdff1aSopenharmony_ci
633cabdff1aSopenharmony_ci    for (ich = 0; ich < num_channels; ich++) {
634cabdff1aSopenharmony_ci        pred_error = s->channel_residues[ich][icoef] - (unsigned)pred[ich];
635cabdff1aSopenharmony_ci        if (pred_error > 0) {
636cabdff1aSopenharmony_ci            for (i = 0; i < order * num_channels; i++)
637cabdff1aSopenharmony_ci                s->mclms_coeffs[i + ich * order * num_channels] +=
638cabdff1aSopenharmony_ci                    s->mclms_updates[s->mclms_recent + i];
639cabdff1aSopenharmony_ci            for (j = 0; j < ich; j++)
640cabdff1aSopenharmony_ci                s->mclms_coeffs_cur[ich * num_channels + j] += WMASIGN(s->channel_residues[j][icoef]);
641cabdff1aSopenharmony_ci        } else if (pred_error < 0) {
642cabdff1aSopenharmony_ci            for (i = 0; i < order * num_channels; i++)
643cabdff1aSopenharmony_ci                s->mclms_coeffs[i + ich * order * num_channels] -=
644cabdff1aSopenharmony_ci                    s->mclms_updates[s->mclms_recent + i];
645cabdff1aSopenharmony_ci            for (j = 0; j < ich; j++)
646cabdff1aSopenharmony_ci                s->mclms_coeffs_cur[ich * num_channels + j] -= WMASIGN(s->channel_residues[j][icoef]);
647cabdff1aSopenharmony_ci        }
648cabdff1aSopenharmony_ci    }
649cabdff1aSopenharmony_ci
650cabdff1aSopenharmony_ci    for (ich = num_channels - 1; ich >= 0; ich--) {
651cabdff1aSopenharmony_ci        s->mclms_recent--;
652cabdff1aSopenharmony_ci        s->mclms_prevvalues[s->mclms_recent] = av_clip(s->channel_residues[ich][icoef],
653cabdff1aSopenharmony_ci            -range, range - 1);
654cabdff1aSopenharmony_ci        s->mclms_updates[s->mclms_recent] = WMASIGN(s->channel_residues[ich][icoef]);
655cabdff1aSopenharmony_ci    }
656cabdff1aSopenharmony_ci
657cabdff1aSopenharmony_ci    if (s->mclms_recent == 0) {
658cabdff1aSopenharmony_ci        memcpy(&s->mclms_prevvalues[order * num_channels],
659cabdff1aSopenharmony_ci               s->mclms_prevvalues,
660cabdff1aSopenharmony_ci               sizeof(int32_t) * order * num_channels);
661cabdff1aSopenharmony_ci        memcpy(&s->mclms_updates[order * num_channels],
662cabdff1aSopenharmony_ci               s->mclms_updates,
663cabdff1aSopenharmony_ci               sizeof(int32_t) * order * num_channels);
664cabdff1aSopenharmony_ci        s->mclms_recent = num_channels * order;
665cabdff1aSopenharmony_ci    }
666cabdff1aSopenharmony_ci}
667cabdff1aSopenharmony_ci
668cabdff1aSopenharmony_cistatic void mclms_predict(WmallDecodeCtx *s, int icoef, int *pred)
669cabdff1aSopenharmony_ci{
670cabdff1aSopenharmony_ci    int ich, i;
671cabdff1aSopenharmony_ci    int order        = s->mclms_order;
672cabdff1aSopenharmony_ci    int num_channels = s->num_channels;
673cabdff1aSopenharmony_ci
674cabdff1aSopenharmony_ci    for (ich = 0; ich < num_channels; ich++) {
675cabdff1aSopenharmony_ci        pred[ich] = 0;
676cabdff1aSopenharmony_ci        if (!s->is_channel_coded[ich])
677cabdff1aSopenharmony_ci            continue;
678cabdff1aSopenharmony_ci        for (i = 0; i < order * num_channels; i++)
679cabdff1aSopenharmony_ci            pred[ich] += (uint32_t)s->mclms_prevvalues[i + s->mclms_recent] *
680cabdff1aSopenharmony_ci                         s->mclms_coeffs[i + order * num_channels * ich];
681cabdff1aSopenharmony_ci        for (i = 0; i < ich; i++)
682cabdff1aSopenharmony_ci            pred[ich] += (uint32_t)s->channel_residues[i][icoef] *
683cabdff1aSopenharmony_ci                         s->mclms_coeffs_cur[i + num_channels * ich];
684cabdff1aSopenharmony_ci        pred[ich] += (1U << s->mclms_scaling) >> 1;
685cabdff1aSopenharmony_ci        pred[ich] >>= s->mclms_scaling;
686cabdff1aSopenharmony_ci        s->channel_residues[ich][icoef] += (unsigned)pred[ich];
687cabdff1aSopenharmony_ci    }
688cabdff1aSopenharmony_ci}
689cabdff1aSopenharmony_ci
690cabdff1aSopenharmony_cistatic void revert_mclms(WmallDecodeCtx *s, int tile_size)
691cabdff1aSopenharmony_ci{
692cabdff1aSopenharmony_ci    int icoef, pred[WMALL_MAX_CHANNELS] = { 0 };
693cabdff1aSopenharmony_ci    for (icoef = 0; icoef < tile_size; icoef++) {
694cabdff1aSopenharmony_ci        mclms_predict(s, icoef, pred);
695cabdff1aSopenharmony_ci        mclms_update(s, icoef, pred);
696cabdff1aSopenharmony_ci    }
697cabdff1aSopenharmony_ci}
698cabdff1aSopenharmony_ci
699cabdff1aSopenharmony_cistatic void use_high_update_speed(WmallDecodeCtx *s, int ich)
700cabdff1aSopenharmony_ci{
701cabdff1aSopenharmony_ci    int ilms, recent, icoef;
702cabdff1aSopenharmony_ci    for (ilms = s->cdlms_ttl[ich] - 1; ilms >= 0; ilms--) {
703cabdff1aSopenharmony_ci        recent = s->cdlms[ich][ilms].recent;
704cabdff1aSopenharmony_ci        if (s->update_speed[ich] == 16)
705cabdff1aSopenharmony_ci            continue;
706cabdff1aSopenharmony_ci        if (s->bV3RTM) {
707cabdff1aSopenharmony_ci            for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
708cabdff1aSopenharmony_ci                s->cdlms[ich][ilms].lms_updates[icoef + recent] *= 2;
709cabdff1aSopenharmony_ci        } else {
710cabdff1aSopenharmony_ci            for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
711cabdff1aSopenharmony_ci                s->cdlms[ich][ilms].lms_updates[icoef] *= 2;
712cabdff1aSopenharmony_ci        }
713cabdff1aSopenharmony_ci    }
714cabdff1aSopenharmony_ci    s->update_speed[ich] = 16;
715cabdff1aSopenharmony_ci}
716cabdff1aSopenharmony_ci
717cabdff1aSopenharmony_cistatic void use_normal_update_speed(WmallDecodeCtx *s, int ich)
718cabdff1aSopenharmony_ci{
719cabdff1aSopenharmony_ci    int ilms, recent, icoef;
720cabdff1aSopenharmony_ci    for (ilms = s->cdlms_ttl[ich] - 1; ilms >= 0; ilms--) {
721cabdff1aSopenharmony_ci        recent = s->cdlms[ich][ilms].recent;
722cabdff1aSopenharmony_ci        if (s->update_speed[ich] == 8)
723cabdff1aSopenharmony_ci            continue;
724cabdff1aSopenharmony_ci        if (s->bV3RTM)
725cabdff1aSopenharmony_ci            for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
726cabdff1aSopenharmony_ci                s->cdlms[ich][ilms].lms_updates[icoef + recent] /= 2;
727cabdff1aSopenharmony_ci        else
728cabdff1aSopenharmony_ci            for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
729cabdff1aSopenharmony_ci                s->cdlms[ich][ilms].lms_updates[icoef] /= 2;
730cabdff1aSopenharmony_ci    }
731cabdff1aSopenharmony_ci    s->update_speed[ich] = 8;
732cabdff1aSopenharmony_ci}
733cabdff1aSopenharmony_ci
734cabdff1aSopenharmony_ci#define CD_LMS(bits, ROUND) \
735cabdff1aSopenharmony_cistatic void lms_update ## bits (WmallDecodeCtx *s, int ich, int ilms, int input) \
736cabdff1aSopenharmony_ci{ \
737cabdff1aSopenharmony_ci    int recent = s->cdlms[ich][ilms].recent; \
738cabdff1aSopenharmony_ci    int range  = 1 << s->bits_per_sample - 1; \
739cabdff1aSopenharmony_ci    int order  = s->cdlms[ich][ilms].order; \
740cabdff1aSopenharmony_ci    int ##bits##_t *prev = (int##bits##_t *)s->cdlms[ich][ilms].lms_prevvalues; \
741cabdff1aSopenharmony_ci \
742cabdff1aSopenharmony_ci    if (recent) \
743cabdff1aSopenharmony_ci        recent--; \
744cabdff1aSopenharmony_ci    else { \
745cabdff1aSopenharmony_ci        memcpy(prev + order, prev, (bits/8) * order); \
746cabdff1aSopenharmony_ci        memcpy(s->cdlms[ich][ilms].lms_updates + order, \
747cabdff1aSopenharmony_ci               s->cdlms[ich][ilms].lms_updates, \
748cabdff1aSopenharmony_ci               sizeof(*s->cdlms[ich][ilms].lms_updates) * order); \
749cabdff1aSopenharmony_ci        recent = order - 1; \
750cabdff1aSopenharmony_ci    } \
751cabdff1aSopenharmony_ci \
752cabdff1aSopenharmony_ci    prev[recent] = av_clip(input, -range, range - 1); \
753cabdff1aSopenharmony_ci    s->cdlms[ich][ilms].lms_updates[recent] = WMASIGN(input) * s->update_speed[ich]; \
754cabdff1aSopenharmony_ci \
755cabdff1aSopenharmony_ci    s->cdlms[ich][ilms].lms_updates[recent + (order >> 4)] >>= 2; \
756cabdff1aSopenharmony_ci    s->cdlms[ich][ilms].lms_updates[recent + (order >> 3)] >>= 1; \
757cabdff1aSopenharmony_ci    s->cdlms[ich][ilms].recent = recent; \
758cabdff1aSopenharmony_ci    memset(s->cdlms[ich][ilms].lms_updates + recent + order, 0, \
759cabdff1aSopenharmony_ci           sizeof(s->cdlms[ich][ilms].lms_updates) - \
760cabdff1aSopenharmony_ci           sizeof(*s->cdlms[ich][ilms].lms_updates)*(recent+order)); \
761cabdff1aSopenharmony_ci} \
762cabdff1aSopenharmony_ci \
763cabdff1aSopenharmony_cistatic void revert_cdlms ## bits (WmallDecodeCtx *s, int ch, \
764cabdff1aSopenharmony_ci                                  int coef_begin, int coef_end) \
765cabdff1aSopenharmony_ci{ \
766cabdff1aSopenharmony_ci    int icoef, ilms, num_lms, residue, input; \
767cabdff1aSopenharmony_ci    unsigned pred;\
768cabdff1aSopenharmony_ci \
769cabdff1aSopenharmony_ci    num_lms = s->cdlms_ttl[ch]; \
770cabdff1aSopenharmony_ci    for (ilms = num_lms - 1; ilms >= 0; ilms--) { \
771cabdff1aSopenharmony_ci        for (icoef = coef_begin; icoef < coef_end; icoef++) { \
772cabdff1aSopenharmony_ci            int##bits##_t *prevvalues = (int##bits##_t *)s->cdlms[ch][ilms].lms_prevvalues; \
773cabdff1aSopenharmony_ci            pred = (1 << s->cdlms[ch][ilms].scaling) >> 1; \
774cabdff1aSopenharmony_ci            residue = s->channel_residues[ch][icoef]; \
775cabdff1aSopenharmony_ci            pred += s->dsp.scalarproduct_and_madd_int## bits (s->cdlms[ch][ilms].coefs, \
776cabdff1aSopenharmony_ci                                                        prevvalues + s->cdlms[ch][ilms].recent, \
777cabdff1aSopenharmony_ci                                                        s->cdlms[ch][ilms].lms_updates + \
778cabdff1aSopenharmony_ci                                                        s->cdlms[ch][ilms].recent, \
779cabdff1aSopenharmony_ci                                                        FFALIGN(s->cdlms[ch][ilms].order, ROUND), \
780cabdff1aSopenharmony_ci                                                        WMASIGN(residue)); \
781cabdff1aSopenharmony_ci            input = residue + (unsigned)((int)pred >> s->cdlms[ch][ilms].scaling); \
782cabdff1aSopenharmony_ci            lms_update ## bits(s, ch, ilms, input); \
783cabdff1aSopenharmony_ci            s->channel_residues[ch][icoef] = input; \
784cabdff1aSopenharmony_ci        } \
785cabdff1aSopenharmony_ci    } \
786cabdff1aSopenharmony_ci    if (bits <= 16) emms_c(); \
787cabdff1aSopenharmony_ci}
788cabdff1aSopenharmony_ci
789cabdff1aSopenharmony_ciCD_LMS(16, WMALL_COEFF_PAD_SIZE)
790cabdff1aSopenharmony_ciCD_LMS(32, 8)
791cabdff1aSopenharmony_ci
792cabdff1aSopenharmony_cistatic void revert_inter_ch_decorr(WmallDecodeCtx *s, int tile_size)
793cabdff1aSopenharmony_ci{
794cabdff1aSopenharmony_ci    if (s->num_channels != 2)
795cabdff1aSopenharmony_ci        return;
796cabdff1aSopenharmony_ci    else if (s->is_channel_coded[0] || s->is_channel_coded[1]) {
797cabdff1aSopenharmony_ci        int icoef;
798cabdff1aSopenharmony_ci        for (icoef = 0; icoef < tile_size; icoef++) {
799cabdff1aSopenharmony_ci            s->channel_residues[0][icoef] -= (unsigned)(s->channel_residues[1][icoef] >> 1);
800cabdff1aSopenharmony_ci            s->channel_residues[1][icoef] += (unsigned) s->channel_residues[0][icoef];
801cabdff1aSopenharmony_ci        }
802cabdff1aSopenharmony_ci    }
803cabdff1aSopenharmony_ci}
804cabdff1aSopenharmony_ci
805cabdff1aSopenharmony_cistatic void revert_acfilter(WmallDecodeCtx *s, int tile_size)
806cabdff1aSopenharmony_ci{
807cabdff1aSopenharmony_ci    int ich, pred, i, j;
808cabdff1aSopenharmony_ci    int16_t *filter_coeffs = s->acfilter_coeffs;
809cabdff1aSopenharmony_ci    int scaling            = s->acfilter_scaling;
810cabdff1aSopenharmony_ci    int order              = s->acfilter_order;
811cabdff1aSopenharmony_ci
812cabdff1aSopenharmony_ci    for (ich = 0; ich < s->num_channels; ich++) {
813cabdff1aSopenharmony_ci        int *prevvalues = s->acfilter_prevvalues[ich];
814cabdff1aSopenharmony_ci        for (i = 0; i < order; i++) {
815cabdff1aSopenharmony_ci            pred = 0;
816cabdff1aSopenharmony_ci            for (j = 0; j < order; j++) {
817cabdff1aSopenharmony_ci                if (i <= j)
818cabdff1aSopenharmony_ci                    pred += (uint32_t)filter_coeffs[j] * prevvalues[j - i];
819cabdff1aSopenharmony_ci                else
820cabdff1aSopenharmony_ci                    pred += (uint32_t)s->channel_residues[ich][i - j - 1] * filter_coeffs[j];
821cabdff1aSopenharmony_ci            }
822cabdff1aSopenharmony_ci            pred >>= scaling;
823cabdff1aSopenharmony_ci            s->channel_residues[ich][i] += (unsigned)pred;
824cabdff1aSopenharmony_ci        }
825cabdff1aSopenharmony_ci        for (i = order; i < tile_size; i++) {
826cabdff1aSopenharmony_ci            pred = 0;
827cabdff1aSopenharmony_ci            for (j = 0; j < order; j++)
828cabdff1aSopenharmony_ci                pred += (uint32_t)s->channel_residues[ich][i - j - 1] * filter_coeffs[j];
829cabdff1aSopenharmony_ci            pred >>= scaling;
830cabdff1aSopenharmony_ci            s->channel_residues[ich][i] += (unsigned)pred;
831cabdff1aSopenharmony_ci        }
832cabdff1aSopenharmony_ci        for (j = order - 1; j >= 0; j--)
833cabdff1aSopenharmony_ci            if (tile_size <= j) {
834cabdff1aSopenharmony_ci                prevvalues[j] = prevvalues[j - tile_size];
835cabdff1aSopenharmony_ci            }else
836cabdff1aSopenharmony_ci                prevvalues[j] = s->channel_residues[ich][tile_size - j - 1];
837cabdff1aSopenharmony_ci    }
838cabdff1aSopenharmony_ci}
839cabdff1aSopenharmony_ci
840cabdff1aSopenharmony_cistatic int decode_subframe(WmallDecodeCtx *s)
841cabdff1aSopenharmony_ci{
842cabdff1aSopenharmony_ci    int offset        = s->samples_per_frame;
843cabdff1aSopenharmony_ci    int subframe_len  = s->samples_per_frame;
844cabdff1aSopenharmony_ci    int total_samples = s->samples_per_frame * s->num_channels;
845cabdff1aSopenharmony_ci    int i, j, rawpcm_tile, padding_zeroes, res;
846cabdff1aSopenharmony_ci
847cabdff1aSopenharmony_ci    s->subframe_offset = get_bits_count(&s->gb);
848cabdff1aSopenharmony_ci
849cabdff1aSopenharmony_ci    /* reset channel context and find the next block offset and size
850cabdff1aSopenharmony_ci        == the next block of the channel with the smallest number of
851cabdff1aSopenharmony_ci        decoded samples */
852cabdff1aSopenharmony_ci    for (i = 0; i < s->num_channels; i++) {
853cabdff1aSopenharmony_ci        if (offset > s->channel[i].decoded_samples) {
854cabdff1aSopenharmony_ci            offset = s->channel[i].decoded_samples;
855cabdff1aSopenharmony_ci            subframe_len =
856cabdff1aSopenharmony_ci                s->channel[i].subframe_len[s->channel[i].cur_subframe];
857cabdff1aSopenharmony_ci        }
858cabdff1aSopenharmony_ci    }
859cabdff1aSopenharmony_ci
860cabdff1aSopenharmony_ci    /* get a list of all channels that contain the estimated block */
861cabdff1aSopenharmony_ci    s->channels_for_cur_subframe = 0;
862cabdff1aSopenharmony_ci    for (i = 0; i < s->num_channels; i++) {
863cabdff1aSopenharmony_ci        const int cur_subframe = s->channel[i].cur_subframe;
864cabdff1aSopenharmony_ci        /* subtract already processed samples */
865cabdff1aSopenharmony_ci        total_samples -= s->channel[i].decoded_samples;
866cabdff1aSopenharmony_ci
867cabdff1aSopenharmony_ci        /* and count if there are multiple subframes that match our profile */
868cabdff1aSopenharmony_ci        if (offset == s->channel[i].decoded_samples &&
869cabdff1aSopenharmony_ci            subframe_len == s->channel[i].subframe_len[cur_subframe]) {
870cabdff1aSopenharmony_ci            total_samples -= s->channel[i].subframe_len[cur_subframe];
871cabdff1aSopenharmony_ci            s->channel[i].decoded_samples +=
872cabdff1aSopenharmony_ci                s->channel[i].subframe_len[cur_subframe];
873cabdff1aSopenharmony_ci            s->channel_indexes_for_cur_subframe[s->channels_for_cur_subframe] = i;
874cabdff1aSopenharmony_ci            ++s->channels_for_cur_subframe;
875cabdff1aSopenharmony_ci        }
876cabdff1aSopenharmony_ci    }
877cabdff1aSopenharmony_ci
878cabdff1aSopenharmony_ci    /* check if the frame will be complete after processing the
879cabdff1aSopenharmony_ci        estimated block */
880cabdff1aSopenharmony_ci    if (!total_samples)
881cabdff1aSopenharmony_ci        s->parsed_all_subframes = 1;
882cabdff1aSopenharmony_ci
883cabdff1aSopenharmony_ci
884cabdff1aSopenharmony_ci    s->seekable_tile = get_bits1(&s->gb);
885cabdff1aSopenharmony_ci    if (s->seekable_tile) {
886cabdff1aSopenharmony_ci        clear_codec_buffers(s);
887cabdff1aSopenharmony_ci
888cabdff1aSopenharmony_ci        s->do_arith_coding    = get_bits1(&s->gb);
889cabdff1aSopenharmony_ci        if (s->do_arith_coding) {
890cabdff1aSopenharmony_ci            avpriv_request_sample(s->avctx, "Arithmetic coding");
891cabdff1aSopenharmony_ci            return AVERROR_PATCHWELCOME;
892cabdff1aSopenharmony_ci        }
893cabdff1aSopenharmony_ci        s->do_ac_filter       = get_bits1(&s->gb);
894cabdff1aSopenharmony_ci        s->do_inter_ch_decorr = get_bits1(&s->gb);
895cabdff1aSopenharmony_ci        s->do_mclms           = get_bits1(&s->gb);
896cabdff1aSopenharmony_ci
897cabdff1aSopenharmony_ci        if (s->do_ac_filter)
898cabdff1aSopenharmony_ci            decode_ac_filter(s);
899cabdff1aSopenharmony_ci
900cabdff1aSopenharmony_ci        if (s->do_mclms)
901cabdff1aSopenharmony_ci            decode_mclms(s);
902cabdff1aSopenharmony_ci
903cabdff1aSopenharmony_ci        if ((res = decode_cdlms(s)) < 0)
904cabdff1aSopenharmony_ci            return res;
905cabdff1aSopenharmony_ci        s->movave_scaling = get_bits(&s->gb, 3);
906cabdff1aSopenharmony_ci        s->quant_stepsize = get_bits(&s->gb, 8) + 1;
907cabdff1aSopenharmony_ci
908cabdff1aSopenharmony_ci        reset_codec(s);
909cabdff1aSopenharmony_ci    }
910cabdff1aSopenharmony_ci
911cabdff1aSopenharmony_ci    rawpcm_tile = get_bits1(&s->gb);
912cabdff1aSopenharmony_ci
913cabdff1aSopenharmony_ci    if (!rawpcm_tile && !s->cdlms[0][0].order) {
914cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_DEBUG,
915cabdff1aSopenharmony_ci               "Waiting for seekable tile\n");
916cabdff1aSopenharmony_ci        av_frame_unref(s->frame);
917cabdff1aSopenharmony_ci        return -1;
918cabdff1aSopenharmony_ci    }
919cabdff1aSopenharmony_ci
920cabdff1aSopenharmony_ci
921cabdff1aSopenharmony_ci    for (i = 0; i < s->num_channels; i++)
922cabdff1aSopenharmony_ci        s->is_channel_coded[i] = 1;
923cabdff1aSopenharmony_ci
924cabdff1aSopenharmony_ci    if (!rawpcm_tile) {
925cabdff1aSopenharmony_ci        for (i = 0; i < s->num_channels; i++)
926cabdff1aSopenharmony_ci            s->is_channel_coded[i] = get_bits1(&s->gb);
927cabdff1aSopenharmony_ci
928cabdff1aSopenharmony_ci        if (s->bV3RTM) {
929cabdff1aSopenharmony_ci            // LPC
930cabdff1aSopenharmony_ci            s->do_lpc = get_bits1(&s->gb);
931cabdff1aSopenharmony_ci            if (s->do_lpc) {
932cabdff1aSopenharmony_ci                decode_lpc(s);
933cabdff1aSopenharmony_ci                avpriv_request_sample(s->avctx, "Expect wrong output since "
934cabdff1aSopenharmony_ci                                      "inverse LPC filter");
935cabdff1aSopenharmony_ci            }
936cabdff1aSopenharmony_ci        } else
937cabdff1aSopenharmony_ci            s->do_lpc = 0;
938cabdff1aSopenharmony_ci    }
939cabdff1aSopenharmony_ci
940cabdff1aSopenharmony_ci    if (get_bits_left(&s->gb) < 1)
941cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
942cabdff1aSopenharmony_ci
943cabdff1aSopenharmony_ci    if (get_bits1(&s->gb))
944cabdff1aSopenharmony_ci        padding_zeroes = get_bits(&s->gb, 5);
945cabdff1aSopenharmony_ci    else
946cabdff1aSopenharmony_ci        padding_zeroes = 0;
947cabdff1aSopenharmony_ci
948cabdff1aSopenharmony_ci    if (rawpcm_tile) {
949cabdff1aSopenharmony_ci        int bits = s->bits_per_sample - padding_zeroes;
950cabdff1aSopenharmony_ci        if (bits <= 0) {
951cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR,
952cabdff1aSopenharmony_ci                   "Invalid number of padding bits in raw PCM tile\n");
953cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
954cabdff1aSopenharmony_ci        }
955cabdff1aSopenharmony_ci        ff_dlog(s->avctx, "RAWPCM %d bits per sample. "
956cabdff1aSopenharmony_ci                "total %d bits, remain=%d\n", bits,
957cabdff1aSopenharmony_ci                bits * s->num_channels * subframe_len, get_bits_count(&s->gb));
958cabdff1aSopenharmony_ci        for (i = 0; i < s->num_channels; i++)
959cabdff1aSopenharmony_ci            for (j = 0; j < subframe_len; j++)
960cabdff1aSopenharmony_ci                s->channel_residues[i][j] = get_sbits_long(&s->gb, bits);
961cabdff1aSopenharmony_ci    } else {
962cabdff1aSopenharmony_ci        if (s->bits_per_sample < padding_zeroes)
963cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
964cabdff1aSopenharmony_ci        for (i = 0; i < s->num_channels; i++) {
965cabdff1aSopenharmony_ci            if (s->is_channel_coded[i]) {
966cabdff1aSopenharmony_ci                decode_channel_residues(s, i, subframe_len);
967cabdff1aSopenharmony_ci                if (s->seekable_tile)
968cabdff1aSopenharmony_ci                    use_high_update_speed(s, i);
969cabdff1aSopenharmony_ci                else
970cabdff1aSopenharmony_ci                    use_normal_update_speed(s, i);
971cabdff1aSopenharmony_ci                if (s->bits_per_sample > 16)
972cabdff1aSopenharmony_ci                    revert_cdlms32(s, i, 0, subframe_len);
973cabdff1aSopenharmony_ci                else
974cabdff1aSopenharmony_ci                    revert_cdlms16(s, i, 0, subframe_len);
975cabdff1aSopenharmony_ci            } else {
976cabdff1aSopenharmony_ci                memset(s->channel_residues[i], 0, sizeof(**s->channel_residues) * subframe_len);
977cabdff1aSopenharmony_ci            }
978cabdff1aSopenharmony_ci        }
979cabdff1aSopenharmony_ci
980cabdff1aSopenharmony_ci        if (s->do_mclms)
981cabdff1aSopenharmony_ci            revert_mclms(s, subframe_len);
982cabdff1aSopenharmony_ci        if (s->do_inter_ch_decorr)
983cabdff1aSopenharmony_ci            revert_inter_ch_decorr(s, subframe_len);
984cabdff1aSopenharmony_ci        if (s->do_ac_filter)
985cabdff1aSopenharmony_ci            revert_acfilter(s, subframe_len);
986cabdff1aSopenharmony_ci
987cabdff1aSopenharmony_ci        /* Dequantize */
988cabdff1aSopenharmony_ci        if (s->quant_stepsize != 1)
989cabdff1aSopenharmony_ci            for (i = 0; i < s->num_channels; i++)
990cabdff1aSopenharmony_ci                for (j = 0; j < subframe_len; j++)
991cabdff1aSopenharmony_ci                    s->channel_residues[i][j] *= (unsigned)s->quant_stepsize;
992cabdff1aSopenharmony_ci    }
993cabdff1aSopenharmony_ci
994cabdff1aSopenharmony_ci    /* Write to proper output buffer depending on bit-depth */
995cabdff1aSopenharmony_ci    for (i = 0; i < s->channels_for_cur_subframe; i++) {
996cabdff1aSopenharmony_ci        int c = s->channel_indexes_for_cur_subframe[i];
997cabdff1aSopenharmony_ci        int subframe_len = s->channel[c].subframe_len[s->channel[c].cur_subframe];
998cabdff1aSopenharmony_ci
999cabdff1aSopenharmony_ci        for (j = 0; j < subframe_len; j++) {
1000cabdff1aSopenharmony_ci            if (s->bits_per_sample == 16) {
1001cabdff1aSopenharmony_ci                *s->samples_16[c]++ = (int16_t) s->channel_residues[c][j] * (1 << padding_zeroes);
1002cabdff1aSopenharmony_ci            } else {
1003cabdff1aSopenharmony_ci                *s->samples_32[c]++ = s->channel_residues[c][j] * (256U << padding_zeroes);
1004cabdff1aSopenharmony_ci            }
1005cabdff1aSopenharmony_ci        }
1006cabdff1aSopenharmony_ci    }
1007cabdff1aSopenharmony_ci
1008cabdff1aSopenharmony_ci    /* handled one subframe */
1009cabdff1aSopenharmony_ci    for (i = 0; i < s->channels_for_cur_subframe; i++) {
1010cabdff1aSopenharmony_ci        int c = s->channel_indexes_for_cur_subframe[i];
1011cabdff1aSopenharmony_ci        if (s->channel[c].cur_subframe >= s->channel[c].num_subframes) {
1012cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "broken subframe\n");
1013cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1014cabdff1aSopenharmony_ci        }
1015cabdff1aSopenharmony_ci        ++s->channel[c].cur_subframe;
1016cabdff1aSopenharmony_ci    }
1017cabdff1aSopenharmony_ci    return 0;
1018cabdff1aSopenharmony_ci}
1019cabdff1aSopenharmony_ci
1020cabdff1aSopenharmony_ci/**
1021cabdff1aSopenharmony_ci * @brief Decode one WMA frame.
1022cabdff1aSopenharmony_ci * @param s codec context
1023cabdff1aSopenharmony_ci * @return 0 if the trailer bit indicates that this is the last frame,
1024cabdff1aSopenharmony_ci *         1 if there are additional frames
1025cabdff1aSopenharmony_ci */
1026cabdff1aSopenharmony_cistatic int decode_frame(WmallDecodeCtx *s)
1027cabdff1aSopenharmony_ci{
1028cabdff1aSopenharmony_ci    GetBitContext* gb = &s->gb;
1029cabdff1aSopenharmony_ci    int more_frames = 0, len = 0, i, ret;
1030cabdff1aSopenharmony_ci
1031cabdff1aSopenharmony_ci    s->frame->nb_samples = s->samples_per_frame;
1032cabdff1aSopenharmony_ci    if ((ret = ff_get_buffer(s->avctx, s->frame, 0)) < 0) {
1033cabdff1aSopenharmony_ci        /* return an error if no frame could be decoded at all */
1034cabdff1aSopenharmony_ci        s->packet_loss = 1;
1035cabdff1aSopenharmony_ci        s->frame->nb_samples = 0;
1036cabdff1aSopenharmony_ci        return ret;
1037cabdff1aSopenharmony_ci    }
1038cabdff1aSopenharmony_ci    for (i = 0; i < s->num_channels; i++) {
1039cabdff1aSopenharmony_ci        s->samples_16[i] = (int16_t *)s->frame->extended_data[i];
1040cabdff1aSopenharmony_ci        s->samples_32[i] = (int32_t *)s->frame->extended_data[i];
1041cabdff1aSopenharmony_ci    }
1042cabdff1aSopenharmony_ci
1043cabdff1aSopenharmony_ci    /* get frame length */
1044cabdff1aSopenharmony_ci    if (s->len_prefix)
1045cabdff1aSopenharmony_ci        len = get_bits(gb, s->log2_frame_size);
1046cabdff1aSopenharmony_ci
1047cabdff1aSopenharmony_ci    /* decode tile information */
1048cabdff1aSopenharmony_ci    if ((ret = decode_tilehdr(s))) {
1049cabdff1aSopenharmony_ci        s->packet_loss = 1;
1050cabdff1aSopenharmony_ci        av_frame_unref(s->frame);
1051cabdff1aSopenharmony_ci        return ret;
1052cabdff1aSopenharmony_ci    }
1053cabdff1aSopenharmony_ci
1054cabdff1aSopenharmony_ci    /* read drc info */
1055cabdff1aSopenharmony_ci    if (s->dynamic_range_compression)
1056cabdff1aSopenharmony_ci        s->drc_gain = get_bits(gb, 8);
1057cabdff1aSopenharmony_ci
1058cabdff1aSopenharmony_ci    /* no idea what these are for, might be the number of samples
1059cabdff1aSopenharmony_ci       that need to be skipped at the beginning or end of a stream */
1060cabdff1aSopenharmony_ci    if (get_bits1(gb)) {
1061cabdff1aSopenharmony_ci        int av_unused skip;
1062cabdff1aSopenharmony_ci
1063cabdff1aSopenharmony_ci        /* usually true for the first frame */
1064cabdff1aSopenharmony_ci        if (get_bits1(gb)) {
1065cabdff1aSopenharmony_ci            skip = get_bits(gb, av_log2(s->samples_per_frame * 2));
1066cabdff1aSopenharmony_ci            ff_dlog(s->avctx, "start skip: %i\n", skip);
1067cabdff1aSopenharmony_ci        }
1068cabdff1aSopenharmony_ci
1069cabdff1aSopenharmony_ci        /* sometimes true for the last frame */
1070cabdff1aSopenharmony_ci        if (get_bits1(gb)) {
1071cabdff1aSopenharmony_ci            skip = get_bits(gb, av_log2(s->samples_per_frame * 2));
1072cabdff1aSopenharmony_ci            ff_dlog(s->avctx, "end skip: %i\n", skip);
1073cabdff1aSopenharmony_ci            s->frame->nb_samples -= skip;
1074cabdff1aSopenharmony_ci            if (s->frame->nb_samples <= 0)
1075cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1076cabdff1aSopenharmony_ci        }
1077cabdff1aSopenharmony_ci
1078cabdff1aSopenharmony_ci    }
1079cabdff1aSopenharmony_ci
1080cabdff1aSopenharmony_ci    /* reset subframe states */
1081cabdff1aSopenharmony_ci    s->parsed_all_subframes = 0;
1082cabdff1aSopenharmony_ci    for (i = 0; i < s->num_channels; i++) {
1083cabdff1aSopenharmony_ci        s->channel[i].decoded_samples = 0;
1084cabdff1aSopenharmony_ci        s->channel[i].cur_subframe    = 0;
1085cabdff1aSopenharmony_ci    }
1086cabdff1aSopenharmony_ci
1087cabdff1aSopenharmony_ci    /* decode all subframes */
1088cabdff1aSopenharmony_ci    while (!s->parsed_all_subframes) {
1089cabdff1aSopenharmony_ci        int decoded_samples = s->channel[0].decoded_samples;
1090cabdff1aSopenharmony_ci        if (decode_subframe(s) < 0) {
1091cabdff1aSopenharmony_ci            s->packet_loss = 1;
1092cabdff1aSopenharmony_ci            if (s->frame->nb_samples)
1093cabdff1aSopenharmony_ci                s->frame->nb_samples = decoded_samples;
1094cabdff1aSopenharmony_ci            return 0;
1095cabdff1aSopenharmony_ci        }
1096cabdff1aSopenharmony_ci    }
1097cabdff1aSopenharmony_ci
1098cabdff1aSopenharmony_ci    ff_dlog(s->avctx, "Frame done\n");
1099cabdff1aSopenharmony_ci
1100cabdff1aSopenharmony_ci    s->skip_frame = 0;
1101cabdff1aSopenharmony_ci
1102cabdff1aSopenharmony_ci    if (s->len_prefix) {
1103cabdff1aSopenharmony_ci        if (len != (get_bits_count(gb) - s->frame_offset) + 2) {
1104cabdff1aSopenharmony_ci            /* FIXME: not sure if this is always an error */
1105cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR,
1106cabdff1aSopenharmony_ci                   "frame[%"PRIu32"] would have to skip %i bits\n",
1107cabdff1aSopenharmony_ci                   s->frame_num,
1108cabdff1aSopenharmony_ci                   len - (get_bits_count(gb) - s->frame_offset) - 1);
1109cabdff1aSopenharmony_ci            s->packet_loss = 1;
1110cabdff1aSopenharmony_ci            return 0;
1111cabdff1aSopenharmony_ci        }
1112cabdff1aSopenharmony_ci
1113cabdff1aSopenharmony_ci        /* skip the rest of the frame data */
1114cabdff1aSopenharmony_ci        skip_bits_long(gb, len - (get_bits_count(gb) - s->frame_offset) - 1);
1115cabdff1aSopenharmony_ci    }
1116cabdff1aSopenharmony_ci
1117cabdff1aSopenharmony_ci    /* decode trailer bit */
1118cabdff1aSopenharmony_ci    more_frames = get_bits1(gb);
1119cabdff1aSopenharmony_ci    ++s->frame_num;
1120cabdff1aSopenharmony_ci    return more_frames;
1121cabdff1aSopenharmony_ci}
1122cabdff1aSopenharmony_ci
1123cabdff1aSopenharmony_ci/**
1124cabdff1aSopenharmony_ci * @brief Calculate remaining input buffer length.
1125cabdff1aSopenharmony_ci * @param s  codec context
1126cabdff1aSopenharmony_ci * @param gb bitstream reader context
1127cabdff1aSopenharmony_ci * @return remaining size in bits
1128cabdff1aSopenharmony_ci */
1129cabdff1aSopenharmony_cistatic int remaining_bits(WmallDecodeCtx *s, GetBitContext *gb)
1130cabdff1aSopenharmony_ci{
1131cabdff1aSopenharmony_ci    return s->buf_bit_size - get_bits_count(gb);
1132cabdff1aSopenharmony_ci}
1133cabdff1aSopenharmony_ci
1134cabdff1aSopenharmony_ci/**
1135cabdff1aSopenharmony_ci * @brief Fill the bit reservoir with a (partial) frame.
1136cabdff1aSopenharmony_ci * @param s      codec context
1137cabdff1aSopenharmony_ci * @param gb     bitstream reader context
1138cabdff1aSopenharmony_ci * @param len    length of the partial frame
1139cabdff1aSopenharmony_ci * @param append decides whether to reset the buffer or not
1140cabdff1aSopenharmony_ci */
1141cabdff1aSopenharmony_cistatic void save_bits(WmallDecodeCtx *s, GetBitContext* gb, int len,
1142cabdff1aSopenharmony_ci                      int append)
1143cabdff1aSopenharmony_ci{
1144cabdff1aSopenharmony_ci    int buflen;
1145cabdff1aSopenharmony_ci    PutBitContext tmp;
1146cabdff1aSopenharmony_ci
1147cabdff1aSopenharmony_ci    /* when the frame data does not need to be concatenated, the input buffer
1148cabdff1aSopenharmony_ci        is reset and additional bits from the previous frame are copied
1149cabdff1aSopenharmony_ci        and skipped later so that a fast byte copy is possible */
1150cabdff1aSopenharmony_ci
1151cabdff1aSopenharmony_ci    if (!append) {
1152cabdff1aSopenharmony_ci        s->frame_offset   = get_bits_count(gb) & 7;
1153cabdff1aSopenharmony_ci        s->num_saved_bits = s->frame_offset;
1154cabdff1aSopenharmony_ci        init_put_bits(&s->pb, s->frame_data, s->max_frame_size);
1155cabdff1aSopenharmony_ci    }
1156cabdff1aSopenharmony_ci
1157cabdff1aSopenharmony_ci    buflen = (s->num_saved_bits + len + 8) >> 3;
1158cabdff1aSopenharmony_ci
1159cabdff1aSopenharmony_ci    if (len <= 0 || buflen > s->max_frame_size) {
1160cabdff1aSopenharmony_ci        avpriv_request_sample(s->avctx, "Too small input buffer");
1161cabdff1aSopenharmony_ci        s->packet_loss = 1;
1162cabdff1aSopenharmony_ci        s->num_saved_bits = 0;
1163cabdff1aSopenharmony_ci        return;
1164cabdff1aSopenharmony_ci    }
1165cabdff1aSopenharmony_ci
1166cabdff1aSopenharmony_ci    s->num_saved_bits += len;
1167cabdff1aSopenharmony_ci    if (!append) {
1168cabdff1aSopenharmony_ci        ff_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3),
1169cabdff1aSopenharmony_ci                         s->num_saved_bits);
1170cabdff1aSopenharmony_ci    } else {
1171cabdff1aSopenharmony_ci        int align = 8 - (get_bits_count(gb) & 7);
1172cabdff1aSopenharmony_ci        align = FFMIN(align, len);
1173cabdff1aSopenharmony_ci        put_bits(&s->pb, align, get_bits(gb, align));
1174cabdff1aSopenharmony_ci        len -= align;
1175cabdff1aSopenharmony_ci        ff_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3), len);
1176cabdff1aSopenharmony_ci    }
1177cabdff1aSopenharmony_ci    skip_bits_long(gb, len);
1178cabdff1aSopenharmony_ci
1179cabdff1aSopenharmony_ci    tmp = s->pb;
1180cabdff1aSopenharmony_ci    flush_put_bits(&tmp);
1181cabdff1aSopenharmony_ci
1182cabdff1aSopenharmony_ci    init_get_bits(&s->gb, s->frame_data, s->num_saved_bits);
1183cabdff1aSopenharmony_ci    skip_bits(&s->gb, s->frame_offset);
1184cabdff1aSopenharmony_ci}
1185cabdff1aSopenharmony_ci
1186cabdff1aSopenharmony_cistatic int decode_packet(AVCodecContext *avctx, AVFrame *rframe,
1187cabdff1aSopenharmony_ci                         int *got_frame_ptr, AVPacket* avpkt)
1188cabdff1aSopenharmony_ci{
1189cabdff1aSopenharmony_ci    WmallDecodeCtx *s = avctx->priv_data;
1190cabdff1aSopenharmony_ci    GetBitContext* gb  = &s->pgb;
1191cabdff1aSopenharmony_ci    const uint8_t* buf = avpkt->data;
1192cabdff1aSopenharmony_ci    int buf_size       = avpkt->size;
1193cabdff1aSopenharmony_ci    int num_bits_prev_frame, packet_sequence_number, spliced_packet;
1194cabdff1aSopenharmony_ci
1195cabdff1aSopenharmony_ci    s->frame->nb_samples = 0;
1196cabdff1aSopenharmony_ci
1197cabdff1aSopenharmony_ci    if (!buf_size && s->num_saved_bits > get_bits_count(&s->gb)) {
1198cabdff1aSopenharmony_ci        s->packet_done = 0;
1199cabdff1aSopenharmony_ci        if (!decode_frame(s))
1200cabdff1aSopenharmony_ci            s->num_saved_bits = 0;
1201cabdff1aSopenharmony_ci    } else if (s->packet_done || s->packet_loss) {
1202cabdff1aSopenharmony_ci        s->packet_done = 0;
1203cabdff1aSopenharmony_ci
1204cabdff1aSopenharmony_ci        if (!buf_size)
1205cabdff1aSopenharmony_ci            return 0;
1206cabdff1aSopenharmony_ci
1207cabdff1aSopenharmony_ci        s->next_packet_start = buf_size - FFMIN(avctx->block_align, buf_size);
1208cabdff1aSopenharmony_ci        buf_size             = FFMIN(avctx->block_align, buf_size);
1209cabdff1aSopenharmony_ci        s->buf_bit_size      = buf_size << 3;
1210cabdff1aSopenharmony_ci
1211cabdff1aSopenharmony_ci        /* parse packet header */
1212cabdff1aSopenharmony_ci        init_get_bits(gb, buf, s->buf_bit_size);
1213cabdff1aSopenharmony_ci        packet_sequence_number = get_bits(gb, 4);
1214cabdff1aSopenharmony_ci        skip_bits(gb, 1);   // Skip seekable_frame_in_packet, currently unused
1215cabdff1aSopenharmony_ci        spliced_packet = get_bits1(gb);
1216cabdff1aSopenharmony_ci        if (spliced_packet)
1217cabdff1aSopenharmony_ci            avpriv_request_sample(avctx, "Bitstream splicing");
1218cabdff1aSopenharmony_ci
1219cabdff1aSopenharmony_ci        /* get number of bits that need to be added to the previous frame */
1220cabdff1aSopenharmony_ci        num_bits_prev_frame = get_bits(gb, s->log2_frame_size);
1221cabdff1aSopenharmony_ci
1222cabdff1aSopenharmony_ci        /* check for packet loss */
1223cabdff1aSopenharmony_ci        if (!s->packet_loss &&
1224cabdff1aSopenharmony_ci            ((s->packet_sequence_number + 1) & 0xF) != packet_sequence_number) {
1225cabdff1aSopenharmony_ci            s->packet_loss = 1;
1226cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR,
1227cabdff1aSopenharmony_ci                   "Packet loss detected! seq %"PRIx8" vs %x\n",
1228cabdff1aSopenharmony_ci                   s->packet_sequence_number, packet_sequence_number);
1229cabdff1aSopenharmony_ci        }
1230cabdff1aSopenharmony_ci        s->packet_sequence_number = packet_sequence_number;
1231cabdff1aSopenharmony_ci
1232cabdff1aSopenharmony_ci        if (num_bits_prev_frame > 0) {
1233cabdff1aSopenharmony_ci            int remaining_packet_bits = s->buf_bit_size - get_bits_count(gb);
1234cabdff1aSopenharmony_ci            if (num_bits_prev_frame >= remaining_packet_bits) {
1235cabdff1aSopenharmony_ci                num_bits_prev_frame = remaining_packet_bits;
1236cabdff1aSopenharmony_ci                s->packet_done = 1;
1237cabdff1aSopenharmony_ci            }
1238cabdff1aSopenharmony_ci
1239cabdff1aSopenharmony_ci            /* Append the previous frame data to the remaining data from the
1240cabdff1aSopenharmony_ci             * previous packet to create a full frame. */
1241cabdff1aSopenharmony_ci            save_bits(s, gb, num_bits_prev_frame, 1);
1242cabdff1aSopenharmony_ci
1243cabdff1aSopenharmony_ci            /* decode the cross packet frame if it is valid */
1244cabdff1aSopenharmony_ci            if (num_bits_prev_frame < remaining_packet_bits && !s->packet_loss)
1245cabdff1aSopenharmony_ci                decode_frame(s);
1246cabdff1aSopenharmony_ci        } else if (s->num_saved_bits - s->frame_offset) {
1247cabdff1aSopenharmony_ci            ff_dlog(avctx, "ignoring %x previously saved bits\n",
1248cabdff1aSopenharmony_ci                    s->num_saved_bits - s->frame_offset);
1249cabdff1aSopenharmony_ci        }
1250cabdff1aSopenharmony_ci
1251cabdff1aSopenharmony_ci        if (s->packet_loss) {
1252cabdff1aSopenharmony_ci            /* Reset number of saved bits so that the decoder does not start
1253cabdff1aSopenharmony_ci             * to decode incomplete frames in the s->len_prefix == 0 case. */
1254cabdff1aSopenharmony_ci            s->num_saved_bits = 0;
1255cabdff1aSopenharmony_ci            s->packet_loss    = 0;
1256cabdff1aSopenharmony_ci            init_put_bits(&s->pb, s->frame_data, s->max_frame_size);
1257cabdff1aSopenharmony_ci        }
1258cabdff1aSopenharmony_ci
1259cabdff1aSopenharmony_ci    } else {
1260cabdff1aSopenharmony_ci        int frame_size;
1261cabdff1aSopenharmony_ci
1262cabdff1aSopenharmony_ci        s->buf_bit_size = (avpkt->size - s->next_packet_start) << 3;
1263cabdff1aSopenharmony_ci        init_get_bits(gb, avpkt->data, s->buf_bit_size);
1264cabdff1aSopenharmony_ci        skip_bits(gb, s->packet_offset);
1265cabdff1aSopenharmony_ci
1266cabdff1aSopenharmony_ci        if (s->len_prefix && remaining_bits(s, gb) > s->log2_frame_size &&
1267cabdff1aSopenharmony_ci            (frame_size = show_bits(gb, s->log2_frame_size)) &&
1268cabdff1aSopenharmony_ci            frame_size <= remaining_bits(s, gb)) {
1269cabdff1aSopenharmony_ci            save_bits(s, gb, frame_size, 0);
1270cabdff1aSopenharmony_ci
1271cabdff1aSopenharmony_ci            if (!s->packet_loss)
1272cabdff1aSopenharmony_ci                s->packet_done = !decode_frame(s);
1273cabdff1aSopenharmony_ci        } else if (!s->len_prefix
1274cabdff1aSopenharmony_ci                   && s->num_saved_bits > get_bits_count(&s->gb)) {
1275cabdff1aSopenharmony_ci            /* when the frames do not have a length prefix, we don't know the
1276cabdff1aSopenharmony_ci             * compressed length of the individual frames however, we know what
1277cabdff1aSopenharmony_ci             * part of a new packet belongs to the previous frame therefore we
1278cabdff1aSopenharmony_ci             * save the incoming packet first, then we append the "previous
1279cabdff1aSopenharmony_ci             * frame" data from the next packet so that we get a buffer that
1280cabdff1aSopenharmony_ci             * only contains full frames */
1281cabdff1aSopenharmony_ci            s->packet_done = !decode_frame(s);
1282cabdff1aSopenharmony_ci        } else {
1283cabdff1aSopenharmony_ci            s->packet_done = 1;
1284cabdff1aSopenharmony_ci        }
1285cabdff1aSopenharmony_ci    }
1286cabdff1aSopenharmony_ci
1287cabdff1aSopenharmony_ci    if (remaining_bits(s, gb) < 0) {
1288cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Overread %d\n", -remaining_bits(s, gb));
1289cabdff1aSopenharmony_ci        s->packet_loss = 1;
1290cabdff1aSopenharmony_ci    }
1291cabdff1aSopenharmony_ci
1292cabdff1aSopenharmony_ci    if (s->packet_done && !s->packet_loss &&
1293cabdff1aSopenharmony_ci        remaining_bits(s, gb) > 0) {
1294cabdff1aSopenharmony_ci        /* save the rest of the data so that it can be decoded
1295cabdff1aSopenharmony_ci         * with the next packet */
1296cabdff1aSopenharmony_ci        save_bits(s, gb, remaining_bits(s, gb), 0);
1297cabdff1aSopenharmony_ci    }
1298cabdff1aSopenharmony_ci
1299cabdff1aSopenharmony_ci    *got_frame_ptr   = s->frame->nb_samples > 0;
1300cabdff1aSopenharmony_ci    av_frame_move_ref(rframe, s->frame);
1301cabdff1aSopenharmony_ci
1302cabdff1aSopenharmony_ci    s->packet_offset = get_bits_count(gb) & 7;
1303cabdff1aSopenharmony_ci
1304cabdff1aSopenharmony_ci    return (s->packet_loss) ? AVERROR_INVALIDDATA : buf_size ? get_bits_count(gb) >> 3 : 0;
1305cabdff1aSopenharmony_ci}
1306cabdff1aSopenharmony_ci
1307cabdff1aSopenharmony_cistatic void flush(AVCodecContext *avctx)
1308cabdff1aSopenharmony_ci{
1309cabdff1aSopenharmony_ci    WmallDecodeCtx *s    = avctx->priv_data;
1310cabdff1aSopenharmony_ci    s->packet_loss       = 1;
1311cabdff1aSopenharmony_ci    s->packet_done       = 0;
1312cabdff1aSopenharmony_ci    s->num_saved_bits    = 0;
1313cabdff1aSopenharmony_ci    s->frame_offset      = 0;
1314cabdff1aSopenharmony_ci    s->next_packet_start = 0;
1315cabdff1aSopenharmony_ci    s->cdlms[0][0].order = 0;
1316cabdff1aSopenharmony_ci    s->frame->nb_samples = 0;
1317cabdff1aSopenharmony_ci    init_put_bits(&s->pb, s->frame_data, s->max_frame_size);
1318cabdff1aSopenharmony_ci}
1319cabdff1aSopenharmony_ci
1320cabdff1aSopenharmony_cistatic av_cold int decode_close(AVCodecContext *avctx)
1321cabdff1aSopenharmony_ci{
1322cabdff1aSopenharmony_ci    WmallDecodeCtx *s = avctx->priv_data;
1323cabdff1aSopenharmony_ci
1324cabdff1aSopenharmony_ci    av_frame_free(&s->frame);
1325cabdff1aSopenharmony_ci    av_freep(&s->frame_data);
1326cabdff1aSopenharmony_ci
1327cabdff1aSopenharmony_ci    return 0;
1328cabdff1aSopenharmony_ci}
1329cabdff1aSopenharmony_ci
1330cabdff1aSopenharmony_ciconst FFCodec ff_wmalossless_decoder = {
1331cabdff1aSopenharmony_ci    .p.name         = "wmalossless",
1332cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("Windows Media Audio Lossless"),
1333cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_AUDIO,
1334cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_WMALOSSLESS,
1335cabdff1aSopenharmony_ci    .priv_data_size = sizeof(WmallDecodeCtx),
1336cabdff1aSopenharmony_ci    .init           = decode_init,
1337cabdff1aSopenharmony_ci    .close          = decode_close,
1338cabdff1aSopenharmony_ci    FF_CODEC_DECODE_CB(decode_packet),
1339cabdff1aSopenharmony_ci    .flush          = flush,
1340cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
1341cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
1342cabdff1aSopenharmony_ci    .p.sample_fmts  = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
1343cabdff1aSopenharmony_ci                                                      AV_SAMPLE_FMT_S32P,
1344cabdff1aSopenharmony_ci                                                      AV_SAMPLE_FMT_NONE },
1345cabdff1aSopenharmony_ci};
1346