1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * WavPack lossless audio decoder
3cabdff1aSopenharmony_ci * Copyright (c) 2006,2011 Konstantin Shishkov
4cabdff1aSopenharmony_ci * Copyright (c) 2020 David Bryant
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * This file is part of FFmpeg.
7cabdff1aSopenharmony_ci *
8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
12cabdff1aSopenharmony_ci *
13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16cabdff1aSopenharmony_ci * Lesser General Public License for more details.
17cabdff1aSopenharmony_ci *
18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21cabdff1aSopenharmony_ci */
22cabdff1aSopenharmony_ci
23cabdff1aSopenharmony_ci#include "libavutil/buffer.h"
24cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h"
25cabdff1aSopenharmony_ci
26cabdff1aSopenharmony_ci#define BITSTREAM_READER_LE
27cabdff1aSopenharmony_ci#include "avcodec.h"
28cabdff1aSopenharmony_ci#include "bytestream.h"
29cabdff1aSopenharmony_ci#include "codec_internal.h"
30cabdff1aSopenharmony_ci#include "get_bits.h"
31cabdff1aSopenharmony_ci#include "thread.h"
32cabdff1aSopenharmony_ci#include "threadframe.h"
33cabdff1aSopenharmony_ci#include "unary.h"
34cabdff1aSopenharmony_ci#include "wavpack.h"
35cabdff1aSopenharmony_ci#include "dsd.h"
36cabdff1aSopenharmony_ci
37cabdff1aSopenharmony_ci/**
38cabdff1aSopenharmony_ci * @file
39cabdff1aSopenharmony_ci * WavPack lossless audio decoder
40cabdff1aSopenharmony_ci */
41cabdff1aSopenharmony_ci
42cabdff1aSopenharmony_ci#define DSD_BYTE_READY(low,high) (!(((low) ^ (high)) & 0xff000000))
43cabdff1aSopenharmony_ci
44cabdff1aSopenharmony_ci#define PTABLE_BITS 8
45cabdff1aSopenharmony_ci#define PTABLE_BINS (1<<PTABLE_BITS)
46cabdff1aSopenharmony_ci#define PTABLE_MASK (PTABLE_BINS-1)
47cabdff1aSopenharmony_ci
48cabdff1aSopenharmony_ci#define UP   0x010000fe
49cabdff1aSopenharmony_ci#define DOWN 0x00010000
50cabdff1aSopenharmony_ci#define DECAY 8
51cabdff1aSopenharmony_ci
52cabdff1aSopenharmony_ci#define PRECISION 20
53cabdff1aSopenharmony_ci#define VALUE_ONE (1 << PRECISION)
54cabdff1aSopenharmony_ci#define PRECISION_USE 12
55cabdff1aSopenharmony_ci
56cabdff1aSopenharmony_ci#define RATE_S 20
57cabdff1aSopenharmony_ci
58cabdff1aSopenharmony_ci#define MAX_HISTORY_BITS    5
59cabdff1aSopenharmony_ci#define MAX_HISTORY_BINS    (1 << MAX_HISTORY_BITS)
60cabdff1aSopenharmony_ci#define MAX_BIN_BYTES       1280    // for value_lookup, per bin (2k - 512 - 256)
61cabdff1aSopenharmony_ci
62cabdff1aSopenharmony_citypedef enum {
63cabdff1aSopenharmony_ci    MODULATION_PCM,     // pulse code modulation
64cabdff1aSopenharmony_ci    MODULATION_DSD      // pulse density modulation (aka DSD)
65cabdff1aSopenharmony_ci} Modulation;
66cabdff1aSopenharmony_ci
67cabdff1aSopenharmony_citypedef struct WavpackFrameContext {
68cabdff1aSopenharmony_ci    AVCodecContext *avctx;
69cabdff1aSopenharmony_ci    int frame_flags;
70cabdff1aSopenharmony_ci    int stereo, stereo_in;
71cabdff1aSopenharmony_ci    int joint;
72cabdff1aSopenharmony_ci    uint32_t CRC;
73cabdff1aSopenharmony_ci    GetBitContext gb;
74cabdff1aSopenharmony_ci    int got_extra_bits;
75cabdff1aSopenharmony_ci    uint32_t crc_extra_bits;
76cabdff1aSopenharmony_ci    GetBitContext gb_extra_bits;
77cabdff1aSopenharmony_ci    int samples;
78cabdff1aSopenharmony_ci    int terms;
79cabdff1aSopenharmony_ci    Decorr decorr[MAX_TERMS];
80cabdff1aSopenharmony_ci    int zero, one, zeroes;
81cabdff1aSopenharmony_ci    int extra_bits;
82cabdff1aSopenharmony_ci    int and, or, shift;
83cabdff1aSopenharmony_ci    int post_shift;
84cabdff1aSopenharmony_ci    int hybrid, hybrid_bitrate;
85cabdff1aSopenharmony_ci    int hybrid_maxclip, hybrid_minclip;
86cabdff1aSopenharmony_ci    int float_flag;
87cabdff1aSopenharmony_ci    int float_shift;
88cabdff1aSopenharmony_ci    int float_max_exp;
89cabdff1aSopenharmony_ci    WvChannel ch[2];
90cabdff1aSopenharmony_ci
91cabdff1aSopenharmony_ci    GetByteContext gbyte;
92cabdff1aSopenharmony_ci    int ptable [PTABLE_BINS];
93cabdff1aSopenharmony_ci    uint8_t value_lookup_buffer[MAX_HISTORY_BINS*MAX_BIN_BYTES];
94cabdff1aSopenharmony_ci    uint16_t summed_probabilities[MAX_HISTORY_BINS][256];
95cabdff1aSopenharmony_ci    uint8_t probabilities[MAX_HISTORY_BINS][256];
96cabdff1aSopenharmony_ci    uint8_t *value_lookup[MAX_HISTORY_BINS];
97cabdff1aSopenharmony_ci} WavpackFrameContext;
98cabdff1aSopenharmony_ci
99cabdff1aSopenharmony_ci#define WV_MAX_FRAME_DECODERS 14
100cabdff1aSopenharmony_ci
101cabdff1aSopenharmony_citypedef struct WavpackContext {
102cabdff1aSopenharmony_ci    AVCodecContext *avctx;
103cabdff1aSopenharmony_ci
104cabdff1aSopenharmony_ci    WavpackFrameContext *fdec[WV_MAX_FRAME_DECODERS];
105cabdff1aSopenharmony_ci    int fdec_num;
106cabdff1aSopenharmony_ci
107cabdff1aSopenharmony_ci    int block;
108cabdff1aSopenharmony_ci    int samples;
109cabdff1aSopenharmony_ci    int ch_offset;
110cabdff1aSopenharmony_ci
111cabdff1aSopenharmony_ci    AVFrame *frame;
112cabdff1aSopenharmony_ci    ThreadFrame curr_frame, prev_frame;
113cabdff1aSopenharmony_ci    Modulation modulation;
114cabdff1aSopenharmony_ci
115cabdff1aSopenharmony_ci    AVBufferRef *dsd_ref;
116cabdff1aSopenharmony_ci    DSDContext *dsdctx;
117cabdff1aSopenharmony_ci    int dsd_channels;
118cabdff1aSopenharmony_ci} WavpackContext;
119cabdff1aSopenharmony_ci
120cabdff1aSopenharmony_ci#define LEVEL_DECAY(a)  (((a) + 0x80) >> 8)
121cabdff1aSopenharmony_ci
122cabdff1aSopenharmony_cistatic av_always_inline unsigned get_tail(GetBitContext *gb, int k)
123cabdff1aSopenharmony_ci{
124cabdff1aSopenharmony_ci    int p, e, res;
125cabdff1aSopenharmony_ci
126cabdff1aSopenharmony_ci    if (k < 1)
127cabdff1aSopenharmony_ci        return 0;
128cabdff1aSopenharmony_ci    p   = av_log2(k);
129cabdff1aSopenharmony_ci    e   = (1 << (p + 1)) - k - 1;
130cabdff1aSopenharmony_ci    res = get_bitsz(gb, p);
131cabdff1aSopenharmony_ci    if (res >= e)
132cabdff1aSopenharmony_ci        res = res * 2U - e + get_bits1(gb);
133cabdff1aSopenharmony_ci    return res;
134cabdff1aSopenharmony_ci}
135cabdff1aSopenharmony_ci
136cabdff1aSopenharmony_cistatic int update_error_limit(WavpackFrameContext *ctx)
137cabdff1aSopenharmony_ci{
138cabdff1aSopenharmony_ci    int i, br[2], sl[2];
139cabdff1aSopenharmony_ci
140cabdff1aSopenharmony_ci    for (i = 0; i <= ctx->stereo_in; i++) {
141cabdff1aSopenharmony_ci        if (ctx->ch[i].bitrate_acc > UINT_MAX - ctx->ch[i].bitrate_delta)
142cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
143cabdff1aSopenharmony_ci        ctx->ch[i].bitrate_acc += ctx->ch[i].bitrate_delta;
144cabdff1aSopenharmony_ci        br[i]                   = ctx->ch[i].bitrate_acc >> 16;
145cabdff1aSopenharmony_ci        sl[i]                   = LEVEL_DECAY(ctx->ch[i].slow_level);
146cabdff1aSopenharmony_ci    }
147cabdff1aSopenharmony_ci    if (ctx->stereo_in && ctx->hybrid_bitrate) {
148cabdff1aSopenharmony_ci        int balance = (sl[1] - sl[0] + br[1] + 1) >> 1;
149cabdff1aSopenharmony_ci        if (balance > br[0]) {
150cabdff1aSopenharmony_ci            br[1] = br[0] * 2;
151cabdff1aSopenharmony_ci            br[0] = 0;
152cabdff1aSopenharmony_ci        } else if (-balance > br[0]) {
153cabdff1aSopenharmony_ci            br[0]  *= 2;
154cabdff1aSopenharmony_ci            br[1]   = 0;
155cabdff1aSopenharmony_ci        } else {
156cabdff1aSopenharmony_ci            br[1] = br[0] + balance;
157cabdff1aSopenharmony_ci            br[0] = br[0] - balance;
158cabdff1aSopenharmony_ci        }
159cabdff1aSopenharmony_ci    }
160cabdff1aSopenharmony_ci    for (i = 0; i <= ctx->stereo_in; i++) {
161cabdff1aSopenharmony_ci        if (ctx->hybrid_bitrate) {
162cabdff1aSopenharmony_ci            if (sl[i] - br[i] > -0x100)
163cabdff1aSopenharmony_ci                ctx->ch[i].error_limit = wp_exp2(sl[i] - br[i] + 0x100);
164cabdff1aSopenharmony_ci            else
165cabdff1aSopenharmony_ci                ctx->ch[i].error_limit = 0;
166cabdff1aSopenharmony_ci        } else {
167cabdff1aSopenharmony_ci            ctx->ch[i].error_limit = wp_exp2(br[i]);
168cabdff1aSopenharmony_ci        }
169cabdff1aSopenharmony_ci    }
170cabdff1aSopenharmony_ci
171cabdff1aSopenharmony_ci    return 0;
172cabdff1aSopenharmony_ci}
173cabdff1aSopenharmony_ci
174cabdff1aSopenharmony_cistatic int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb,
175cabdff1aSopenharmony_ci                        int channel, int *last)
176cabdff1aSopenharmony_ci{
177cabdff1aSopenharmony_ci    int t, t2;
178cabdff1aSopenharmony_ci    int sign, base, add, ret;
179cabdff1aSopenharmony_ci    WvChannel *c = &ctx->ch[channel];
180cabdff1aSopenharmony_ci
181cabdff1aSopenharmony_ci    *last = 0;
182cabdff1aSopenharmony_ci
183cabdff1aSopenharmony_ci    if ((ctx->ch[0].median[0] < 2U) && (ctx->ch[1].median[0] < 2U) &&
184cabdff1aSopenharmony_ci        !ctx->zero && !ctx->one) {
185cabdff1aSopenharmony_ci        if (ctx->zeroes) {
186cabdff1aSopenharmony_ci            ctx->zeroes--;
187cabdff1aSopenharmony_ci            if (ctx->zeroes) {
188cabdff1aSopenharmony_ci                c->slow_level -= LEVEL_DECAY(c->slow_level);
189cabdff1aSopenharmony_ci                return 0;
190cabdff1aSopenharmony_ci            }
191cabdff1aSopenharmony_ci        } else {
192cabdff1aSopenharmony_ci            t = get_unary_0_33(gb);
193cabdff1aSopenharmony_ci            if (t >= 2) {
194cabdff1aSopenharmony_ci                if (t >= 32 || get_bits_left(gb) < t - 1)
195cabdff1aSopenharmony_ci                    goto error;
196cabdff1aSopenharmony_ci                t = get_bits_long(gb, t - 1) | (1 << (t - 1));
197cabdff1aSopenharmony_ci            } else {
198cabdff1aSopenharmony_ci                if (get_bits_left(gb) < 0)
199cabdff1aSopenharmony_ci                    goto error;
200cabdff1aSopenharmony_ci            }
201cabdff1aSopenharmony_ci            ctx->zeroes = t;
202cabdff1aSopenharmony_ci            if (ctx->zeroes) {
203cabdff1aSopenharmony_ci                memset(ctx->ch[0].median, 0, sizeof(ctx->ch[0].median));
204cabdff1aSopenharmony_ci                memset(ctx->ch[1].median, 0, sizeof(ctx->ch[1].median));
205cabdff1aSopenharmony_ci                c->slow_level -= LEVEL_DECAY(c->slow_level);
206cabdff1aSopenharmony_ci                return 0;
207cabdff1aSopenharmony_ci            }
208cabdff1aSopenharmony_ci        }
209cabdff1aSopenharmony_ci    }
210cabdff1aSopenharmony_ci
211cabdff1aSopenharmony_ci    if (ctx->zero) {
212cabdff1aSopenharmony_ci        t         = 0;
213cabdff1aSopenharmony_ci        ctx->zero = 0;
214cabdff1aSopenharmony_ci    } else {
215cabdff1aSopenharmony_ci        t = get_unary_0_33(gb);
216cabdff1aSopenharmony_ci        if (get_bits_left(gb) < 0)
217cabdff1aSopenharmony_ci            goto error;
218cabdff1aSopenharmony_ci        if (t == 16) {
219cabdff1aSopenharmony_ci            t2 = get_unary_0_33(gb);
220cabdff1aSopenharmony_ci            if (t2 < 2) {
221cabdff1aSopenharmony_ci                if (get_bits_left(gb) < 0)
222cabdff1aSopenharmony_ci                    goto error;
223cabdff1aSopenharmony_ci                t += t2;
224cabdff1aSopenharmony_ci            } else {
225cabdff1aSopenharmony_ci                if (t2 >= 32 || get_bits_left(gb) < t2 - 1)
226cabdff1aSopenharmony_ci                    goto error;
227cabdff1aSopenharmony_ci                t += get_bits_long(gb, t2 - 1) | (1 << (t2 - 1));
228cabdff1aSopenharmony_ci            }
229cabdff1aSopenharmony_ci        }
230cabdff1aSopenharmony_ci
231cabdff1aSopenharmony_ci        if (ctx->one) {
232cabdff1aSopenharmony_ci            ctx->one = t & 1;
233cabdff1aSopenharmony_ci            t        = (t >> 1) + 1;
234cabdff1aSopenharmony_ci        } else {
235cabdff1aSopenharmony_ci            ctx->one = t & 1;
236cabdff1aSopenharmony_ci            t      >>= 1;
237cabdff1aSopenharmony_ci        }
238cabdff1aSopenharmony_ci        ctx->zero = !ctx->one;
239cabdff1aSopenharmony_ci    }
240cabdff1aSopenharmony_ci
241cabdff1aSopenharmony_ci    if (ctx->hybrid && !channel) {
242cabdff1aSopenharmony_ci        if (update_error_limit(ctx) < 0)
243cabdff1aSopenharmony_ci            goto error;
244cabdff1aSopenharmony_ci    }
245cabdff1aSopenharmony_ci
246cabdff1aSopenharmony_ci    if (!t) {
247cabdff1aSopenharmony_ci        base = 0;
248cabdff1aSopenharmony_ci        add  = GET_MED(0) - 1;
249cabdff1aSopenharmony_ci        DEC_MED(0);
250cabdff1aSopenharmony_ci    } else if (t == 1) {
251cabdff1aSopenharmony_ci        base = GET_MED(0);
252cabdff1aSopenharmony_ci        add  = GET_MED(1) - 1;
253cabdff1aSopenharmony_ci        INC_MED(0);
254cabdff1aSopenharmony_ci        DEC_MED(1);
255cabdff1aSopenharmony_ci    } else if (t == 2) {
256cabdff1aSopenharmony_ci        base = GET_MED(0) + GET_MED(1);
257cabdff1aSopenharmony_ci        add  = GET_MED(2) - 1;
258cabdff1aSopenharmony_ci        INC_MED(0);
259cabdff1aSopenharmony_ci        INC_MED(1);
260cabdff1aSopenharmony_ci        DEC_MED(2);
261cabdff1aSopenharmony_ci    } else {
262cabdff1aSopenharmony_ci        base = GET_MED(0) + GET_MED(1) + GET_MED(2) * (t - 2U);
263cabdff1aSopenharmony_ci        add  = GET_MED(2) - 1;
264cabdff1aSopenharmony_ci        INC_MED(0);
265cabdff1aSopenharmony_ci        INC_MED(1);
266cabdff1aSopenharmony_ci        INC_MED(2);
267cabdff1aSopenharmony_ci    }
268cabdff1aSopenharmony_ci    if (!c->error_limit) {
269cabdff1aSopenharmony_ci        if (add >= 0x2000000U) {
270cabdff1aSopenharmony_ci            av_log(ctx->avctx, AV_LOG_ERROR, "k %d is too large\n", add);
271cabdff1aSopenharmony_ci            goto error;
272cabdff1aSopenharmony_ci        }
273cabdff1aSopenharmony_ci        ret = base + get_tail(gb, add);
274cabdff1aSopenharmony_ci        if (get_bits_left(gb) <= 0)
275cabdff1aSopenharmony_ci            goto error;
276cabdff1aSopenharmony_ci    } else {
277cabdff1aSopenharmony_ci        int mid = (base * 2U + add + 1) >> 1;
278cabdff1aSopenharmony_ci        while (add > c->error_limit) {
279cabdff1aSopenharmony_ci            if (get_bits_left(gb) <= 0)
280cabdff1aSopenharmony_ci                goto error;
281cabdff1aSopenharmony_ci            if (get_bits1(gb)) {
282cabdff1aSopenharmony_ci                add -= (mid - (unsigned)base);
283cabdff1aSopenharmony_ci                base = mid;
284cabdff1aSopenharmony_ci            } else
285cabdff1aSopenharmony_ci                add = mid - (unsigned)base - 1;
286cabdff1aSopenharmony_ci            mid = (base * 2U + add + 1) >> 1;
287cabdff1aSopenharmony_ci        }
288cabdff1aSopenharmony_ci        ret = mid;
289cabdff1aSopenharmony_ci    }
290cabdff1aSopenharmony_ci    sign = get_bits1(gb);
291cabdff1aSopenharmony_ci    if (ctx->hybrid_bitrate)
292cabdff1aSopenharmony_ci        c->slow_level += wp_log2(ret) - LEVEL_DECAY(c->slow_level);
293cabdff1aSopenharmony_ci    return sign ? ~ret : ret;
294cabdff1aSopenharmony_ci
295cabdff1aSopenharmony_cierror:
296cabdff1aSopenharmony_ci    ret = get_bits_left(gb);
297cabdff1aSopenharmony_ci    if (ret <= 0) {
298cabdff1aSopenharmony_ci        av_log(ctx->avctx, AV_LOG_ERROR, "Too few bits (%d) left\n", ret);
299cabdff1aSopenharmony_ci    }
300cabdff1aSopenharmony_ci    *last = 1;
301cabdff1aSopenharmony_ci    return 0;
302cabdff1aSopenharmony_ci}
303cabdff1aSopenharmony_ci
304cabdff1aSopenharmony_cistatic inline int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc,
305cabdff1aSopenharmony_ci                                       unsigned S)
306cabdff1aSopenharmony_ci{
307cabdff1aSopenharmony_ci    unsigned bit;
308cabdff1aSopenharmony_ci
309cabdff1aSopenharmony_ci    if (s->extra_bits) {
310cabdff1aSopenharmony_ci        S *= 1 << s->extra_bits;
311cabdff1aSopenharmony_ci
312cabdff1aSopenharmony_ci        if (s->got_extra_bits &&
313cabdff1aSopenharmony_ci            get_bits_left(&s->gb_extra_bits) >= s->extra_bits) {
314cabdff1aSopenharmony_ci            S   |= get_bits_long(&s->gb_extra_bits, s->extra_bits);
315cabdff1aSopenharmony_ci            *crc = *crc * 9 + (S & 0xffff) * 3 + ((unsigned)S >> 16);
316cabdff1aSopenharmony_ci        }
317cabdff1aSopenharmony_ci    }
318cabdff1aSopenharmony_ci
319cabdff1aSopenharmony_ci    bit = (S & s->and) | s->or;
320cabdff1aSopenharmony_ci    bit = ((S + bit) << s->shift) - bit;
321cabdff1aSopenharmony_ci
322cabdff1aSopenharmony_ci    if (s->hybrid)
323cabdff1aSopenharmony_ci        bit = av_clip(bit, s->hybrid_minclip, s->hybrid_maxclip);
324cabdff1aSopenharmony_ci
325cabdff1aSopenharmony_ci    return bit << s->post_shift;
326cabdff1aSopenharmony_ci}
327cabdff1aSopenharmony_ci
328cabdff1aSopenharmony_cistatic float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S)
329cabdff1aSopenharmony_ci{
330cabdff1aSopenharmony_ci    union {
331cabdff1aSopenharmony_ci        float    f;
332cabdff1aSopenharmony_ci        uint32_t u;
333cabdff1aSopenharmony_ci    } value;
334cabdff1aSopenharmony_ci
335cabdff1aSopenharmony_ci    unsigned int sign;
336cabdff1aSopenharmony_ci    int exp = s->float_max_exp;
337cabdff1aSopenharmony_ci
338cabdff1aSopenharmony_ci    if (s->got_extra_bits) {
339cabdff1aSopenharmony_ci        const int max_bits  = 1 + 23 + 8 + 1;
340cabdff1aSopenharmony_ci        const int left_bits = get_bits_left(&s->gb_extra_bits);
341cabdff1aSopenharmony_ci
342cabdff1aSopenharmony_ci        if (left_bits + 8 * AV_INPUT_BUFFER_PADDING_SIZE < max_bits)
343cabdff1aSopenharmony_ci            return 0.0;
344cabdff1aSopenharmony_ci    }
345cabdff1aSopenharmony_ci
346cabdff1aSopenharmony_ci    if (S) {
347cabdff1aSopenharmony_ci        S  *= 1U << s->float_shift;
348cabdff1aSopenharmony_ci        sign = S < 0;
349cabdff1aSopenharmony_ci        if (sign)
350cabdff1aSopenharmony_ci            S = -(unsigned)S;
351cabdff1aSopenharmony_ci        if (S >= 0x1000000U) {
352cabdff1aSopenharmony_ci            if (s->got_extra_bits && get_bits1(&s->gb_extra_bits))
353cabdff1aSopenharmony_ci                S = get_bits(&s->gb_extra_bits, 23);
354cabdff1aSopenharmony_ci            else
355cabdff1aSopenharmony_ci                S = 0;
356cabdff1aSopenharmony_ci            exp = 255;
357cabdff1aSopenharmony_ci        } else if (exp) {
358cabdff1aSopenharmony_ci            int shift = 23 - av_log2(S);
359cabdff1aSopenharmony_ci            exp = s->float_max_exp;
360cabdff1aSopenharmony_ci            if (exp <= shift)
361cabdff1aSopenharmony_ci                shift = --exp;
362cabdff1aSopenharmony_ci            exp -= shift;
363cabdff1aSopenharmony_ci
364cabdff1aSopenharmony_ci            if (shift) {
365cabdff1aSopenharmony_ci                S <<= shift;
366cabdff1aSopenharmony_ci                if ((s->float_flag & WV_FLT_SHIFT_ONES) ||
367cabdff1aSopenharmony_ci                    (s->got_extra_bits &&
368cabdff1aSopenharmony_ci                     (s->float_flag & WV_FLT_SHIFT_SAME) &&
369cabdff1aSopenharmony_ci                     get_bits1(&s->gb_extra_bits))) {
370cabdff1aSopenharmony_ci                    S |= (1 << shift) - 1;
371cabdff1aSopenharmony_ci                } else if (s->got_extra_bits &&
372cabdff1aSopenharmony_ci                           (s->float_flag & WV_FLT_SHIFT_SENT)) {
373cabdff1aSopenharmony_ci                    S |= get_bits(&s->gb_extra_bits, shift);
374cabdff1aSopenharmony_ci                }
375cabdff1aSopenharmony_ci            }
376cabdff1aSopenharmony_ci        } else {
377cabdff1aSopenharmony_ci            exp = s->float_max_exp;
378cabdff1aSopenharmony_ci        }
379cabdff1aSopenharmony_ci        S &= 0x7fffff;
380cabdff1aSopenharmony_ci    } else {
381cabdff1aSopenharmony_ci        sign = 0;
382cabdff1aSopenharmony_ci        exp  = 0;
383cabdff1aSopenharmony_ci        if (s->got_extra_bits && (s->float_flag & WV_FLT_ZERO_SENT)) {
384cabdff1aSopenharmony_ci            if (get_bits1(&s->gb_extra_bits)) {
385cabdff1aSopenharmony_ci                S = get_bits(&s->gb_extra_bits, 23);
386cabdff1aSopenharmony_ci                if (s->float_max_exp >= 25)
387cabdff1aSopenharmony_ci                    exp = get_bits(&s->gb_extra_bits, 8);
388cabdff1aSopenharmony_ci                sign = get_bits1(&s->gb_extra_bits);
389cabdff1aSopenharmony_ci            } else {
390cabdff1aSopenharmony_ci                if (s->float_flag & WV_FLT_ZERO_SIGN)
391cabdff1aSopenharmony_ci                    sign = get_bits1(&s->gb_extra_bits);
392cabdff1aSopenharmony_ci            }
393cabdff1aSopenharmony_ci        }
394cabdff1aSopenharmony_ci    }
395cabdff1aSopenharmony_ci
396cabdff1aSopenharmony_ci    *crc = *crc * 27 + S * 9 + exp * 3 + sign;
397cabdff1aSopenharmony_ci
398cabdff1aSopenharmony_ci    value.u = (sign << 31) | (exp << 23) | S;
399cabdff1aSopenharmony_ci    return value.f;
400cabdff1aSopenharmony_ci}
401cabdff1aSopenharmony_ci
402cabdff1aSopenharmony_cistatic inline int wv_check_crc(WavpackFrameContext *s, uint32_t crc,
403cabdff1aSopenharmony_ci                               uint32_t crc_extra_bits)
404cabdff1aSopenharmony_ci{
405cabdff1aSopenharmony_ci    if (crc != s->CRC) {
406cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
407cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
408cabdff1aSopenharmony_ci    }
409cabdff1aSopenharmony_ci    if (s->got_extra_bits && crc_extra_bits != s->crc_extra_bits) {
410cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
411cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
412cabdff1aSopenharmony_ci    }
413cabdff1aSopenharmony_ci
414cabdff1aSopenharmony_ci    return 0;
415cabdff1aSopenharmony_ci}
416cabdff1aSopenharmony_ci
417cabdff1aSopenharmony_cistatic void init_ptable(int *table, int rate_i, int rate_s)
418cabdff1aSopenharmony_ci{
419cabdff1aSopenharmony_ci    int value = 0x808000, rate = rate_i << 8;
420cabdff1aSopenharmony_ci
421cabdff1aSopenharmony_ci    for (int c = (rate + 128) >> 8; c--;)
422cabdff1aSopenharmony_ci        value += (DOWN - value) >> DECAY;
423cabdff1aSopenharmony_ci
424cabdff1aSopenharmony_ci    for (int i = 0; i < PTABLE_BINS/2; i++) {
425cabdff1aSopenharmony_ci        table[i] = value;
426cabdff1aSopenharmony_ci        table[PTABLE_BINS-1-i] = 0x100ffff - value;
427cabdff1aSopenharmony_ci
428cabdff1aSopenharmony_ci        if (value > 0x010000) {
429cabdff1aSopenharmony_ci            rate += (rate * rate_s + 128) >> 8;
430cabdff1aSopenharmony_ci
431cabdff1aSopenharmony_ci            for (int c = (rate + 64) >> 7; c--;)
432cabdff1aSopenharmony_ci                value += (DOWN - value) >> DECAY;
433cabdff1aSopenharmony_ci        }
434cabdff1aSopenharmony_ci    }
435cabdff1aSopenharmony_ci}
436cabdff1aSopenharmony_ci
437cabdff1aSopenharmony_citypedef struct {
438cabdff1aSopenharmony_ci    int32_t value, fltr0, fltr1, fltr2, fltr3, fltr4, fltr5, fltr6, factor;
439cabdff1aSopenharmony_ci    unsigned int byte;
440cabdff1aSopenharmony_ci} DSDfilters;
441cabdff1aSopenharmony_ci
442cabdff1aSopenharmony_cistatic int wv_unpack_dsd_high(WavpackFrameContext *s, uint8_t *dst_left, uint8_t *dst_right)
443cabdff1aSopenharmony_ci{
444cabdff1aSopenharmony_ci    uint32_t checksum = 0xFFFFFFFF;
445cabdff1aSopenharmony_ci    uint8_t *dst_l = dst_left, *dst_r = dst_right;
446cabdff1aSopenharmony_ci    int total_samples = s->samples, stereo = dst_r ? 1 : 0;
447cabdff1aSopenharmony_ci    DSDfilters filters[2], *sp = filters;
448cabdff1aSopenharmony_ci    int rate_i, rate_s;
449cabdff1aSopenharmony_ci    uint32_t low, high, value;
450cabdff1aSopenharmony_ci
451cabdff1aSopenharmony_ci    if (bytestream2_get_bytes_left(&s->gbyte) < (stereo ? 20 : 13))
452cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
453cabdff1aSopenharmony_ci
454cabdff1aSopenharmony_ci    rate_i = bytestream2_get_byte(&s->gbyte);
455cabdff1aSopenharmony_ci    rate_s = bytestream2_get_byte(&s->gbyte);
456cabdff1aSopenharmony_ci
457cabdff1aSopenharmony_ci    if (rate_s != RATE_S)
458cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
459cabdff1aSopenharmony_ci
460cabdff1aSopenharmony_ci    init_ptable(s->ptable, rate_i, rate_s);
461cabdff1aSopenharmony_ci
462cabdff1aSopenharmony_ci    for (int channel = 0; channel < stereo + 1; channel++) {
463cabdff1aSopenharmony_ci        DSDfilters *sp = filters + channel;
464cabdff1aSopenharmony_ci
465cabdff1aSopenharmony_ci        sp->fltr1 = bytestream2_get_byte(&s->gbyte) << (PRECISION - 8);
466cabdff1aSopenharmony_ci        sp->fltr2 = bytestream2_get_byte(&s->gbyte) << (PRECISION - 8);
467cabdff1aSopenharmony_ci        sp->fltr3 = bytestream2_get_byte(&s->gbyte) << (PRECISION - 8);
468cabdff1aSopenharmony_ci        sp->fltr4 = bytestream2_get_byte(&s->gbyte) << (PRECISION - 8);
469cabdff1aSopenharmony_ci        sp->fltr5 = bytestream2_get_byte(&s->gbyte) << (PRECISION - 8);
470cabdff1aSopenharmony_ci        sp->fltr6 = 0;
471cabdff1aSopenharmony_ci        sp->factor = bytestream2_get_byte(&s->gbyte) & 0xff;
472cabdff1aSopenharmony_ci        sp->factor |= (bytestream2_get_byte(&s->gbyte) << 8) & 0xff00;
473cabdff1aSopenharmony_ci        sp->factor = (int32_t)((uint32_t)sp->factor << 16) >> 16;
474cabdff1aSopenharmony_ci    }
475cabdff1aSopenharmony_ci
476cabdff1aSopenharmony_ci    value = bytestream2_get_be32(&s->gbyte);
477cabdff1aSopenharmony_ci    high = 0xffffffff;
478cabdff1aSopenharmony_ci    low = 0x0;
479cabdff1aSopenharmony_ci
480cabdff1aSopenharmony_ci    while (total_samples--) {
481cabdff1aSopenharmony_ci        int bitcount = 8;
482cabdff1aSopenharmony_ci
483cabdff1aSopenharmony_ci        sp[0].value = sp[0].fltr1 - sp[0].fltr5 + ((sp[0].fltr6 * sp[0].factor) >> 2);
484cabdff1aSopenharmony_ci
485cabdff1aSopenharmony_ci        if (stereo)
486cabdff1aSopenharmony_ci            sp[1].value = sp[1].fltr1 - sp[1].fltr5 + ((sp[1].fltr6 * sp[1].factor) >> 2);
487cabdff1aSopenharmony_ci
488cabdff1aSopenharmony_ci        while (bitcount--) {
489cabdff1aSopenharmony_ci            int32_t *pp = s->ptable + ((sp[0].value >> (PRECISION - PRECISION_USE)) & PTABLE_MASK);
490cabdff1aSopenharmony_ci            uint32_t split = low + ((high - low) >> 8) * (*pp >> 16);
491cabdff1aSopenharmony_ci
492cabdff1aSopenharmony_ci            if (value <= split) {
493cabdff1aSopenharmony_ci                high = split;
494cabdff1aSopenharmony_ci                *pp += (UP - *pp) >> DECAY;
495cabdff1aSopenharmony_ci                sp[0].fltr0 = -1;
496cabdff1aSopenharmony_ci            } else {
497cabdff1aSopenharmony_ci                low = split + 1;
498cabdff1aSopenharmony_ci                *pp += (DOWN - *pp) >> DECAY;
499cabdff1aSopenharmony_ci                sp[0].fltr0 = 0;
500cabdff1aSopenharmony_ci            }
501cabdff1aSopenharmony_ci
502cabdff1aSopenharmony_ci            if (DSD_BYTE_READY(high, low) && !bytestream2_get_bytes_left(&s->gbyte))
503cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
504cabdff1aSopenharmony_ci            while (DSD_BYTE_READY(high, low) && bytestream2_get_bytes_left(&s->gbyte)) {
505cabdff1aSopenharmony_ci                value = (value << 8) | bytestream2_get_byte(&s->gbyte);
506cabdff1aSopenharmony_ci                high = (high << 8) | 0xff;
507cabdff1aSopenharmony_ci                low <<= 8;
508cabdff1aSopenharmony_ci            }
509cabdff1aSopenharmony_ci
510cabdff1aSopenharmony_ci            sp[0].value += sp[0].fltr6 * 8;
511cabdff1aSopenharmony_ci            sp[0].byte = (sp[0].byte << 1) | (sp[0].fltr0 & 1);
512cabdff1aSopenharmony_ci            sp[0].factor += (((sp[0].value ^ sp[0].fltr0) >> 31) | 1) &
513cabdff1aSopenharmony_ci                ((sp[0].value ^ (sp[0].value - (sp[0].fltr6 * 16))) >> 31);
514cabdff1aSopenharmony_ci            sp[0].fltr1 += ((sp[0].fltr0 & VALUE_ONE) - sp[0].fltr1) >> 6;
515cabdff1aSopenharmony_ci            sp[0].fltr2 += ((sp[0].fltr0 & VALUE_ONE) - sp[0].fltr2) >> 4;
516cabdff1aSopenharmony_ci            sp[0].fltr3 += (sp[0].fltr2 - sp[0].fltr3) >> 4;
517cabdff1aSopenharmony_ci            sp[0].fltr4 += (sp[0].fltr3 - sp[0].fltr4) >> 4;
518cabdff1aSopenharmony_ci            sp[0].value = (sp[0].fltr4 - sp[0].fltr5) >> 4;
519cabdff1aSopenharmony_ci            sp[0].fltr5 += sp[0].value;
520cabdff1aSopenharmony_ci            sp[0].fltr6 += (sp[0].value - sp[0].fltr6) >> 3;
521cabdff1aSopenharmony_ci            sp[0].value = sp[0].fltr1 - sp[0].fltr5 + ((sp[0].fltr6 * sp[0].factor) >> 2);
522cabdff1aSopenharmony_ci
523cabdff1aSopenharmony_ci            if (!stereo)
524cabdff1aSopenharmony_ci                continue;
525cabdff1aSopenharmony_ci
526cabdff1aSopenharmony_ci            pp = s->ptable + ((sp[1].value >> (PRECISION - PRECISION_USE)) & PTABLE_MASK);
527cabdff1aSopenharmony_ci            split = low + ((high - low) >> 8) * (*pp >> 16);
528cabdff1aSopenharmony_ci
529cabdff1aSopenharmony_ci            if (value <= split) {
530cabdff1aSopenharmony_ci                high = split;
531cabdff1aSopenharmony_ci                *pp += (UP - *pp) >> DECAY;
532cabdff1aSopenharmony_ci                sp[1].fltr0 = -1;
533cabdff1aSopenharmony_ci            } else {
534cabdff1aSopenharmony_ci                low = split + 1;
535cabdff1aSopenharmony_ci                *pp += (DOWN - *pp) >> DECAY;
536cabdff1aSopenharmony_ci                sp[1].fltr0 = 0;
537cabdff1aSopenharmony_ci            }
538cabdff1aSopenharmony_ci
539cabdff1aSopenharmony_ci            if (DSD_BYTE_READY(high, low) && !bytestream2_get_bytes_left(&s->gbyte))
540cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
541cabdff1aSopenharmony_ci            while (DSD_BYTE_READY(high, low) && bytestream2_get_bytes_left(&s->gbyte)) {
542cabdff1aSopenharmony_ci                value = (value << 8) | bytestream2_get_byte(&s->gbyte);
543cabdff1aSopenharmony_ci                high = (high << 8) | 0xff;
544cabdff1aSopenharmony_ci                low <<= 8;
545cabdff1aSopenharmony_ci            }
546cabdff1aSopenharmony_ci
547cabdff1aSopenharmony_ci            sp[1].value += sp[1].fltr6 * 8;
548cabdff1aSopenharmony_ci            sp[1].byte = (sp[1].byte << 1) | (sp[1].fltr0 & 1);
549cabdff1aSopenharmony_ci            sp[1].factor += (((sp[1].value ^ sp[1].fltr0) >> 31) | 1) &
550cabdff1aSopenharmony_ci                ((sp[1].value ^ (sp[1].value - (sp[1].fltr6 * 16))) >> 31);
551cabdff1aSopenharmony_ci            sp[1].fltr1 += ((sp[1].fltr0 & VALUE_ONE) - sp[1].fltr1) >> 6;
552cabdff1aSopenharmony_ci            sp[1].fltr2 += ((sp[1].fltr0 & VALUE_ONE) - sp[1].fltr2) >> 4;
553cabdff1aSopenharmony_ci            sp[1].fltr3 += (sp[1].fltr2 - sp[1].fltr3) >> 4;
554cabdff1aSopenharmony_ci            sp[1].fltr4 += (sp[1].fltr3 - sp[1].fltr4) >> 4;
555cabdff1aSopenharmony_ci            sp[1].value = (sp[1].fltr4 - sp[1].fltr5) >> 4;
556cabdff1aSopenharmony_ci            sp[1].fltr5 += sp[1].value;
557cabdff1aSopenharmony_ci            sp[1].fltr6 += (sp[1].value - sp[1].fltr6) >> 3;
558cabdff1aSopenharmony_ci            sp[1].value = sp[1].fltr1 - sp[1].fltr5 + ((sp[1].fltr6 * sp[1].factor) >> 2);
559cabdff1aSopenharmony_ci        }
560cabdff1aSopenharmony_ci
561cabdff1aSopenharmony_ci        checksum += (checksum << 1) + (*dst_l = sp[0].byte & 0xff);
562cabdff1aSopenharmony_ci        sp[0].factor -= (sp[0].factor + 512) >> 10;
563cabdff1aSopenharmony_ci        dst_l += 4;
564cabdff1aSopenharmony_ci
565cabdff1aSopenharmony_ci        if (stereo) {
566cabdff1aSopenharmony_ci            checksum += (checksum << 1) + (*dst_r = filters[1].byte & 0xff);
567cabdff1aSopenharmony_ci            filters[1].factor -= (filters[1].factor + 512) >> 10;
568cabdff1aSopenharmony_ci            dst_r += 4;
569cabdff1aSopenharmony_ci        }
570cabdff1aSopenharmony_ci    }
571cabdff1aSopenharmony_ci
572cabdff1aSopenharmony_ci    if (wv_check_crc(s, checksum, 0)) {
573cabdff1aSopenharmony_ci        if (s->avctx->err_recognition & AV_EF_CRCCHECK)
574cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
575cabdff1aSopenharmony_ci
576cabdff1aSopenharmony_ci        memset(dst_left, 0x69, s->samples * 4);
577cabdff1aSopenharmony_ci
578cabdff1aSopenharmony_ci        if (dst_r)
579cabdff1aSopenharmony_ci            memset(dst_right, 0x69, s->samples * 4);
580cabdff1aSopenharmony_ci    }
581cabdff1aSopenharmony_ci
582cabdff1aSopenharmony_ci    return 0;
583cabdff1aSopenharmony_ci}
584cabdff1aSopenharmony_ci
585cabdff1aSopenharmony_cistatic int wv_unpack_dsd_fast(WavpackFrameContext *s, uint8_t *dst_left, uint8_t *dst_right)
586cabdff1aSopenharmony_ci{
587cabdff1aSopenharmony_ci    uint8_t *dst_l = dst_left, *dst_r = dst_right;
588cabdff1aSopenharmony_ci    uint8_t history_bits, max_probability;
589cabdff1aSopenharmony_ci    int total_summed_probabilities  = 0;
590cabdff1aSopenharmony_ci    int total_samples               = s->samples;
591cabdff1aSopenharmony_ci    uint8_t *vlb                    = s->value_lookup_buffer;
592cabdff1aSopenharmony_ci    int history_bins, p0, p1, chan;
593cabdff1aSopenharmony_ci    uint32_t checksum               = 0xFFFFFFFF;
594cabdff1aSopenharmony_ci    uint32_t low, high, value;
595cabdff1aSopenharmony_ci
596cabdff1aSopenharmony_ci    if (!bytestream2_get_bytes_left(&s->gbyte))
597cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
598cabdff1aSopenharmony_ci
599cabdff1aSopenharmony_ci    history_bits = bytestream2_get_byte(&s->gbyte);
600cabdff1aSopenharmony_ci
601cabdff1aSopenharmony_ci    if (!bytestream2_get_bytes_left(&s->gbyte) || history_bits > MAX_HISTORY_BITS)
602cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
603cabdff1aSopenharmony_ci
604cabdff1aSopenharmony_ci    history_bins = 1 << history_bits;
605cabdff1aSopenharmony_ci    max_probability = bytestream2_get_byte(&s->gbyte);
606cabdff1aSopenharmony_ci
607cabdff1aSopenharmony_ci    if (max_probability < 0xff) {
608cabdff1aSopenharmony_ci        uint8_t *outptr = (uint8_t *)s->probabilities;
609cabdff1aSopenharmony_ci        uint8_t *outend = outptr + sizeof(*s->probabilities) * history_bins;
610cabdff1aSopenharmony_ci
611cabdff1aSopenharmony_ci        while (outptr < outend && bytestream2_get_bytes_left(&s->gbyte)) {
612cabdff1aSopenharmony_ci            int code = bytestream2_get_byte(&s->gbyte);
613cabdff1aSopenharmony_ci
614cabdff1aSopenharmony_ci            if (code > max_probability) {
615cabdff1aSopenharmony_ci                int zcount = code - max_probability;
616cabdff1aSopenharmony_ci
617cabdff1aSopenharmony_ci                while (outptr < outend && zcount--)
618cabdff1aSopenharmony_ci                    *outptr++ = 0;
619cabdff1aSopenharmony_ci            } else if (code) {
620cabdff1aSopenharmony_ci                *outptr++ = code;
621cabdff1aSopenharmony_ci            }
622cabdff1aSopenharmony_ci            else {
623cabdff1aSopenharmony_ci                break;
624cabdff1aSopenharmony_ci            }
625cabdff1aSopenharmony_ci        }
626cabdff1aSopenharmony_ci
627cabdff1aSopenharmony_ci        if (outptr < outend ||
628cabdff1aSopenharmony_ci            (bytestream2_get_bytes_left(&s->gbyte) && bytestream2_get_byte(&s->gbyte)))
629cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
630cabdff1aSopenharmony_ci    } else if (bytestream2_get_bytes_left(&s->gbyte) > (int)sizeof(*s->probabilities) * history_bins) {
631cabdff1aSopenharmony_ci        bytestream2_get_buffer(&s->gbyte, (uint8_t *)s->probabilities,
632cabdff1aSopenharmony_ci            sizeof(*s->probabilities) * history_bins);
633cabdff1aSopenharmony_ci    } else {
634cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
635cabdff1aSopenharmony_ci    }
636cabdff1aSopenharmony_ci
637cabdff1aSopenharmony_ci    for (p0 = 0; p0 < history_bins; p0++) {
638cabdff1aSopenharmony_ci        int32_t sum_values = 0;
639cabdff1aSopenharmony_ci
640cabdff1aSopenharmony_ci        for (int i = 0; i < 256; i++)
641cabdff1aSopenharmony_ci            s->summed_probabilities[p0][i] = sum_values += s->probabilities[p0][i];
642cabdff1aSopenharmony_ci
643cabdff1aSopenharmony_ci        if (sum_values) {
644cabdff1aSopenharmony_ci            total_summed_probabilities += sum_values;
645cabdff1aSopenharmony_ci
646cabdff1aSopenharmony_ci            if (total_summed_probabilities > history_bins * MAX_BIN_BYTES)
647cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
648cabdff1aSopenharmony_ci
649cabdff1aSopenharmony_ci            s->value_lookup[p0] = vlb;
650cabdff1aSopenharmony_ci
651cabdff1aSopenharmony_ci            for (int i = 0; i < 256; i++) {
652cabdff1aSopenharmony_ci                int c = s->probabilities[p0][i];
653cabdff1aSopenharmony_ci
654cabdff1aSopenharmony_ci                while (c--)
655cabdff1aSopenharmony_ci                    *vlb++ = i;
656cabdff1aSopenharmony_ci            }
657cabdff1aSopenharmony_ci        }
658cabdff1aSopenharmony_ci    }
659cabdff1aSopenharmony_ci
660cabdff1aSopenharmony_ci    if (bytestream2_get_bytes_left(&s->gbyte) < 4)
661cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
662cabdff1aSopenharmony_ci
663cabdff1aSopenharmony_ci    chan = p0 = p1 = 0;
664cabdff1aSopenharmony_ci    low = 0; high = 0xffffffff;
665cabdff1aSopenharmony_ci    value = bytestream2_get_be32(&s->gbyte);
666cabdff1aSopenharmony_ci
667cabdff1aSopenharmony_ci    if (dst_r)
668cabdff1aSopenharmony_ci        total_samples *= 2;
669cabdff1aSopenharmony_ci
670cabdff1aSopenharmony_ci    while (total_samples--) {
671cabdff1aSopenharmony_ci        unsigned int mult, index, code;
672cabdff1aSopenharmony_ci
673cabdff1aSopenharmony_ci        if (!s->summed_probabilities[p0][255])
674cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
675cabdff1aSopenharmony_ci
676cabdff1aSopenharmony_ci        mult = (high - low) / s->summed_probabilities[p0][255];
677cabdff1aSopenharmony_ci
678cabdff1aSopenharmony_ci        if (!mult) {
679cabdff1aSopenharmony_ci            if (bytestream2_get_bytes_left(&s->gbyte) >= 4)
680cabdff1aSopenharmony_ci                value = bytestream2_get_be32(&s->gbyte);
681cabdff1aSopenharmony_ci
682cabdff1aSopenharmony_ci            low = 0;
683cabdff1aSopenharmony_ci            high = 0xffffffff;
684cabdff1aSopenharmony_ci            mult = high / s->summed_probabilities[p0][255];
685cabdff1aSopenharmony_ci
686cabdff1aSopenharmony_ci            if (!mult)
687cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
688cabdff1aSopenharmony_ci        }
689cabdff1aSopenharmony_ci
690cabdff1aSopenharmony_ci        index = (value - low) / mult;
691cabdff1aSopenharmony_ci
692cabdff1aSopenharmony_ci        if (index >= s->summed_probabilities[p0][255])
693cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
694cabdff1aSopenharmony_ci
695cabdff1aSopenharmony_ci        if (!dst_r) {
696cabdff1aSopenharmony_ci            if ((*dst_l = code = s->value_lookup[p0][index]))
697cabdff1aSopenharmony_ci                low += s->summed_probabilities[p0][code-1] * mult;
698cabdff1aSopenharmony_ci
699cabdff1aSopenharmony_ci            dst_l += 4;
700cabdff1aSopenharmony_ci        } else {
701cabdff1aSopenharmony_ci            if ((code = s->value_lookup[p0][index]))
702cabdff1aSopenharmony_ci                low += s->summed_probabilities[p0][code-1] * mult;
703cabdff1aSopenharmony_ci
704cabdff1aSopenharmony_ci            if (chan) {
705cabdff1aSopenharmony_ci                *dst_r = code;
706cabdff1aSopenharmony_ci                dst_r += 4;
707cabdff1aSopenharmony_ci            }
708cabdff1aSopenharmony_ci            else {
709cabdff1aSopenharmony_ci                *dst_l = code;
710cabdff1aSopenharmony_ci                dst_l += 4;
711cabdff1aSopenharmony_ci            }
712cabdff1aSopenharmony_ci
713cabdff1aSopenharmony_ci            chan ^= 1;
714cabdff1aSopenharmony_ci        }
715cabdff1aSopenharmony_ci
716cabdff1aSopenharmony_ci        high = low + s->probabilities[p0][code] * mult - 1;
717cabdff1aSopenharmony_ci        checksum += (checksum << 1) + code;
718cabdff1aSopenharmony_ci
719cabdff1aSopenharmony_ci        if (!dst_r) {
720cabdff1aSopenharmony_ci            p0 = code & (history_bins-1);
721cabdff1aSopenharmony_ci        } else {
722cabdff1aSopenharmony_ci            p0 = p1;
723cabdff1aSopenharmony_ci            p1 = code & (history_bins-1);
724cabdff1aSopenharmony_ci        }
725cabdff1aSopenharmony_ci
726cabdff1aSopenharmony_ci        while (DSD_BYTE_READY(high, low) && bytestream2_get_bytes_left(&s->gbyte)) {
727cabdff1aSopenharmony_ci            value = (value << 8) | bytestream2_get_byte(&s->gbyte);
728cabdff1aSopenharmony_ci            high = (high << 8) | 0xff;
729cabdff1aSopenharmony_ci            low <<= 8;
730cabdff1aSopenharmony_ci        }
731cabdff1aSopenharmony_ci    }
732cabdff1aSopenharmony_ci
733cabdff1aSopenharmony_ci    if (wv_check_crc(s, checksum, 0)) {
734cabdff1aSopenharmony_ci        if (s->avctx->err_recognition & AV_EF_CRCCHECK)
735cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
736cabdff1aSopenharmony_ci
737cabdff1aSopenharmony_ci        memset(dst_left, 0x69, s->samples * 4);
738cabdff1aSopenharmony_ci
739cabdff1aSopenharmony_ci        if (dst_r)
740cabdff1aSopenharmony_ci            memset(dst_right, 0x69, s->samples * 4);
741cabdff1aSopenharmony_ci    }
742cabdff1aSopenharmony_ci
743cabdff1aSopenharmony_ci    return 0;
744cabdff1aSopenharmony_ci}
745cabdff1aSopenharmony_ci
746cabdff1aSopenharmony_cistatic int wv_unpack_dsd_copy(WavpackFrameContext *s, uint8_t *dst_left, uint8_t *dst_right)
747cabdff1aSopenharmony_ci{
748cabdff1aSopenharmony_ci    uint8_t *dst_l = dst_left, *dst_r = dst_right;
749cabdff1aSopenharmony_ci    int total_samples           = s->samples;
750cabdff1aSopenharmony_ci    uint32_t checksum           = 0xFFFFFFFF;
751cabdff1aSopenharmony_ci
752cabdff1aSopenharmony_ci    if (bytestream2_get_bytes_left(&s->gbyte) != total_samples * (dst_r ? 2 : 1))
753cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
754cabdff1aSopenharmony_ci
755cabdff1aSopenharmony_ci    while (total_samples--) {
756cabdff1aSopenharmony_ci        checksum += (checksum << 1) + (*dst_l = bytestream2_get_byte(&s->gbyte));
757cabdff1aSopenharmony_ci        dst_l += 4;
758cabdff1aSopenharmony_ci
759cabdff1aSopenharmony_ci        if (dst_r) {
760cabdff1aSopenharmony_ci            checksum += (checksum << 1) + (*dst_r = bytestream2_get_byte(&s->gbyte));
761cabdff1aSopenharmony_ci            dst_r += 4;
762cabdff1aSopenharmony_ci        }
763cabdff1aSopenharmony_ci    }
764cabdff1aSopenharmony_ci
765cabdff1aSopenharmony_ci    if (wv_check_crc(s, checksum, 0)) {
766cabdff1aSopenharmony_ci        if (s->avctx->err_recognition & AV_EF_CRCCHECK)
767cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
768cabdff1aSopenharmony_ci
769cabdff1aSopenharmony_ci        memset(dst_left, 0x69, s->samples * 4);
770cabdff1aSopenharmony_ci
771cabdff1aSopenharmony_ci        if (dst_r)
772cabdff1aSopenharmony_ci            memset(dst_right, 0x69, s->samples * 4);
773cabdff1aSopenharmony_ci    }
774cabdff1aSopenharmony_ci
775cabdff1aSopenharmony_ci    return 0;
776cabdff1aSopenharmony_ci}
777cabdff1aSopenharmony_ci
778cabdff1aSopenharmony_cistatic inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb,
779cabdff1aSopenharmony_ci                                   void *dst_l, void *dst_r, const int type)
780cabdff1aSopenharmony_ci{
781cabdff1aSopenharmony_ci    int i, j, count = 0;
782cabdff1aSopenharmony_ci    int last, t;
783cabdff1aSopenharmony_ci    int A, B, L, L2, R, R2;
784cabdff1aSopenharmony_ci    int pos                 = 0;
785cabdff1aSopenharmony_ci    uint32_t crc            = 0xFFFFFFFF;
786cabdff1aSopenharmony_ci    uint32_t crc_extra_bits = 0xFFFFFFFF;
787cabdff1aSopenharmony_ci    int16_t *dst16_l        = dst_l;
788cabdff1aSopenharmony_ci    int16_t *dst16_r        = dst_r;
789cabdff1aSopenharmony_ci    int32_t *dst32_l        = dst_l;
790cabdff1aSopenharmony_ci    int32_t *dst32_r        = dst_r;
791cabdff1aSopenharmony_ci    float *dstfl_l          = dst_l;
792cabdff1aSopenharmony_ci    float *dstfl_r          = dst_r;
793cabdff1aSopenharmony_ci
794cabdff1aSopenharmony_ci    s->one = s->zero = s->zeroes = 0;
795cabdff1aSopenharmony_ci    do {
796cabdff1aSopenharmony_ci        L = wv_get_value(s, gb, 0, &last);
797cabdff1aSopenharmony_ci        if (last)
798cabdff1aSopenharmony_ci            break;
799cabdff1aSopenharmony_ci        R = wv_get_value(s, gb, 1, &last);
800cabdff1aSopenharmony_ci        if (last)
801cabdff1aSopenharmony_ci            break;
802cabdff1aSopenharmony_ci        for (i = 0; i < s->terms; i++) {
803cabdff1aSopenharmony_ci            t = s->decorr[i].value;
804cabdff1aSopenharmony_ci            if (t > 0) {
805cabdff1aSopenharmony_ci                if (t > 8) {
806cabdff1aSopenharmony_ci                    if (t & 1) {
807cabdff1aSopenharmony_ci                        A = 2U * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
808cabdff1aSopenharmony_ci                        B = 2U * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1];
809cabdff1aSopenharmony_ci                    } else {
810cabdff1aSopenharmony_ci                        A = (int)(3U * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
811cabdff1aSopenharmony_ci                        B = (int)(3U * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1]) >> 1;
812cabdff1aSopenharmony_ci                    }
813cabdff1aSopenharmony_ci                    s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
814cabdff1aSopenharmony_ci                    s->decorr[i].samplesB[1] = s->decorr[i].samplesB[0];
815cabdff1aSopenharmony_ci                    j                        = 0;
816cabdff1aSopenharmony_ci                } else {
817cabdff1aSopenharmony_ci                    A = s->decorr[i].samplesA[pos];
818cabdff1aSopenharmony_ci                    B = s->decorr[i].samplesB[pos];
819cabdff1aSopenharmony_ci                    j = (pos + t) & 7;
820cabdff1aSopenharmony_ci                }
821cabdff1aSopenharmony_ci                if (type != AV_SAMPLE_FMT_S16P) {
822cabdff1aSopenharmony_ci                    L2 = L + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
823cabdff1aSopenharmony_ci                    R2 = R + ((s->decorr[i].weightB * (int64_t)B + 512) >> 10);
824cabdff1aSopenharmony_ci                } else {
825cabdff1aSopenharmony_ci                    L2 = L + (unsigned)((int)(s->decorr[i].weightA * (unsigned)A + 512) >> 10);
826cabdff1aSopenharmony_ci                    R2 = R + (unsigned)((int)(s->decorr[i].weightB * (unsigned)B + 512) >> 10);
827cabdff1aSopenharmony_ci                }
828cabdff1aSopenharmony_ci                if (A && L)
829cabdff1aSopenharmony_ci                    s->decorr[i].weightA -= ((((L ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
830cabdff1aSopenharmony_ci                if (B && R)
831cabdff1aSopenharmony_ci                    s->decorr[i].weightB -= ((((R ^ B) >> 30) & 2) - 1) * s->decorr[i].delta;
832cabdff1aSopenharmony_ci                s->decorr[i].samplesA[j] = L = L2;
833cabdff1aSopenharmony_ci                s->decorr[i].samplesB[j] = R = R2;
834cabdff1aSopenharmony_ci            } else if (t == -1) {
835cabdff1aSopenharmony_ci                if (type != AV_SAMPLE_FMT_S16P)
836cabdff1aSopenharmony_ci                    L2 = L + ((s->decorr[i].weightA * (int64_t)s->decorr[i].samplesA[0] + 512) >> 10);
837cabdff1aSopenharmony_ci                else
838cabdff1aSopenharmony_ci                    L2 = L + (unsigned)((int)(s->decorr[i].weightA * (unsigned)s->decorr[i].samplesA[0] + 512) >> 10);
839cabdff1aSopenharmony_ci                UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, s->decorr[i].samplesA[0], L);
840cabdff1aSopenharmony_ci                L = L2;
841cabdff1aSopenharmony_ci                if (type != AV_SAMPLE_FMT_S16P)
842cabdff1aSopenharmony_ci                    R2 = R + ((s->decorr[i].weightB * (int64_t)L2 + 512) >> 10);
843cabdff1aSopenharmony_ci                else
844cabdff1aSopenharmony_ci                    R2 = R + (unsigned)((int)(s->decorr[i].weightB * (unsigned)L2 + 512) >> 10);
845cabdff1aSopenharmony_ci                UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, L2, R);
846cabdff1aSopenharmony_ci                R                        = R2;
847cabdff1aSopenharmony_ci                s->decorr[i].samplesA[0] = R;
848cabdff1aSopenharmony_ci            } else {
849cabdff1aSopenharmony_ci                if (type != AV_SAMPLE_FMT_S16P)
850cabdff1aSopenharmony_ci                    R2 = R + ((s->decorr[i].weightB * (int64_t)s->decorr[i].samplesB[0] + 512) >> 10);
851cabdff1aSopenharmony_ci                else
852cabdff1aSopenharmony_ci                    R2 = R + (unsigned)((int)(s->decorr[i].weightB * (unsigned)s->decorr[i].samplesB[0] + 512) >> 10);
853cabdff1aSopenharmony_ci                UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, s->decorr[i].samplesB[0], R);
854cabdff1aSopenharmony_ci                R = R2;
855cabdff1aSopenharmony_ci
856cabdff1aSopenharmony_ci                if (t == -3) {
857cabdff1aSopenharmony_ci                    R2                       = s->decorr[i].samplesA[0];
858cabdff1aSopenharmony_ci                    s->decorr[i].samplesA[0] = R;
859cabdff1aSopenharmony_ci                }
860cabdff1aSopenharmony_ci
861cabdff1aSopenharmony_ci                if (type != AV_SAMPLE_FMT_S16P)
862cabdff1aSopenharmony_ci                    L2 = L + ((s->decorr[i].weightA * (int64_t)R2 + 512) >> 10);
863cabdff1aSopenharmony_ci                else
864cabdff1aSopenharmony_ci                    L2 = L + (unsigned)((int)(s->decorr[i].weightA * (unsigned)R2 + 512) >> 10);
865cabdff1aSopenharmony_ci                UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, R2, L);
866cabdff1aSopenharmony_ci                L                        = L2;
867cabdff1aSopenharmony_ci                s->decorr[i].samplesB[0] = L;
868cabdff1aSopenharmony_ci            }
869cabdff1aSopenharmony_ci        }
870cabdff1aSopenharmony_ci
871cabdff1aSopenharmony_ci        if (type == AV_SAMPLE_FMT_S16P) {
872cabdff1aSopenharmony_ci            if (FFABS((int64_t)L) + FFABS((int64_t)R) > (1<<19)) {
873cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "sample %d %d too large\n", L, R);
874cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
875cabdff1aSopenharmony_ci            }
876cabdff1aSopenharmony_ci        }
877cabdff1aSopenharmony_ci
878cabdff1aSopenharmony_ci        pos = (pos + 1) & 7;
879cabdff1aSopenharmony_ci        if (s->joint)
880cabdff1aSopenharmony_ci            L += (unsigned)(R -= (unsigned)(L >> 1));
881cabdff1aSopenharmony_ci        crc = (crc * 3 + L) * 3 + R;
882cabdff1aSopenharmony_ci
883cabdff1aSopenharmony_ci        if (type == AV_SAMPLE_FMT_FLTP) {
884cabdff1aSopenharmony_ci            *dstfl_l++ = wv_get_value_float(s, &crc_extra_bits, L);
885cabdff1aSopenharmony_ci            *dstfl_r++ = wv_get_value_float(s, &crc_extra_bits, R);
886cabdff1aSopenharmony_ci        } else if (type == AV_SAMPLE_FMT_S32P) {
887cabdff1aSopenharmony_ci            *dst32_l++ = wv_get_value_integer(s, &crc_extra_bits, L);
888cabdff1aSopenharmony_ci            *dst32_r++ = wv_get_value_integer(s, &crc_extra_bits, R);
889cabdff1aSopenharmony_ci        } else {
890cabdff1aSopenharmony_ci            *dst16_l++ = wv_get_value_integer(s, &crc_extra_bits, L);
891cabdff1aSopenharmony_ci            *dst16_r++ = wv_get_value_integer(s, &crc_extra_bits, R);
892cabdff1aSopenharmony_ci        }
893cabdff1aSopenharmony_ci        count++;
894cabdff1aSopenharmony_ci    } while (!last && count < s->samples);
895cabdff1aSopenharmony_ci
896cabdff1aSopenharmony_ci    if (last && count < s->samples) {
897cabdff1aSopenharmony_ci        int size = av_get_bytes_per_sample(type);
898cabdff1aSopenharmony_ci        memset((uint8_t*)dst_l + count*size, 0, (s->samples-count)*size);
899cabdff1aSopenharmony_ci        memset((uint8_t*)dst_r + count*size, 0, (s->samples-count)*size);
900cabdff1aSopenharmony_ci    }
901cabdff1aSopenharmony_ci
902cabdff1aSopenharmony_ci    if ((s->avctx->err_recognition & AV_EF_CRCCHECK) &&
903cabdff1aSopenharmony_ci        wv_check_crc(s, crc, crc_extra_bits))
904cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
905cabdff1aSopenharmony_ci
906cabdff1aSopenharmony_ci    return 0;
907cabdff1aSopenharmony_ci}
908cabdff1aSopenharmony_ci
909cabdff1aSopenharmony_cistatic inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb,
910cabdff1aSopenharmony_ci                                 void *dst, const int type)
911cabdff1aSopenharmony_ci{
912cabdff1aSopenharmony_ci    int i, j, count = 0;
913cabdff1aSopenharmony_ci    int last, t;
914cabdff1aSopenharmony_ci    int A, S, T;
915cabdff1aSopenharmony_ci    int pos                  = 0;
916cabdff1aSopenharmony_ci    uint32_t crc             = 0xFFFFFFFF;
917cabdff1aSopenharmony_ci    uint32_t crc_extra_bits  = 0xFFFFFFFF;
918cabdff1aSopenharmony_ci    int16_t *dst16           = dst;
919cabdff1aSopenharmony_ci    int32_t *dst32           = dst;
920cabdff1aSopenharmony_ci    float *dstfl             = dst;
921cabdff1aSopenharmony_ci
922cabdff1aSopenharmony_ci    s->one = s->zero = s->zeroes = 0;
923cabdff1aSopenharmony_ci    do {
924cabdff1aSopenharmony_ci        T = wv_get_value(s, gb, 0, &last);
925cabdff1aSopenharmony_ci        S = 0;
926cabdff1aSopenharmony_ci        if (last)
927cabdff1aSopenharmony_ci            break;
928cabdff1aSopenharmony_ci        for (i = 0; i < s->terms; i++) {
929cabdff1aSopenharmony_ci            t = s->decorr[i].value;
930cabdff1aSopenharmony_ci            if (t > 8) {
931cabdff1aSopenharmony_ci                if (t & 1)
932cabdff1aSopenharmony_ci                    A =  2U * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
933cabdff1aSopenharmony_ci                else
934cabdff1aSopenharmony_ci                    A = (int)(3U * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
935cabdff1aSopenharmony_ci                s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
936cabdff1aSopenharmony_ci                j                        = 0;
937cabdff1aSopenharmony_ci            } else {
938cabdff1aSopenharmony_ci                A = s->decorr[i].samplesA[pos];
939cabdff1aSopenharmony_ci                j = (pos + t) & 7;
940cabdff1aSopenharmony_ci            }
941cabdff1aSopenharmony_ci            if (type != AV_SAMPLE_FMT_S16P)
942cabdff1aSopenharmony_ci                S = T + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
943cabdff1aSopenharmony_ci            else
944cabdff1aSopenharmony_ci                S = T + (unsigned)((int)(s->decorr[i].weightA * (unsigned)A + 512) >> 10);
945cabdff1aSopenharmony_ci            if (A && T)
946cabdff1aSopenharmony_ci                s->decorr[i].weightA -= ((((T ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
947cabdff1aSopenharmony_ci            s->decorr[i].samplesA[j] = T = S;
948cabdff1aSopenharmony_ci        }
949cabdff1aSopenharmony_ci        pos = (pos + 1) & 7;
950cabdff1aSopenharmony_ci        crc = crc * 3 + S;
951cabdff1aSopenharmony_ci
952cabdff1aSopenharmony_ci        if (type == AV_SAMPLE_FMT_FLTP) {
953cabdff1aSopenharmony_ci            *dstfl++ = wv_get_value_float(s, &crc_extra_bits, S);
954cabdff1aSopenharmony_ci        } else if (type == AV_SAMPLE_FMT_S32P) {
955cabdff1aSopenharmony_ci            *dst32++ = wv_get_value_integer(s, &crc_extra_bits, S);
956cabdff1aSopenharmony_ci        } else {
957cabdff1aSopenharmony_ci            *dst16++ = wv_get_value_integer(s, &crc_extra_bits, S);
958cabdff1aSopenharmony_ci        }
959cabdff1aSopenharmony_ci        count++;
960cabdff1aSopenharmony_ci    } while (!last && count < s->samples);
961cabdff1aSopenharmony_ci
962cabdff1aSopenharmony_ci    if (last && count < s->samples) {
963cabdff1aSopenharmony_ci        int size = av_get_bytes_per_sample(type);
964cabdff1aSopenharmony_ci        memset((uint8_t*)dst + count*size, 0, (s->samples-count)*size);
965cabdff1aSopenharmony_ci    }
966cabdff1aSopenharmony_ci
967cabdff1aSopenharmony_ci    if (s->avctx->err_recognition & AV_EF_CRCCHECK) {
968cabdff1aSopenharmony_ci        int ret = wv_check_crc(s, crc, crc_extra_bits);
969cabdff1aSopenharmony_ci        if (ret < 0 && s->avctx->err_recognition & AV_EF_EXPLODE)
970cabdff1aSopenharmony_ci            return ret;
971cabdff1aSopenharmony_ci    }
972cabdff1aSopenharmony_ci
973cabdff1aSopenharmony_ci    return 0;
974cabdff1aSopenharmony_ci}
975cabdff1aSopenharmony_ci
976cabdff1aSopenharmony_cistatic av_cold int wv_alloc_frame_context(WavpackContext *c)
977cabdff1aSopenharmony_ci{
978cabdff1aSopenharmony_ci    if (c->fdec_num == WV_MAX_FRAME_DECODERS)
979cabdff1aSopenharmony_ci        return -1;
980cabdff1aSopenharmony_ci
981cabdff1aSopenharmony_ci    c->fdec[c->fdec_num] = av_mallocz(sizeof(**c->fdec));
982cabdff1aSopenharmony_ci    if (!c->fdec[c->fdec_num])
983cabdff1aSopenharmony_ci        return -1;
984cabdff1aSopenharmony_ci    c->fdec_num++;
985cabdff1aSopenharmony_ci    c->fdec[c->fdec_num - 1]->avctx = c->avctx;
986cabdff1aSopenharmony_ci
987cabdff1aSopenharmony_ci    return 0;
988cabdff1aSopenharmony_ci}
989cabdff1aSopenharmony_ci
990cabdff1aSopenharmony_cistatic int wv_dsd_reset(WavpackContext *s, int channels)
991cabdff1aSopenharmony_ci{
992cabdff1aSopenharmony_ci    int i;
993cabdff1aSopenharmony_ci
994cabdff1aSopenharmony_ci    s->dsdctx = NULL;
995cabdff1aSopenharmony_ci    s->dsd_channels = 0;
996cabdff1aSopenharmony_ci    av_buffer_unref(&s->dsd_ref);
997cabdff1aSopenharmony_ci
998cabdff1aSopenharmony_ci    if (!channels)
999cabdff1aSopenharmony_ci        return 0;
1000cabdff1aSopenharmony_ci
1001cabdff1aSopenharmony_ci    if (channels > INT_MAX / sizeof(*s->dsdctx))
1002cabdff1aSopenharmony_ci        return AVERROR(EINVAL);
1003cabdff1aSopenharmony_ci
1004cabdff1aSopenharmony_ci    s->dsd_ref = av_buffer_allocz(channels * sizeof(*s->dsdctx));
1005cabdff1aSopenharmony_ci    if (!s->dsd_ref)
1006cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
1007cabdff1aSopenharmony_ci    s->dsdctx = (DSDContext*)s->dsd_ref->data;
1008cabdff1aSopenharmony_ci    s->dsd_channels = channels;
1009cabdff1aSopenharmony_ci
1010cabdff1aSopenharmony_ci    for (i = 0; i < channels; i++)
1011cabdff1aSopenharmony_ci        memset(s->dsdctx[i].buf, 0x69, sizeof(s->dsdctx[i].buf));
1012cabdff1aSopenharmony_ci
1013cabdff1aSopenharmony_ci    return 0;
1014cabdff1aSopenharmony_ci}
1015cabdff1aSopenharmony_ci
1016cabdff1aSopenharmony_ci#if HAVE_THREADS
1017cabdff1aSopenharmony_cistatic int update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
1018cabdff1aSopenharmony_ci{
1019cabdff1aSopenharmony_ci    WavpackContext *fsrc = src->priv_data;
1020cabdff1aSopenharmony_ci    WavpackContext *fdst = dst->priv_data;
1021cabdff1aSopenharmony_ci    int ret;
1022cabdff1aSopenharmony_ci
1023cabdff1aSopenharmony_ci    if (dst == src)
1024cabdff1aSopenharmony_ci        return 0;
1025cabdff1aSopenharmony_ci
1026cabdff1aSopenharmony_ci    ff_thread_release_ext_buffer(dst, &fdst->curr_frame);
1027cabdff1aSopenharmony_ci    if (fsrc->curr_frame.f->data[0]) {
1028cabdff1aSopenharmony_ci        if ((ret = ff_thread_ref_frame(&fdst->curr_frame, &fsrc->curr_frame)) < 0)
1029cabdff1aSopenharmony_ci            return ret;
1030cabdff1aSopenharmony_ci    }
1031cabdff1aSopenharmony_ci
1032cabdff1aSopenharmony_ci    fdst->dsdctx = NULL;
1033cabdff1aSopenharmony_ci    fdst->dsd_channels = 0;
1034cabdff1aSopenharmony_ci    ret = av_buffer_replace(&fdst->dsd_ref, fsrc->dsd_ref);
1035cabdff1aSopenharmony_ci    if (ret < 0)
1036cabdff1aSopenharmony_ci        return ret;
1037cabdff1aSopenharmony_ci    if (fsrc->dsd_ref) {
1038cabdff1aSopenharmony_ci        fdst->dsdctx = (DSDContext*)fdst->dsd_ref->data;
1039cabdff1aSopenharmony_ci        fdst->dsd_channels = fsrc->dsd_channels;
1040cabdff1aSopenharmony_ci    }
1041cabdff1aSopenharmony_ci
1042cabdff1aSopenharmony_ci    return 0;
1043cabdff1aSopenharmony_ci}
1044cabdff1aSopenharmony_ci#endif
1045cabdff1aSopenharmony_ci
1046cabdff1aSopenharmony_cistatic av_cold int wavpack_decode_init(AVCodecContext *avctx)
1047cabdff1aSopenharmony_ci{
1048cabdff1aSopenharmony_ci    WavpackContext *s = avctx->priv_data;
1049cabdff1aSopenharmony_ci
1050cabdff1aSopenharmony_ci    s->avctx = avctx;
1051cabdff1aSopenharmony_ci
1052cabdff1aSopenharmony_ci    s->fdec_num = 0;
1053cabdff1aSopenharmony_ci
1054cabdff1aSopenharmony_ci    s->curr_frame.f = av_frame_alloc();
1055cabdff1aSopenharmony_ci    s->prev_frame.f = av_frame_alloc();
1056cabdff1aSopenharmony_ci
1057cabdff1aSopenharmony_ci    if (!s->curr_frame.f || !s->prev_frame.f)
1058cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
1059cabdff1aSopenharmony_ci
1060cabdff1aSopenharmony_ci    ff_init_dsd_data();
1061cabdff1aSopenharmony_ci
1062cabdff1aSopenharmony_ci    return 0;
1063cabdff1aSopenharmony_ci}
1064cabdff1aSopenharmony_ci
1065cabdff1aSopenharmony_cistatic av_cold int wavpack_decode_end(AVCodecContext *avctx)
1066cabdff1aSopenharmony_ci{
1067cabdff1aSopenharmony_ci    WavpackContext *s = avctx->priv_data;
1068cabdff1aSopenharmony_ci
1069cabdff1aSopenharmony_ci    for (int i = 0; i < s->fdec_num; i++)
1070cabdff1aSopenharmony_ci        av_freep(&s->fdec[i]);
1071cabdff1aSopenharmony_ci    s->fdec_num = 0;
1072cabdff1aSopenharmony_ci
1073cabdff1aSopenharmony_ci    ff_thread_release_ext_buffer(avctx, &s->curr_frame);
1074cabdff1aSopenharmony_ci    av_frame_free(&s->curr_frame.f);
1075cabdff1aSopenharmony_ci
1076cabdff1aSopenharmony_ci    ff_thread_release_ext_buffer(avctx, &s->prev_frame);
1077cabdff1aSopenharmony_ci    av_frame_free(&s->prev_frame.f);
1078cabdff1aSopenharmony_ci
1079cabdff1aSopenharmony_ci    av_buffer_unref(&s->dsd_ref);
1080cabdff1aSopenharmony_ci
1081cabdff1aSopenharmony_ci    return 0;
1082cabdff1aSopenharmony_ci}
1083cabdff1aSopenharmony_ci
1084cabdff1aSopenharmony_cistatic int wavpack_decode_block(AVCodecContext *avctx, int block_no,
1085cabdff1aSopenharmony_ci                                const uint8_t *buf, int buf_size)
1086cabdff1aSopenharmony_ci{
1087cabdff1aSopenharmony_ci    WavpackContext *wc = avctx->priv_data;
1088cabdff1aSopenharmony_ci    WavpackFrameContext *s;
1089cabdff1aSopenharmony_ci    GetByteContext gb;
1090cabdff1aSopenharmony_ci    enum AVSampleFormat sample_fmt;
1091cabdff1aSopenharmony_ci    void *samples_l = NULL, *samples_r = NULL;
1092cabdff1aSopenharmony_ci    int ret;
1093cabdff1aSopenharmony_ci    int got_terms   = 0, got_weights = 0, got_samples = 0,
1094cabdff1aSopenharmony_ci        got_entropy = 0, got_pcm     = 0, got_float   = 0, got_hybrid = 0;
1095cabdff1aSopenharmony_ci    int got_dsd = 0;
1096cabdff1aSopenharmony_ci    int i, j, id, size, ssize, weights, t;
1097cabdff1aSopenharmony_ci    int bpp, chan = 0, orig_bpp, sample_rate = 0, rate_x = 1, dsd_mode = 0;
1098cabdff1aSopenharmony_ci    int multiblock;
1099cabdff1aSopenharmony_ci    uint64_t chmask = 0;
1100cabdff1aSopenharmony_ci
1101cabdff1aSopenharmony_ci    if (block_no >= wc->fdec_num && wv_alloc_frame_context(wc) < 0) {
1102cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Error creating frame decode context\n");
1103cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1104cabdff1aSopenharmony_ci    }
1105cabdff1aSopenharmony_ci
1106cabdff1aSopenharmony_ci    s = wc->fdec[block_no];
1107cabdff1aSopenharmony_ci    if (!s) {
1108cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Context for block %d is not present\n",
1109cabdff1aSopenharmony_ci               block_no);
1110cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1111cabdff1aSopenharmony_ci    }
1112cabdff1aSopenharmony_ci
1113cabdff1aSopenharmony_ci    memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
1114cabdff1aSopenharmony_ci    memset(s->ch, 0, sizeof(s->ch));
1115cabdff1aSopenharmony_ci    s->extra_bits     = 0;
1116cabdff1aSopenharmony_ci    s->and            = s->or = s->shift = 0;
1117cabdff1aSopenharmony_ci    s->got_extra_bits = 0;
1118cabdff1aSopenharmony_ci
1119cabdff1aSopenharmony_ci    bytestream2_init(&gb, buf, buf_size);
1120cabdff1aSopenharmony_ci
1121cabdff1aSopenharmony_ci    s->samples = bytestream2_get_le32(&gb);
1122cabdff1aSopenharmony_ci    if (s->samples != wc->samples) {
1123cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Mismatching number of samples in "
1124cabdff1aSopenharmony_ci               "a sequence: %d and %d\n", wc->samples, s->samples);
1125cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1126cabdff1aSopenharmony_ci    }
1127cabdff1aSopenharmony_ci    s->frame_flags = bytestream2_get_le32(&gb);
1128cabdff1aSopenharmony_ci
1129cabdff1aSopenharmony_ci    if (s->frame_flags & (WV_FLOAT_DATA | WV_DSD_DATA))
1130cabdff1aSopenharmony_ci        sample_fmt = AV_SAMPLE_FMT_FLTP;
1131cabdff1aSopenharmony_ci    else if ((s->frame_flags & 0x03) <= 1)
1132cabdff1aSopenharmony_ci        sample_fmt = AV_SAMPLE_FMT_S16P;
1133cabdff1aSopenharmony_ci    else
1134cabdff1aSopenharmony_ci        sample_fmt          = AV_SAMPLE_FMT_S32P;
1135cabdff1aSopenharmony_ci
1136cabdff1aSopenharmony_ci    if (wc->ch_offset && avctx->sample_fmt != sample_fmt)
1137cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1138cabdff1aSopenharmony_ci
1139cabdff1aSopenharmony_ci    bpp            = av_get_bytes_per_sample(sample_fmt);
1140cabdff1aSopenharmony_ci    orig_bpp       = ((s->frame_flags & 0x03) + 1) << 3;
1141cabdff1aSopenharmony_ci    multiblock     = (s->frame_flags & WV_SINGLE_BLOCK) != WV_SINGLE_BLOCK;
1142cabdff1aSopenharmony_ci
1143cabdff1aSopenharmony_ci    s->stereo         = !(s->frame_flags & WV_MONO);
1144cabdff1aSopenharmony_ci    s->stereo_in      =  (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
1145cabdff1aSopenharmony_ci    s->joint          =   s->frame_flags & WV_JOINT_STEREO;
1146cabdff1aSopenharmony_ci    s->hybrid         =   s->frame_flags & WV_HYBRID_MODE;
1147cabdff1aSopenharmony_ci    s->hybrid_bitrate =   s->frame_flags & WV_HYBRID_BITRATE;
1148cabdff1aSopenharmony_ci    s->post_shift     = bpp * 8 - orig_bpp + ((s->frame_flags >> 13) & 0x1f);
1149cabdff1aSopenharmony_ci    if (s->post_shift < 0 || s->post_shift > 31) {
1150cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1151cabdff1aSopenharmony_ci    }
1152cabdff1aSopenharmony_ci    s->hybrid_maxclip =  ((1LL << (orig_bpp - 1)) - 1);
1153cabdff1aSopenharmony_ci    s->hybrid_minclip = ((-1UL << (orig_bpp - 1)));
1154cabdff1aSopenharmony_ci    s->CRC            = bytestream2_get_le32(&gb);
1155cabdff1aSopenharmony_ci
1156cabdff1aSopenharmony_ci    // parse metadata blocks
1157cabdff1aSopenharmony_ci    while (bytestream2_get_bytes_left(&gb)) {
1158cabdff1aSopenharmony_ci        id   = bytestream2_get_byte(&gb);
1159cabdff1aSopenharmony_ci        size = bytestream2_get_byte(&gb);
1160cabdff1aSopenharmony_ci        if (id & WP_IDF_LONG)
1161cabdff1aSopenharmony_ci            size |= (bytestream2_get_le16u(&gb)) << 8;
1162cabdff1aSopenharmony_ci        size <<= 1; // size is specified in words
1163cabdff1aSopenharmony_ci        ssize  = size;
1164cabdff1aSopenharmony_ci        if (id & WP_IDF_ODD)
1165cabdff1aSopenharmony_ci            size--;
1166cabdff1aSopenharmony_ci        if (size < 0) {
1167cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR,
1168cabdff1aSopenharmony_ci                   "Got incorrect block %02X with size %i\n", id, size);
1169cabdff1aSopenharmony_ci            break;
1170cabdff1aSopenharmony_ci        }
1171cabdff1aSopenharmony_ci        if (bytestream2_get_bytes_left(&gb) < ssize) {
1172cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR,
1173cabdff1aSopenharmony_ci                   "Block size %i is out of bounds\n", size);
1174cabdff1aSopenharmony_ci            break;
1175cabdff1aSopenharmony_ci        }
1176cabdff1aSopenharmony_ci        switch (id & WP_IDF_MASK) {
1177cabdff1aSopenharmony_ci        case WP_ID_DECTERMS:
1178cabdff1aSopenharmony_ci            if (size > MAX_TERMS) {
1179cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n");
1180cabdff1aSopenharmony_ci                s->terms = 0;
1181cabdff1aSopenharmony_ci                bytestream2_skip(&gb, ssize);
1182cabdff1aSopenharmony_ci                continue;
1183cabdff1aSopenharmony_ci            }
1184cabdff1aSopenharmony_ci            s->terms = size;
1185cabdff1aSopenharmony_ci            for (i = 0; i < s->terms; i++) {
1186cabdff1aSopenharmony_ci                uint8_t val = bytestream2_get_byte(&gb);
1187cabdff1aSopenharmony_ci                s->decorr[s->terms - i - 1].value = (val & 0x1F) - 5;
1188cabdff1aSopenharmony_ci                s->decorr[s->terms - i - 1].delta =  val >> 5;
1189cabdff1aSopenharmony_ci            }
1190cabdff1aSopenharmony_ci            got_terms = 1;
1191cabdff1aSopenharmony_ci            break;
1192cabdff1aSopenharmony_ci        case WP_ID_DECWEIGHTS:
1193cabdff1aSopenharmony_ci            if (!got_terms) {
1194cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
1195cabdff1aSopenharmony_ci                continue;
1196cabdff1aSopenharmony_ci            }
1197cabdff1aSopenharmony_ci            weights = size >> s->stereo_in;
1198cabdff1aSopenharmony_ci            if (weights > MAX_TERMS || weights > s->terms) {
1199cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "Too many decorrelation weights\n");
1200cabdff1aSopenharmony_ci                bytestream2_skip(&gb, ssize);
1201cabdff1aSopenharmony_ci                continue;
1202cabdff1aSopenharmony_ci            }
1203cabdff1aSopenharmony_ci            for (i = 0; i < weights; i++) {
1204cabdff1aSopenharmony_ci                t = (int8_t)bytestream2_get_byte(&gb);
1205cabdff1aSopenharmony_ci                s->decorr[s->terms - i - 1].weightA = t * (1 << 3);
1206cabdff1aSopenharmony_ci                if (s->decorr[s->terms - i - 1].weightA > 0)
1207cabdff1aSopenharmony_ci                    s->decorr[s->terms - i - 1].weightA +=
1208cabdff1aSopenharmony_ci                        (s->decorr[s->terms - i - 1].weightA + 64) >> 7;
1209cabdff1aSopenharmony_ci                if (s->stereo_in) {
1210cabdff1aSopenharmony_ci                    t = (int8_t)bytestream2_get_byte(&gb);
1211cabdff1aSopenharmony_ci                    s->decorr[s->terms - i - 1].weightB = t * (1 << 3);
1212cabdff1aSopenharmony_ci                    if (s->decorr[s->terms - i - 1].weightB > 0)
1213cabdff1aSopenharmony_ci                        s->decorr[s->terms - i - 1].weightB +=
1214cabdff1aSopenharmony_ci                            (s->decorr[s->terms - i - 1].weightB + 64) >> 7;
1215cabdff1aSopenharmony_ci                }
1216cabdff1aSopenharmony_ci            }
1217cabdff1aSopenharmony_ci            got_weights = 1;
1218cabdff1aSopenharmony_ci            break;
1219cabdff1aSopenharmony_ci        case WP_ID_DECSAMPLES:
1220cabdff1aSopenharmony_ci            if (!got_terms) {
1221cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
1222cabdff1aSopenharmony_ci                continue;
1223cabdff1aSopenharmony_ci            }
1224cabdff1aSopenharmony_ci            t = 0;
1225cabdff1aSopenharmony_ci            for (i = s->terms - 1; (i >= 0) && (t < size); i--) {
1226cabdff1aSopenharmony_ci                if (s->decorr[i].value > 8) {
1227cabdff1aSopenharmony_ci                    s->decorr[i].samplesA[0] =
1228cabdff1aSopenharmony_ci                        wp_exp2(bytestream2_get_le16(&gb));
1229cabdff1aSopenharmony_ci                    s->decorr[i].samplesA[1] =
1230cabdff1aSopenharmony_ci                        wp_exp2(bytestream2_get_le16(&gb));
1231cabdff1aSopenharmony_ci
1232cabdff1aSopenharmony_ci                    if (s->stereo_in) {
1233cabdff1aSopenharmony_ci                        s->decorr[i].samplesB[0] =
1234cabdff1aSopenharmony_ci                            wp_exp2(bytestream2_get_le16(&gb));
1235cabdff1aSopenharmony_ci                        s->decorr[i].samplesB[1] =
1236cabdff1aSopenharmony_ci                            wp_exp2(bytestream2_get_le16(&gb));
1237cabdff1aSopenharmony_ci                        t                       += 4;
1238cabdff1aSopenharmony_ci                    }
1239cabdff1aSopenharmony_ci                    t += 4;
1240cabdff1aSopenharmony_ci                } else if (s->decorr[i].value < 0) {
1241cabdff1aSopenharmony_ci                    s->decorr[i].samplesA[0] =
1242cabdff1aSopenharmony_ci                        wp_exp2(bytestream2_get_le16(&gb));
1243cabdff1aSopenharmony_ci                    s->decorr[i].samplesB[0] =
1244cabdff1aSopenharmony_ci                        wp_exp2(bytestream2_get_le16(&gb));
1245cabdff1aSopenharmony_ci                    t                       += 4;
1246cabdff1aSopenharmony_ci                } else {
1247cabdff1aSopenharmony_ci                    for (j = 0; j < s->decorr[i].value; j++) {
1248cabdff1aSopenharmony_ci                        s->decorr[i].samplesA[j] =
1249cabdff1aSopenharmony_ci                            wp_exp2(bytestream2_get_le16(&gb));
1250cabdff1aSopenharmony_ci                        if (s->stereo_in) {
1251cabdff1aSopenharmony_ci                            s->decorr[i].samplesB[j] =
1252cabdff1aSopenharmony_ci                                wp_exp2(bytestream2_get_le16(&gb));
1253cabdff1aSopenharmony_ci                        }
1254cabdff1aSopenharmony_ci                    }
1255cabdff1aSopenharmony_ci                    t += s->decorr[i].value * 2 * (s->stereo_in + 1);
1256cabdff1aSopenharmony_ci                }
1257cabdff1aSopenharmony_ci            }
1258cabdff1aSopenharmony_ci            got_samples = 1;
1259cabdff1aSopenharmony_ci            break;
1260cabdff1aSopenharmony_ci        case WP_ID_ENTROPY:
1261cabdff1aSopenharmony_ci            if (size != 6 * (s->stereo_in + 1)) {
1262cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR,
1263cabdff1aSopenharmony_ci                       "Entropy vars size should be %i, got %i.\n",
1264cabdff1aSopenharmony_ci                       6 * (s->stereo_in + 1), size);
1265cabdff1aSopenharmony_ci                bytestream2_skip(&gb, ssize);
1266cabdff1aSopenharmony_ci                continue;
1267cabdff1aSopenharmony_ci            }
1268cabdff1aSopenharmony_ci            for (j = 0; j <= s->stereo_in; j++)
1269cabdff1aSopenharmony_ci                for (i = 0; i < 3; i++) {
1270cabdff1aSopenharmony_ci                    s->ch[j].median[i] = wp_exp2(bytestream2_get_le16(&gb));
1271cabdff1aSopenharmony_ci                }
1272cabdff1aSopenharmony_ci            got_entropy = 1;
1273cabdff1aSopenharmony_ci            break;
1274cabdff1aSopenharmony_ci        case WP_ID_HYBRID:
1275cabdff1aSopenharmony_ci            if (s->hybrid_bitrate) {
1276cabdff1aSopenharmony_ci                for (i = 0; i <= s->stereo_in; i++) {
1277cabdff1aSopenharmony_ci                    s->ch[i].slow_level = wp_exp2(bytestream2_get_le16(&gb));
1278cabdff1aSopenharmony_ci                    size               -= 2;
1279cabdff1aSopenharmony_ci                }
1280cabdff1aSopenharmony_ci            }
1281cabdff1aSopenharmony_ci            for (i = 0; i < (s->stereo_in + 1); i++) {
1282cabdff1aSopenharmony_ci                s->ch[i].bitrate_acc = bytestream2_get_le16(&gb) << 16;
1283cabdff1aSopenharmony_ci                size                -= 2;
1284cabdff1aSopenharmony_ci            }
1285cabdff1aSopenharmony_ci            if (size > 0) {
1286cabdff1aSopenharmony_ci                for (i = 0; i < (s->stereo_in + 1); i++) {
1287cabdff1aSopenharmony_ci                    s->ch[i].bitrate_delta =
1288cabdff1aSopenharmony_ci                        wp_exp2((int16_t)bytestream2_get_le16(&gb));
1289cabdff1aSopenharmony_ci                }
1290cabdff1aSopenharmony_ci            } else {
1291cabdff1aSopenharmony_ci                for (i = 0; i < (s->stereo_in + 1); i++)
1292cabdff1aSopenharmony_ci                    s->ch[i].bitrate_delta = 0;
1293cabdff1aSopenharmony_ci            }
1294cabdff1aSopenharmony_ci            got_hybrid = 1;
1295cabdff1aSopenharmony_ci            break;
1296cabdff1aSopenharmony_ci        case WP_ID_INT32INFO: {
1297cabdff1aSopenharmony_ci            uint8_t val[4];
1298cabdff1aSopenharmony_ci            if (size != 4) {
1299cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR,
1300cabdff1aSopenharmony_ci                       "Invalid INT32INFO, size = %i\n",
1301cabdff1aSopenharmony_ci                       size);
1302cabdff1aSopenharmony_ci                bytestream2_skip(&gb, ssize - 4);
1303cabdff1aSopenharmony_ci                continue;
1304cabdff1aSopenharmony_ci            }
1305cabdff1aSopenharmony_ci            bytestream2_get_buffer(&gb, val, 4);
1306cabdff1aSopenharmony_ci            if (val[0] > 30) {
1307cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR,
1308cabdff1aSopenharmony_ci                       "Invalid INT32INFO, extra_bits = %d (> 30)\n", val[0]);
1309cabdff1aSopenharmony_ci                continue;
1310cabdff1aSopenharmony_ci            } else {
1311cabdff1aSopenharmony_ci                s->extra_bits = val[0];
1312cabdff1aSopenharmony_ci            }
1313cabdff1aSopenharmony_ci            if (val[1])
1314cabdff1aSopenharmony_ci                s->shift = val[1];
1315cabdff1aSopenharmony_ci            if (val[2]) {
1316cabdff1aSopenharmony_ci                s->and   = s->or = 1;
1317cabdff1aSopenharmony_ci                s->shift = val[2];
1318cabdff1aSopenharmony_ci            }
1319cabdff1aSopenharmony_ci            if (val[3]) {
1320cabdff1aSopenharmony_ci                s->and   = 1;
1321cabdff1aSopenharmony_ci                s->shift = val[3];
1322cabdff1aSopenharmony_ci            }
1323cabdff1aSopenharmony_ci            if (s->shift > 31) {
1324cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR,
1325cabdff1aSopenharmony_ci                       "Invalid INT32INFO, shift = %d (> 31)\n", s->shift);
1326cabdff1aSopenharmony_ci                s->and = s->or = s->shift = 0;
1327cabdff1aSopenharmony_ci                continue;
1328cabdff1aSopenharmony_ci            }
1329cabdff1aSopenharmony_ci            /* original WavPack decoder forces 32-bit lossy sound to be treated
1330cabdff1aSopenharmony_ci             * as 24-bit one in order to have proper clipping */
1331cabdff1aSopenharmony_ci            if (s->hybrid && bpp == 4 && s->post_shift < 8 && s->shift > 8) {
1332cabdff1aSopenharmony_ci                s->post_shift      += 8;
1333cabdff1aSopenharmony_ci                s->shift           -= 8;
1334cabdff1aSopenharmony_ci                s->hybrid_maxclip >>= 8;
1335cabdff1aSopenharmony_ci                s->hybrid_minclip >>= 8;
1336cabdff1aSopenharmony_ci            }
1337cabdff1aSopenharmony_ci            break;
1338cabdff1aSopenharmony_ci        }
1339cabdff1aSopenharmony_ci        case WP_ID_FLOATINFO:
1340cabdff1aSopenharmony_ci            if (size != 4) {
1341cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR,
1342cabdff1aSopenharmony_ci                       "Invalid FLOATINFO, size = %i\n", size);
1343cabdff1aSopenharmony_ci                bytestream2_skip(&gb, ssize);
1344cabdff1aSopenharmony_ci                continue;
1345cabdff1aSopenharmony_ci            }
1346cabdff1aSopenharmony_ci            s->float_flag    = bytestream2_get_byte(&gb);
1347cabdff1aSopenharmony_ci            s->float_shift   = bytestream2_get_byte(&gb);
1348cabdff1aSopenharmony_ci            s->float_max_exp = bytestream2_get_byte(&gb);
1349cabdff1aSopenharmony_ci            if (s->float_shift > 31) {
1350cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR,
1351cabdff1aSopenharmony_ci                       "Invalid FLOATINFO, shift = %d (> 31)\n", s->float_shift);
1352cabdff1aSopenharmony_ci                s->float_shift = 0;
1353cabdff1aSopenharmony_ci                continue;
1354cabdff1aSopenharmony_ci            }
1355cabdff1aSopenharmony_ci            got_float        = 1;
1356cabdff1aSopenharmony_ci            bytestream2_skip(&gb, 1);
1357cabdff1aSopenharmony_ci            break;
1358cabdff1aSopenharmony_ci        case WP_ID_DATA:
1359cabdff1aSopenharmony_ci            if ((ret = init_get_bits8(&s->gb, gb.buffer, size)) < 0)
1360cabdff1aSopenharmony_ci                return ret;
1361cabdff1aSopenharmony_ci            bytestream2_skip(&gb, size);
1362cabdff1aSopenharmony_ci            got_pcm      = 1;
1363cabdff1aSopenharmony_ci            break;
1364cabdff1aSopenharmony_ci        case WP_ID_DSD_DATA:
1365cabdff1aSopenharmony_ci            if (size < 2) {
1366cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "Invalid DSD_DATA, size = %i\n",
1367cabdff1aSopenharmony_ci                       size);
1368cabdff1aSopenharmony_ci                bytestream2_skip(&gb, ssize);
1369cabdff1aSopenharmony_ci                continue;
1370cabdff1aSopenharmony_ci            }
1371cabdff1aSopenharmony_ci            rate_x = bytestream2_get_byte(&gb);
1372cabdff1aSopenharmony_ci            if (rate_x > 30)
1373cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1374cabdff1aSopenharmony_ci            rate_x = 1 << rate_x;
1375cabdff1aSopenharmony_ci            dsd_mode = bytestream2_get_byte(&gb);
1376cabdff1aSopenharmony_ci            if (dsd_mode && dsd_mode != 1 && dsd_mode != 3) {
1377cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "Invalid DSD encoding mode: %d\n",
1378cabdff1aSopenharmony_ci                    dsd_mode);
1379cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1380cabdff1aSopenharmony_ci            }
1381cabdff1aSopenharmony_ci            bytestream2_init(&s->gbyte, gb.buffer, size-2);
1382cabdff1aSopenharmony_ci            bytestream2_skip(&gb, size-2);
1383cabdff1aSopenharmony_ci            got_dsd      = 1;
1384cabdff1aSopenharmony_ci            break;
1385cabdff1aSopenharmony_ci        case WP_ID_EXTRABITS:
1386cabdff1aSopenharmony_ci            if (size <= 4) {
1387cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "Invalid EXTRABITS, size = %i\n",
1388cabdff1aSopenharmony_ci                       size);
1389cabdff1aSopenharmony_ci                bytestream2_skip(&gb, size);
1390cabdff1aSopenharmony_ci                continue;
1391cabdff1aSopenharmony_ci            }
1392cabdff1aSopenharmony_ci            if ((ret = init_get_bits8(&s->gb_extra_bits, gb.buffer, size)) < 0)
1393cabdff1aSopenharmony_ci                return ret;
1394cabdff1aSopenharmony_ci            s->crc_extra_bits  = get_bits_long(&s->gb_extra_bits, 32);
1395cabdff1aSopenharmony_ci            bytestream2_skip(&gb, size);
1396cabdff1aSopenharmony_ci            s->got_extra_bits  = 1;
1397cabdff1aSopenharmony_ci            break;
1398cabdff1aSopenharmony_ci        case WP_ID_CHANINFO:
1399cabdff1aSopenharmony_ci            if (size <= 1) {
1400cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR,
1401cabdff1aSopenharmony_ci                       "Insufficient channel information\n");
1402cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1403cabdff1aSopenharmony_ci            }
1404cabdff1aSopenharmony_ci            chan = bytestream2_get_byte(&gb);
1405cabdff1aSopenharmony_ci            switch (size - 2) {
1406cabdff1aSopenharmony_ci            case 0:
1407cabdff1aSopenharmony_ci                chmask = bytestream2_get_byte(&gb);
1408cabdff1aSopenharmony_ci                break;
1409cabdff1aSopenharmony_ci            case 1:
1410cabdff1aSopenharmony_ci                chmask = bytestream2_get_le16(&gb);
1411cabdff1aSopenharmony_ci                break;
1412cabdff1aSopenharmony_ci            case 2:
1413cabdff1aSopenharmony_ci                chmask = bytestream2_get_le24(&gb);
1414cabdff1aSopenharmony_ci                break;
1415cabdff1aSopenharmony_ci            case 3:
1416cabdff1aSopenharmony_ci                chmask = bytestream2_get_le32(&gb);
1417cabdff1aSopenharmony_ci                break;
1418cabdff1aSopenharmony_ci            case 4:
1419cabdff1aSopenharmony_ci                size = bytestream2_get_byte(&gb);
1420cabdff1aSopenharmony_ci                chan  |= (bytestream2_get_byte(&gb) & 0xF) << 8;
1421cabdff1aSopenharmony_ci                chan  += 1;
1422cabdff1aSopenharmony_ci                if (avctx->ch_layout.nb_channels != chan)
1423cabdff1aSopenharmony_ci                    av_log(avctx, AV_LOG_WARNING, "%i channels signalled"
1424cabdff1aSopenharmony_ci                           " instead of %i.\n", chan, avctx->ch_layout.nb_channels);
1425cabdff1aSopenharmony_ci                chmask = bytestream2_get_le24(&gb);
1426cabdff1aSopenharmony_ci                break;
1427cabdff1aSopenharmony_ci            case 5:
1428cabdff1aSopenharmony_ci                size = bytestream2_get_byte(&gb);
1429cabdff1aSopenharmony_ci                chan  |= (bytestream2_get_byte(&gb) & 0xF) << 8;
1430cabdff1aSopenharmony_ci                chan  += 1;
1431cabdff1aSopenharmony_ci                if (avctx->ch_layout.nb_channels != chan)
1432cabdff1aSopenharmony_ci                    av_log(avctx, AV_LOG_WARNING, "%i channels signalled"
1433cabdff1aSopenharmony_ci                           " instead of %i.\n", chan, avctx->ch_layout.nb_channels);
1434cabdff1aSopenharmony_ci                chmask = bytestream2_get_le32(&gb);
1435cabdff1aSopenharmony_ci                break;
1436cabdff1aSopenharmony_ci            default:
1437cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "Invalid channel info size %d\n",
1438cabdff1aSopenharmony_ci                       size);
1439cabdff1aSopenharmony_ci            }
1440cabdff1aSopenharmony_ci            break;
1441cabdff1aSopenharmony_ci        case WP_ID_SAMPLE_RATE:
1442cabdff1aSopenharmony_ci            if (size != 3) {
1443cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "Invalid custom sample rate.\n");
1444cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1445cabdff1aSopenharmony_ci            }
1446cabdff1aSopenharmony_ci            sample_rate = bytestream2_get_le24(&gb);
1447cabdff1aSopenharmony_ci            break;
1448cabdff1aSopenharmony_ci        default:
1449cabdff1aSopenharmony_ci            bytestream2_skip(&gb, size);
1450cabdff1aSopenharmony_ci        }
1451cabdff1aSopenharmony_ci        if (id & WP_IDF_ODD)
1452cabdff1aSopenharmony_ci            bytestream2_skip(&gb, 1);
1453cabdff1aSopenharmony_ci    }
1454cabdff1aSopenharmony_ci
1455cabdff1aSopenharmony_ci    if (got_pcm) {
1456cabdff1aSopenharmony_ci        if (!got_terms) {
1457cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
1458cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1459cabdff1aSopenharmony_ci        }
1460cabdff1aSopenharmony_ci        if (!got_weights) {
1461cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
1462cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1463cabdff1aSopenharmony_ci        }
1464cabdff1aSopenharmony_ci        if (!got_samples) {
1465cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
1466cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1467cabdff1aSopenharmony_ci        }
1468cabdff1aSopenharmony_ci        if (!got_entropy) {
1469cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
1470cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1471cabdff1aSopenharmony_ci        }
1472cabdff1aSopenharmony_ci        if (s->hybrid && !got_hybrid) {
1473cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n");
1474cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1475cabdff1aSopenharmony_ci        }
1476cabdff1aSopenharmony_ci        if (!got_float && sample_fmt == AV_SAMPLE_FMT_FLTP) {
1477cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "Float information not found\n");
1478cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1479cabdff1aSopenharmony_ci        }
1480cabdff1aSopenharmony_ci        if (s->got_extra_bits && sample_fmt != AV_SAMPLE_FMT_FLTP) {
1481cabdff1aSopenharmony_ci            const int size   = get_bits_left(&s->gb_extra_bits);
1482cabdff1aSopenharmony_ci            const int wanted = s->samples * s->extra_bits << s->stereo_in;
1483cabdff1aSopenharmony_ci            if (size < wanted) {
1484cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n");
1485cabdff1aSopenharmony_ci                s->got_extra_bits = 0;
1486cabdff1aSopenharmony_ci            }
1487cabdff1aSopenharmony_ci        }
1488cabdff1aSopenharmony_ci    }
1489cabdff1aSopenharmony_ci
1490cabdff1aSopenharmony_ci    if (!got_pcm && !got_dsd) {
1491cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
1492cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1493cabdff1aSopenharmony_ci    }
1494cabdff1aSopenharmony_ci
1495cabdff1aSopenharmony_ci    if ((got_pcm && wc->modulation != MODULATION_PCM) ||
1496cabdff1aSopenharmony_ci        (got_dsd && wc->modulation != MODULATION_DSD)) {
1497cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "Invalid PCM/DSD mix encountered\n");
1498cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1499cabdff1aSopenharmony_ci    }
1500cabdff1aSopenharmony_ci
1501cabdff1aSopenharmony_ci    if (!wc->ch_offset) {
1502cabdff1aSopenharmony_ci        AVChannelLayout new_ch_layout = { 0 };
1503cabdff1aSopenharmony_ci        int new_samplerate;
1504cabdff1aSopenharmony_ci        int sr = (s->frame_flags >> 23) & 0xf;
1505cabdff1aSopenharmony_ci        if (sr == 0xf) {
1506cabdff1aSopenharmony_ci            if (!sample_rate) {
1507cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "Custom sample rate missing.\n");
1508cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1509cabdff1aSopenharmony_ci            }
1510cabdff1aSopenharmony_ci            new_samplerate = sample_rate;
1511cabdff1aSopenharmony_ci        } else
1512cabdff1aSopenharmony_ci            new_samplerate = wv_rates[sr];
1513cabdff1aSopenharmony_ci
1514cabdff1aSopenharmony_ci        if (new_samplerate * (uint64_t)rate_x > INT_MAX)
1515cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1516cabdff1aSopenharmony_ci        new_samplerate *= rate_x;
1517cabdff1aSopenharmony_ci
1518cabdff1aSopenharmony_ci        if (multiblock) {
1519cabdff1aSopenharmony_ci            if (chmask) {
1520cabdff1aSopenharmony_ci                av_channel_layout_from_mask(&new_ch_layout, chmask);
1521cabdff1aSopenharmony_ci                if (chan && new_ch_layout.nb_channels != chan) {
1522cabdff1aSopenharmony_ci                    av_log(avctx, AV_LOG_ERROR, "Channel mask does not match the channel count\n");
1523cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
1524cabdff1aSopenharmony_ci                }
1525cabdff1aSopenharmony_ci            } else {
1526cabdff1aSopenharmony_ci                ret = av_channel_layout_copy(&new_ch_layout, &avctx->ch_layout);
1527cabdff1aSopenharmony_ci                if (ret < 0) {
1528cabdff1aSopenharmony_ci                    av_log(avctx, AV_LOG_ERROR, "Error copying channel layout\n");
1529cabdff1aSopenharmony_ci                    return ret;
1530cabdff1aSopenharmony_ci                }
1531cabdff1aSopenharmony_ci            }
1532cabdff1aSopenharmony_ci        } else {
1533cabdff1aSopenharmony_ci            av_channel_layout_default(&new_ch_layout, s->stereo + 1);
1534cabdff1aSopenharmony_ci        }
1535cabdff1aSopenharmony_ci
1536cabdff1aSopenharmony_ci        /* clear DSD state if stream properties change */
1537cabdff1aSopenharmony_ci        if (new_ch_layout.nb_channels != wc->dsd_channels ||
1538cabdff1aSopenharmony_ci            av_channel_layout_compare(&new_ch_layout, &avctx->ch_layout) ||
1539cabdff1aSopenharmony_ci            new_samplerate != avctx->sample_rate    ||
1540cabdff1aSopenharmony_ci            !!got_dsd      != !!wc->dsdctx) {
1541cabdff1aSopenharmony_ci            ret = wv_dsd_reset(wc, got_dsd ? new_ch_layout.nb_channels : 0);
1542cabdff1aSopenharmony_ci            if (ret < 0) {
1543cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "Error reinitializing the DSD context\n");
1544cabdff1aSopenharmony_ci                return ret;
1545cabdff1aSopenharmony_ci            }
1546cabdff1aSopenharmony_ci            ff_thread_release_ext_buffer(avctx, &wc->curr_frame);
1547cabdff1aSopenharmony_ci        }
1548cabdff1aSopenharmony_ci        av_channel_layout_copy(&avctx->ch_layout, &new_ch_layout);
1549cabdff1aSopenharmony_ci        avctx->sample_rate         = new_samplerate;
1550cabdff1aSopenharmony_ci        avctx->sample_fmt          = sample_fmt;
1551cabdff1aSopenharmony_ci        avctx->bits_per_raw_sample = orig_bpp;
1552cabdff1aSopenharmony_ci
1553cabdff1aSopenharmony_ci        ff_thread_release_ext_buffer(avctx, &wc->prev_frame);
1554cabdff1aSopenharmony_ci        FFSWAP(ThreadFrame, wc->curr_frame, wc->prev_frame);
1555cabdff1aSopenharmony_ci
1556cabdff1aSopenharmony_ci        /* get output buffer */
1557cabdff1aSopenharmony_ci        wc->curr_frame.f->nb_samples = s->samples;
1558cabdff1aSopenharmony_ci        ret = ff_thread_get_ext_buffer(avctx, &wc->curr_frame,
1559cabdff1aSopenharmony_ci                                       AV_GET_BUFFER_FLAG_REF);
1560cabdff1aSopenharmony_ci        if (ret < 0)
1561cabdff1aSopenharmony_ci            return ret;
1562cabdff1aSopenharmony_ci
1563cabdff1aSopenharmony_ci        wc->frame = wc->curr_frame.f;
1564cabdff1aSopenharmony_ci        ff_thread_finish_setup(avctx);
1565cabdff1aSopenharmony_ci    }
1566cabdff1aSopenharmony_ci
1567cabdff1aSopenharmony_ci    if (wc->ch_offset + s->stereo >= avctx->ch_layout.nb_channels) {
1568cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_WARNING, "Too many channels coded in a packet.\n");
1569cabdff1aSopenharmony_ci        return ((avctx->err_recognition & AV_EF_EXPLODE) || !wc->ch_offset) ? AVERROR_INVALIDDATA : 0;
1570cabdff1aSopenharmony_ci    }
1571cabdff1aSopenharmony_ci
1572cabdff1aSopenharmony_ci    samples_l = wc->frame->extended_data[wc->ch_offset];
1573cabdff1aSopenharmony_ci    if (s->stereo)
1574cabdff1aSopenharmony_ci        samples_r = wc->frame->extended_data[wc->ch_offset + 1];
1575cabdff1aSopenharmony_ci
1576cabdff1aSopenharmony_ci    wc->ch_offset += 1 + s->stereo;
1577cabdff1aSopenharmony_ci
1578cabdff1aSopenharmony_ci    if (s->stereo_in) {
1579cabdff1aSopenharmony_ci        if (got_dsd) {
1580cabdff1aSopenharmony_ci            if (dsd_mode == 3) {
1581cabdff1aSopenharmony_ci                ret = wv_unpack_dsd_high(s, samples_l, samples_r);
1582cabdff1aSopenharmony_ci            } else if (dsd_mode == 1) {
1583cabdff1aSopenharmony_ci                ret = wv_unpack_dsd_fast(s, samples_l, samples_r);
1584cabdff1aSopenharmony_ci            } else {
1585cabdff1aSopenharmony_ci                ret = wv_unpack_dsd_copy(s, samples_l, samples_r);
1586cabdff1aSopenharmony_ci            }
1587cabdff1aSopenharmony_ci        } else {
1588cabdff1aSopenharmony_ci            ret = wv_unpack_stereo(s, &s->gb, samples_l, samples_r, avctx->sample_fmt);
1589cabdff1aSopenharmony_ci        }
1590cabdff1aSopenharmony_ci        if (ret < 0)
1591cabdff1aSopenharmony_ci            return ret;
1592cabdff1aSopenharmony_ci    } else {
1593cabdff1aSopenharmony_ci        if (got_dsd) {
1594cabdff1aSopenharmony_ci            if (dsd_mode == 3) {
1595cabdff1aSopenharmony_ci                ret = wv_unpack_dsd_high(s, samples_l, NULL);
1596cabdff1aSopenharmony_ci            } else if (dsd_mode == 1) {
1597cabdff1aSopenharmony_ci                ret = wv_unpack_dsd_fast(s, samples_l, NULL);
1598cabdff1aSopenharmony_ci            } else {
1599cabdff1aSopenharmony_ci                ret = wv_unpack_dsd_copy(s, samples_l, NULL);
1600cabdff1aSopenharmony_ci            }
1601cabdff1aSopenharmony_ci        } else {
1602cabdff1aSopenharmony_ci            ret = wv_unpack_mono(s, &s->gb, samples_l, avctx->sample_fmt);
1603cabdff1aSopenharmony_ci        }
1604cabdff1aSopenharmony_ci        if (ret < 0)
1605cabdff1aSopenharmony_ci            return ret;
1606cabdff1aSopenharmony_ci
1607cabdff1aSopenharmony_ci        if (s->stereo)
1608cabdff1aSopenharmony_ci            memcpy(samples_r, samples_l, bpp * s->samples);
1609cabdff1aSopenharmony_ci    }
1610cabdff1aSopenharmony_ci
1611cabdff1aSopenharmony_ci    return 0;
1612cabdff1aSopenharmony_ci}
1613cabdff1aSopenharmony_ci
1614cabdff1aSopenharmony_cistatic void wavpack_decode_flush(AVCodecContext *avctx)
1615cabdff1aSopenharmony_ci{
1616cabdff1aSopenharmony_ci    WavpackContext *s = avctx->priv_data;
1617cabdff1aSopenharmony_ci
1618cabdff1aSopenharmony_ci    wv_dsd_reset(s, 0);
1619cabdff1aSopenharmony_ci}
1620cabdff1aSopenharmony_ci
1621cabdff1aSopenharmony_cistatic int dsd_channel(AVCodecContext *avctx, void *frmptr, int jobnr, int threadnr)
1622cabdff1aSopenharmony_ci{
1623cabdff1aSopenharmony_ci    WavpackContext *s  = avctx->priv_data;
1624cabdff1aSopenharmony_ci    AVFrame *frame = frmptr;
1625cabdff1aSopenharmony_ci
1626cabdff1aSopenharmony_ci    ff_dsd2pcm_translate (&s->dsdctx [jobnr], s->samples, 0,
1627cabdff1aSopenharmony_ci        (uint8_t *)frame->extended_data[jobnr], 4,
1628cabdff1aSopenharmony_ci        (float *)frame->extended_data[jobnr], 1);
1629cabdff1aSopenharmony_ci
1630cabdff1aSopenharmony_ci    return 0;
1631cabdff1aSopenharmony_ci}
1632cabdff1aSopenharmony_ci
1633cabdff1aSopenharmony_cistatic int wavpack_decode_frame(AVCodecContext *avctx, AVFrame *rframe,
1634cabdff1aSopenharmony_ci                                int *got_frame_ptr, AVPacket *avpkt)
1635cabdff1aSopenharmony_ci{
1636cabdff1aSopenharmony_ci    WavpackContext *s  = avctx->priv_data;
1637cabdff1aSopenharmony_ci    const uint8_t *buf = avpkt->data;
1638cabdff1aSopenharmony_ci    int buf_size       = avpkt->size;
1639cabdff1aSopenharmony_ci    int frame_size, ret, frame_flags;
1640cabdff1aSopenharmony_ci
1641cabdff1aSopenharmony_ci    if (avpkt->size <= WV_HEADER_SIZE)
1642cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1643cabdff1aSopenharmony_ci
1644cabdff1aSopenharmony_ci    s->frame     = NULL;
1645cabdff1aSopenharmony_ci    s->block     = 0;
1646cabdff1aSopenharmony_ci    s->ch_offset = 0;
1647cabdff1aSopenharmony_ci
1648cabdff1aSopenharmony_ci    /* determine number of samples */
1649cabdff1aSopenharmony_ci    s->samples  = AV_RL32(buf + 20);
1650cabdff1aSopenharmony_ci    frame_flags = AV_RL32(buf + 24);
1651cabdff1aSopenharmony_ci    if (s->samples <= 0 || s->samples > WV_MAX_SAMPLES) {
1652cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Invalid number of samples: %d\n",
1653cabdff1aSopenharmony_ci               s->samples);
1654cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1655cabdff1aSopenharmony_ci    }
1656cabdff1aSopenharmony_ci
1657cabdff1aSopenharmony_ci    s->modulation = (frame_flags & WV_DSD_DATA) ? MODULATION_DSD : MODULATION_PCM;
1658cabdff1aSopenharmony_ci
1659cabdff1aSopenharmony_ci    while (buf_size > WV_HEADER_SIZE) {
1660cabdff1aSopenharmony_ci        frame_size = AV_RL32(buf + 4) - 12;
1661cabdff1aSopenharmony_ci        buf       += 20;
1662cabdff1aSopenharmony_ci        buf_size  -= 20;
1663cabdff1aSopenharmony_ci        if (frame_size <= 0 || frame_size > buf_size) {
1664cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR,
1665cabdff1aSopenharmony_ci                   "Block %d has invalid size (size %d vs. %d bytes left)\n",
1666cabdff1aSopenharmony_ci                   s->block, frame_size, buf_size);
1667cabdff1aSopenharmony_ci            ret = AVERROR_INVALIDDATA;
1668cabdff1aSopenharmony_ci            goto error;
1669cabdff1aSopenharmony_ci        }
1670cabdff1aSopenharmony_ci        if ((ret = wavpack_decode_block(avctx, s->block, buf, frame_size)) < 0)
1671cabdff1aSopenharmony_ci            goto error;
1672cabdff1aSopenharmony_ci        s->block++;
1673cabdff1aSopenharmony_ci        buf      += frame_size;
1674cabdff1aSopenharmony_ci        buf_size -= frame_size;
1675cabdff1aSopenharmony_ci    }
1676cabdff1aSopenharmony_ci
1677cabdff1aSopenharmony_ci    if (s->ch_offset != avctx->ch_layout.nb_channels) {
1678cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Not enough channels coded in a packet.\n");
1679cabdff1aSopenharmony_ci        ret = AVERROR_INVALIDDATA;
1680cabdff1aSopenharmony_ci        goto error;
1681cabdff1aSopenharmony_ci    }
1682cabdff1aSopenharmony_ci
1683cabdff1aSopenharmony_ci    ff_thread_await_progress(&s->prev_frame, INT_MAX, 0);
1684cabdff1aSopenharmony_ci    ff_thread_release_ext_buffer(avctx, &s->prev_frame);
1685cabdff1aSopenharmony_ci
1686cabdff1aSopenharmony_ci    if (s->modulation == MODULATION_DSD)
1687cabdff1aSopenharmony_ci        avctx->execute2(avctx, dsd_channel, s->frame, NULL, avctx->ch_layout.nb_channels);
1688cabdff1aSopenharmony_ci
1689cabdff1aSopenharmony_ci    ff_thread_report_progress(&s->curr_frame, INT_MAX, 0);
1690cabdff1aSopenharmony_ci
1691cabdff1aSopenharmony_ci    if ((ret = av_frame_ref(rframe, s->frame)) < 0)
1692cabdff1aSopenharmony_ci        return ret;
1693cabdff1aSopenharmony_ci
1694cabdff1aSopenharmony_ci    *got_frame_ptr = 1;
1695cabdff1aSopenharmony_ci
1696cabdff1aSopenharmony_ci    return avpkt->size;
1697cabdff1aSopenharmony_ci
1698cabdff1aSopenharmony_cierror:
1699cabdff1aSopenharmony_ci    if (s->frame) {
1700cabdff1aSopenharmony_ci        ff_thread_await_progress(&s->prev_frame, INT_MAX, 0);
1701cabdff1aSopenharmony_ci        ff_thread_release_ext_buffer(avctx, &s->prev_frame);
1702cabdff1aSopenharmony_ci        ff_thread_report_progress(&s->curr_frame, INT_MAX, 0);
1703cabdff1aSopenharmony_ci    }
1704cabdff1aSopenharmony_ci
1705cabdff1aSopenharmony_ci    return ret;
1706cabdff1aSopenharmony_ci}
1707cabdff1aSopenharmony_ci
1708cabdff1aSopenharmony_ciconst FFCodec ff_wavpack_decoder = {
1709cabdff1aSopenharmony_ci    .p.name         = "wavpack",
1710cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("WavPack"),
1711cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_AUDIO,
1712cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_WAVPACK,
1713cabdff1aSopenharmony_ci    .priv_data_size = sizeof(WavpackContext),
1714cabdff1aSopenharmony_ci    .init           = wavpack_decode_init,
1715cabdff1aSopenharmony_ci    .close          = wavpack_decode_end,
1716cabdff1aSopenharmony_ci    FF_CODEC_DECODE_CB(wavpack_decode_frame),
1717cabdff1aSopenharmony_ci    .flush          = wavpack_decode_flush,
1718cabdff1aSopenharmony_ci    .update_thread_context = ONLY_IF_THREADS_ENABLED(update_thread_context),
1719cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
1720cabdff1aSopenharmony_ci                      AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_CHANNEL_CONF,
1721cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP |
1722cabdff1aSopenharmony_ci                      FF_CODEC_CAP_ALLOCATE_PROGRESS,
1723cabdff1aSopenharmony_ci};
1724