1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Monkey's Audio lossless audio decoder
3cabdff1aSopenharmony_ci * Copyright (c) 2007 Benjamin Zores <ben@geexbox.org>
4cabdff1aSopenharmony_ci *  based upon libdemac from Dave Chapman.
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 <inttypes.h>
24cabdff1aSopenharmony_ci
25cabdff1aSopenharmony_ci#include "libavutil/avassert.h"
26cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h"
27cabdff1aSopenharmony_ci#include "libavutil/crc.h"
28cabdff1aSopenharmony_ci#include "libavutil/opt.h"
29cabdff1aSopenharmony_ci#include "lossless_audiodsp.h"
30cabdff1aSopenharmony_ci#include "avcodec.h"
31cabdff1aSopenharmony_ci#include "bswapdsp.h"
32cabdff1aSopenharmony_ci#include "bytestream.h"
33cabdff1aSopenharmony_ci#include "codec_internal.h"
34cabdff1aSopenharmony_ci#include "internal.h"
35cabdff1aSopenharmony_ci#include "get_bits.h"
36cabdff1aSopenharmony_ci#include "unary.h"
37cabdff1aSopenharmony_ci
38cabdff1aSopenharmony_ci/**
39cabdff1aSopenharmony_ci * @file
40cabdff1aSopenharmony_ci * Monkey's Audio lossless audio decoder
41cabdff1aSopenharmony_ci */
42cabdff1aSopenharmony_ci
43cabdff1aSopenharmony_ci#define MAX_CHANNELS        2
44cabdff1aSopenharmony_ci#define MAX_BYTESPERSAMPLE  3
45cabdff1aSopenharmony_ci
46cabdff1aSopenharmony_ci#define APE_FRAMECODE_MONO_SILENCE    1
47cabdff1aSopenharmony_ci#define APE_FRAMECODE_STEREO_SILENCE  3
48cabdff1aSopenharmony_ci#define APE_FRAMECODE_PSEUDO_STEREO   4
49cabdff1aSopenharmony_ci
50cabdff1aSopenharmony_ci#define HISTORY_SIZE 512
51cabdff1aSopenharmony_ci#define PREDICTOR_ORDER 8
52cabdff1aSopenharmony_ci/** Total size of all predictor histories */
53cabdff1aSopenharmony_ci#define PREDICTOR_SIZE 50
54cabdff1aSopenharmony_ci
55cabdff1aSopenharmony_ci#define YDELAYA (18 + PREDICTOR_ORDER*4)
56cabdff1aSopenharmony_ci#define YDELAYB (18 + PREDICTOR_ORDER*3)
57cabdff1aSopenharmony_ci#define XDELAYA (18 + PREDICTOR_ORDER*2)
58cabdff1aSopenharmony_ci#define XDELAYB (18 + PREDICTOR_ORDER)
59cabdff1aSopenharmony_ci
60cabdff1aSopenharmony_ci#define YADAPTCOEFFSA 18
61cabdff1aSopenharmony_ci#define XADAPTCOEFFSA 14
62cabdff1aSopenharmony_ci#define YADAPTCOEFFSB 10
63cabdff1aSopenharmony_ci#define XADAPTCOEFFSB 5
64cabdff1aSopenharmony_ci
65cabdff1aSopenharmony_ci/**
66cabdff1aSopenharmony_ci * Possible compression levels
67cabdff1aSopenharmony_ci * @{
68cabdff1aSopenharmony_ci */
69cabdff1aSopenharmony_cienum APECompressionLevel {
70cabdff1aSopenharmony_ci    COMPRESSION_LEVEL_FAST       = 1000,
71cabdff1aSopenharmony_ci    COMPRESSION_LEVEL_NORMAL     = 2000,
72cabdff1aSopenharmony_ci    COMPRESSION_LEVEL_HIGH       = 3000,
73cabdff1aSopenharmony_ci    COMPRESSION_LEVEL_EXTRA_HIGH = 4000,
74cabdff1aSopenharmony_ci    COMPRESSION_LEVEL_INSANE     = 5000
75cabdff1aSopenharmony_ci};
76cabdff1aSopenharmony_ci/** @} */
77cabdff1aSopenharmony_ci
78cabdff1aSopenharmony_ci#define APE_FILTER_LEVELS 3
79cabdff1aSopenharmony_ci
80cabdff1aSopenharmony_ci/** Filter orders depending on compression level */
81cabdff1aSopenharmony_cistatic const uint16_t ape_filter_orders[5][APE_FILTER_LEVELS] = {
82cabdff1aSopenharmony_ci    {  0,   0,    0 },
83cabdff1aSopenharmony_ci    { 16,   0,    0 },
84cabdff1aSopenharmony_ci    { 64,   0,    0 },
85cabdff1aSopenharmony_ci    { 32, 256,    0 },
86cabdff1aSopenharmony_ci    { 16, 256, 1280 }
87cabdff1aSopenharmony_ci};
88cabdff1aSopenharmony_ci
89cabdff1aSopenharmony_ci/** Filter fraction bits depending on compression level */
90cabdff1aSopenharmony_cistatic const uint8_t ape_filter_fracbits[5][APE_FILTER_LEVELS] = {
91cabdff1aSopenharmony_ci    {  0,  0,  0 },
92cabdff1aSopenharmony_ci    { 11,  0,  0 },
93cabdff1aSopenharmony_ci    { 11,  0,  0 },
94cabdff1aSopenharmony_ci    { 10, 13,  0 },
95cabdff1aSopenharmony_ci    { 11, 13, 15 }
96cabdff1aSopenharmony_ci};
97cabdff1aSopenharmony_ci
98cabdff1aSopenharmony_ci
99cabdff1aSopenharmony_ci/** Filters applied to the decoded data */
100cabdff1aSopenharmony_citypedef struct APEFilter {
101cabdff1aSopenharmony_ci    int16_t *coeffs;        ///< actual coefficients used in filtering
102cabdff1aSopenharmony_ci    int16_t *adaptcoeffs;   ///< adaptive filter coefficients used for correcting of actual filter coefficients
103cabdff1aSopenharmony_ci    int16_t *historybuffer; ///< filter memory
104cabdff1aSopenharmony_ci    int16_t *delay;         ///< filtered values
105cabdff1aSopenharmony_ci
106cabdff1aSopenharmony_ci    uint32_t avg;
107cabdff1aSopenharmony_ci} APEFilter;
108cabdff1aSopenharmony_ci
109cabdff1aSopenharmony_citypedef struct APERice {
110cabdff1aSopenharmony_ci    uint32_t k;
111cabdff1aSopenharmony_ci    uint32_t ksum;
112cabdff1aSopenharmony_ci} APERice;
113cabdff1aSopenharmony_ci
114cabdff1aSopenharmony_citypedef struct APERangecoder {
115cabdff1aSopenharmony_ci    uint32_t low;           ///< low end of interval
116cabdff1aSopenharmony_ci    uint32_t range;         ///< length of interval
117cabdff1aSopenharmony_ci    uint32_t help;          ///< bytes_to_follow resp. intermediate value
118cabdff1aSopenharmony_ci    unsigned int buffer;    ///< buffer for input/output
119cabdff1aSopenharmony_ci} APERangecoder;
120cabdff1aSopenharmony_ci
121cabdff1aSopenharmony_ci/** Filter histories */
122cabdff1aSopenharmony_citypedef struct APEPredictor {
123cabdff1aSopenharmony_ci    int32_t *buf;
124cabdff1aSopenharmony_ci
125cabdff1aSopenharmony_ci    int32_t lastA[2];
126cabdff1aSopenharmony_ci
127cabdff1aSopenharmony_ci    int32_t filterA[2];
128cabdff1aSopenharmony_ci    int32_t filterB[2];
129cabdff1aSopenharmony_ci
130cabdff1aSopenharmony_ci    uint32_t coeffsA[2][4];  ///< adaption coefficients
131cabdff1aSopenharmony_ci    uint32_t coeffsB[2][5];  ///< adaption coefficients
132cabdff1aSopenharmony_ci    int32_t historybuffer[HISTORY_SIZE + PREDICTOR_SIZE];
133cabdff1aSopenharmony_ci
134cabdff1aSopenharmony_ci    unsigned int sample_pos;
135cabdff1aSopenharmony_ci} APEPredictor;
136cabdff1aSopenharmony_ci
137cabdff1aSopenharmony_citypedef struct APEPredictor64 {
138cabdff1aSopenharmony_ci    int64_t *buf;
139cabdff1aSopenharmony_ci
140cabdff1aSopenharmony_ci    int64_t lastA[2];
141cabdff1aSopenharmony_ci
142cabdff1aSopenharmony_ci    int64_t filterA[2];
143cabdff1aSopenharmony_ci    int64_t filterB[2];
144cabdff1aSopenharmony_ci
145cabdff1aSopenharmony_ci    uint64_t coeffsA[2][4];  ///< adaption coefficients
146cabdff1aSopenharmony_ci    uint64_t coeffsB[2][5];  ///< adaption coefficients
147cabdff1aSopenharmony_ci    int64_t historybuffer[HISTORY_SIZE + PREDICTOR_SIZE];
148cabdff1aSopenharmony_ci
149cabdff1aSopenharmony_ci    unsigned int sample_pos;
150cabdff1aSopenharmony_ci} APEPredictor64;
151cabdff1aSopenharmony_ci
152cabdff1aSopenharmony_ci/** Decoder context */
153cabdff1aSopenharmony_citypedef struct APEContext {
154cabdff1aSopenharmony_ci    AVClass *class;                          ///< class for AVOptions
155cabdff1aSopenharmony_ci    AVCodecContext *avctx;
156cabdff1aSopenharmony_ci    BswapDSPContext bdsp;
157cabdff1aSopenharmony_ci    LLAudDSPContext adsp;
158cabdff1aSopenharmony_ci    int channels;
159cabdff1aSopenharmony_ci    int samples;                             ///< samples left to decode in current frame
160cabdff1aSopenharmony_ci    int bps;
161cabdff1aSopenharmony_ci
162cabdff1aSopenharmony_ci    int fileversion;                         ///< codec version, very important in decoding process
163cabdff1aSopenharmony_ci    int compression_level;                   ///< compression levels
164cabdff1aSopenharmony_ci    int fset;                                ///< which filter set to use (calculated from compression level)
165cabdff1aSopenharmony_ci    int flags;                               ///< global decoder flags
166cabdff1aSopenharmony_ci
167cabdff1aSopenharmony_ci    uint32_t CRC;                            ///< signalled frame CRC
168cabdff1aSopenharmony_ci    uint32_t CRC_state;                      ///< accumulated CRC
169cabdff1aSopenharmony_ci    int frameflags;                          ///< frame flags
170cabdff1aSopenharmony_ci    APEPredictor predictor;                  ///< predictor used for final reconstruction
171cabdff1aSopenharmony_ci    APEPredictor64 predictor64;              ///< 64bit predictor used for final reconstruction
172cabdff1aSopenharmony_ci
173cabdff1aSopenharmony_ci    int32_t *decoded_buffer;
174cabdff1aSopenharmony_ci    int decoded_size;
175cabdff1aSopenharmony_ci    int32_t *decoded[MAX_CHANNELS];          ///< decoded data for each channel
176cabdff1aSopenharmony_ci    int blocks_per_loop;                     ///< maximum number of samples to decode for each call
177cabdff1aSopenharmony_ci
178cabdff1aSopenharmony_ci    int16_t* filterbuf[APE_FILTER_LEVELS];   ///< filter memory
179cabdff1aSopenharmony_ci
180cabdff1aSopenharmony_ci    APERangecoder rc;                        ///< rangecoder used to decode actual values
181cabdff1aSopenharmony_ci    APERice riceX;                           ///< rice code parameters for the second channel
182cabdff1aSopenharmony_ci    APERice riceY;                           ///< rice code parameters for the first channel
183cabdff1aSopenharmony_ci    APEFilter filters[APE_FILTER_LEVELS][2]; ///< filters used for reconstruction
184cabdff1aSopenharmony_ci    GetBitContext gb;
185cabdff1aSopenharmony_ci
186cabdff1aSopenharmony_ci    uint8_t *data;                           ///< current frame data
187cabdff1aSopenharmony_ci    uint8_t *data_end;                       ///< frame data end
188cabdff1aSopenharmony_ci    int data_size;                           ///< frame data allocated size
189cabdff1aSopenharmony_ci    const uint8_t *ptr;                      ///< current position in frame data
190cabdff1aSopenharmony_ci
191cabdff1aSopenharmony_ci    int error;
192cabdff1aSopenharmony_ci
193cabdff1aSopenharmony_ci    void (*entropy_decode_mono)(struct APEContext *ctx, int blockstodecode);
194cabdff1aSopenharmony_ci    void (*entropy_decode_stereo)(struct APEContext *ctx, int blockstodecode);
195cabdff1aSopenharmony_ci    void (*predictor_decode_mono)(struct APEContext *ctx, int count);
196cabdff1aSopenharmony_ci    void (*predictor_decode_stereo)(struct APEContext *ctx, int count);
197cabdff1aSopenharmony_ci} APEContext;
198cabdff1aSopenharmony_ci
199cabdff1aSopenharmony_cistatic void ape_apply_filters(APEContext *ctx, int32_t *decoded0,
200cabdff1aSopenharmony_ci                              int32_t *decoded1, int count);
201cabdff1aSopenharmony_ci
202cabdff1aSopenharmony_cistatic void entropy_decode_mono_0000(APEContext *ctx, int blockstodecode);
203cabdff1aSopenharmony_cistatic void entropy_decode_stereo_0000(APEContext *ctx, int blockstodecode);
204cabdff1aSopenharmony_cistatic void entropy_decode_mono_3860(APEContext *ctx, int blockstodecode);
205cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3860(APEContext *ctx, int blockstodecode);
206cabdff1aSopenharmony_cistatic void entropy_decode_mono_3900(APEContext *ctx, int blockstodecode);
207cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3900(APEContext *ctx, int blockstodecode);
208cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3930(APEContext *ctx, int blockstodecode);
209cabdff1aSopenharmony_cistatic void entropy_decode_mono_3990(APEContext *ctx, int blockstodecode);
210cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3990(APEContext *ctx, int blockstodecode);
211cabdff1aSopenharmony_ci
212cabdff1aSopenharmony_cistatic void predictor_decode_mono_3800(APEContext *ctx, int count);
213cabdff1aSopenharmony_cistatic void predictor_decode_stereo_3800(APEContext *ctx, int count);
214cabdff1aSopenharmony_cistatic void predictor_decode_mono_3930(APEContext *ctx, int count);
215cabdff1aSopenharmony_cistatic void predictor_decode_stereo_3930(APEContext *ctx, int count);
216cabdff1aSopenharmony_cistatic void predictor_decode_mono_3950(APEContext *ctx, int count);
217cabdff1aSopenharmony_cistatic void predictor_decode_stereo_3950(APEContext *ctx, int count);
218cabdff1aSopenharmony_ci
219cabdff1aSopenharmony_cistatic av_cold int ape_decode_close(AVCodecContext *avctx)
220cabdff1aSopenharmony_ci{
221cabdff1aSopenharmony_ci    APEContext *s = avctx->priv_data;
222cabdff1aSopenharmony_ci    int i;
223cabdff1aSopenharmony_ci
224cabdff1aSopenharmony_ci    for (i = 0; i < APE_FILTER_LEVELS; i++)
225cabdff1aSopenharmony_ci        av_freep(&s->filterbuf[i]);
226cabdff1aSopenharmony_ci
227cabdff1aSopenharmony_ci    av_freep(&s->decoded_buffer);
228cabdff1aSopenharmony_ci    av_freep(&s->data);
229cabdff1aSopenharmony_ci    s->decoded_size = s->data_size = 0;
230cabdff1aSopenharmony_ci
231cabdff1aSopenharmony_ci    return 0;
232cabdff1aSopenharmony_ci}
233cabdff1aSopenharmony_ci
234cabdff1aSopenharmony_cistatic av_cold int ape_decode_init(AVCodecContext *avctx)
235cabdff1aSopenharmony_ci{
236cabdff1aSopenharmony_ci    APEContext *s = avctx->priv_data;
237cabdff1aSopenharmony_ci    int channels = avctx->ch_layout.nb_channels;
238cabdff1aSopenharmony_ci    int i;
239cabdff1aSopenharmony_ci
240cabdff1aSopenharmony_ci    if (avctx->extradata_size != 6) {
241cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Incorrect extradata\n");
242cabdff1aSopenharmony_ci        return AVERROR(EINVAL);
243cabdff1aSopenharmony_ci    }
244cabdff1aSopenharmony_ci    if (channels > 2) {
245cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Only mono and stereo is supported\n");
246cabdff1aSopenharmony_ci        return AVERROR(EINVAL);
247cabdff1aSopenharmony_ci    }
248cabdff1aSopenharmony_ci    avctx->bits_per_raw_sample =
249cabdff1aSopenharmony_ci    s->bps = avctx->bits_per_coded_sample;
250cabdff1aSopenharmony_ci    switch (s->bps) {
251cabdff1aSopenharmony_ci    case 8:
252cabdff1aSopenharmony_ci        avctx->sample_fmt = AV_SAMPLE_FMT_U8P;
253cabdff1aSopenharmony_ci        break;
254cabdff1aSopenharmony_ci    case 16:
255cabdff1aSopenharmony_ci        avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
256cabdff1aSopenharmony_ci        break;
257cabdff1aSopenharmony_ci    case 24:
258cabdff1aSopenharmony_ci        avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
259cabdff1aSopenharmony_ci        break;
260cabdff1aSopenharmony_ci    default:
261cabdff1aSopenharmony_ci        avpriv_request_sample(avctx,
262cabdff1aSopenharmony_ci                              "%d bits per coded sample", s->bps);
263cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
264cabdff1aSopenharmony_ci    }
265cabdff1aSopenharmony_ci    s->avctx             = avctx;
266cabdff1aSopenharmony_ci    s->channels          = channels;
267cabdff1aSopenharmony_ci    s->fileversion       = AV_RL16(avctx->extradata);
268cabdff1aSopenharmony_ci    s->compression_level = AV_RL16(avctx->extradata + 2);
269cabdff1aSopenharmony_ci    s->flags             = AV_RL16(avctx->extradata + 4);
270cabdff1aSopenharmony_ci
271cabdff1aSopenharmony_ci    av_log(avctx, AV_LOG_VERBOSE, "Compression Level: %d - Flags: %d\n",
272cabdff1aSopenharmony_ci           s->compression_level, s->flags);
273cabdff1aSopenharmony_ci    if (s->compression_level % 1000 || s->compression_level > COMPRESSION_LEVEL_INSANE ||
274cabdff1aSopenharmony_ci        !s->compression_level ||
275cabdff1aSopenharmony_ci        (s->fileversion < 3930 && s->compression_level == COMPRESSION_LEVEL_INSANE)) {
276cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Incorrect compression level %d\n",
277cabdff1aSopenharmony_ci               s->compression_level);
278cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
279cabdff1aSopenharmony_ci    }
280cabdff1aSopenharmony_ci    s->fset = s->compression_level / 1000 - 1;
281cabdff1aSopenharmony_ci    for (i = 0; i < APE_FILTER_LEVELS; i++) {
282cabdff1aSopenharmony_ci        if (!ape_filter_orders[s->fset][i])
283cabdff1aSopenharmony_ci            break;
284cabdff1aSopenharmony_ci        if (!(s->filterbuf[i] = av_malloc((ape_filter_orders[s->fset][i] * 3 + HISTORY_SIZE) * 4)))
285cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
286cabdff1aSopenharmony_ci    }
287cabdff1aSopenharmony_ci
288cabdff1aSopenharmony_ci    if (s->fileversion < 3860) {
289cabdff1aSopenharmony_ci        s->entropy_decode_mono   = entropy_decode_mono_0000;
290cabdff1aSopenharmony_ci        s->entropy_decode_stereo = entropy_decode_stereo_0000;
291cabdff1aSopenharmony_ci    } else if (s->fileversion < 3900) {
292cabdff1aSopenharmony_ci        s->entropy_decode_mono   = entropy_decode_mono_3860;
293cabdff1aSopenharmony_ci        s->entropy_decode_stereo = entropy_decode_stereo_3860;
294cabdff1aSopenharmony_ci    } else if (s->fileversion < 3930) {
295cabdff1aSopenharmony_ci        s->entropy_decode_mono   = entropy_decode_mono_3900;
296cabdff1aSopenharmony_ci        s->entropy_decode_stereo = entropy_decode_stereo_3900;
297cabdff1aSopenharmony_ci    } else if (s->fileversion < 3990) {
298cabdff1aSopenharmony_ci        s->entropy_decode_mono   = entropy_decode_mono_3900;
299cabdff1aSopenharmony_ci        s->entropy_decode_stereo = entropy_decode_stereo_3930;
300cabdff1aSopenharmony_ci    } else {
301cabdff1aSopenharmony_ci        s->entropy_decode_mono   = entropy_decode_mono_3990;
302cabdff1aSopenharmony_ci        s->entropy_decode_stereo = entropy_decode_stereo_3990;
303cabdff1aSopenharmony_ci    }
304cabdff1aSopenharmony_ci
305cabdff1aSopenharmony_ci    if (s->fileversion < 3930) {
306cabdff1aSopenharmony_ci        s->predictor_decode_mono   = predictor_decode_mono_3800;
307cabdff1aSopenharmony_ci        s->predictor_decode_stereo = predictor_decode_stereo_3800;
308cabdff1aSopenharmony_ci    } else if (s->fileversion < 3950) {
309cabdff1aSopenharmony_ci        s->predictor_decode_mono   = predictor_decode_mono_3930;
310cabdff1aSopenharmony_ci        s->predictor_decode_stereo = predictor_decode_stereo_3930;
311cabdff1aSopenharmony_ci    } else {
312cabdff1aSopenharmony_ci        s->predictor_decode_mono   = predictor_decode_mono_3950;
313cabdff1aSopenharmony_ci        s->predictor_decode_stereo = predictor_decode_stereo_3950;
314cabdff1aSopenharmony_ci    }
315cabdff1aSopenharmony_ci
316cabdff1aSopenharmony_ci    ff_bswapdsp_init(&s->bdsp);
317cabdff1aSopenharmony_ci    ff_llauddsp_init(&s->adsp);
318cabdff1aSopenharmony_ci    av_channel_layout_uninit(&avctx->ch_layout);
319cabdff1aSopenharmony_ci    avctx->ch_layout = (channels == 2) ? (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO
320cabdff1aSopenharmony_ci                                       : (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO;
321cabdff1aSopenharmony_ci
322cabdff1aSopenharmony_ci    return 0;
323cabdff1aSopenharmony_ci}
324cabdff1aSopenharmony_ci
325cabdff1aSopenharmony_ci/**
326cabdff1aSopenharmony_ci * @name APE range decoding functions
327cabdff1aSopenharmony_ci * @{
328cabdff1aSopenharmony_ci */
329cabdff1aSopenharmony_ci
330cabdff1aSopenharmony_ci#define CODE_BITS    32
331cabdff1aSopenharmony_ci#define TOP_VALUE    ((unsigned int)1 << (CODE_BITS-1))
332cabdff1aSopenharmony_ci#define SHIFT_BITS   (CODE_BITS - 9)
333cabdff1aSopenharmony_ci#define EXTRA_BITS   ((CODE_BITS-2) % 8 + 1)
334cabdff1aSopenharmony_ci#define BOTTOM_VALUE (TOP_VALUE >> 8)
335cabdff1aSopenharmony_ci
336cabdff1aSopenharmony_ci/** Start the decoder */
337cabdff1aSopenharmony_cistatic inline void range_start_decoding(APEContext *ctx)
338cabdff1aSopenharmony_ci{
339cabdff1aSopenharmony_ci    ctx->rc.buffer = bytestream_get_byte(&ctx->ptr);
340cabdff1aSopenharmony_ci    ctx->rc.low    = ctx->rc.buffer >> (8 - EXTRA_BITS);
341cabdff1aSopenharmony_ci    ctx->rc.range  = (uint32_t) 1 << EXTRA_BITS;
342cabdff1aSopenharmony_ci}
343cabdff1aSopenharmony_ci
344cabdff1aSopenharmony_ci/** Perform normalization */
345cabdff1aSopenharmony_cistatic inline void range_dec_normalize(APEContext *ctx)
346cabdff1aSopenharmony_ci{
347cabdff1aSopenharmony_ci    while (ctx->rc.range <= BOTTOM_VALUE) {
348cabdff1aSopenharmony_ci        ctx->rc.buffer <<= 8;
349cabdff1aSopenharmony_ci        if(ctx->ptr < ctx->data_end) {
350cabdff1aSopenharmony_ci            ctx->rc.buffer += *ctx->ptr;
351cabdff1aSopenharmony_ci            ctx->ptr++;
352cabdff1aSopenharmony_ci        } else {
353cabdff1aSopenharmony_ci            ctx->error = 1;
354cabdff1aSopenharmony_ci        }
355cabdff1aSopenharmony_ci        ctx->rc.low    = (ctx->rc.low << 8)    | ((ctx->rc.buffer >> 1) & 0xFF);
356cabdff1aSopenharmony_ci        ctx->rc.range  <<= 8;
357cabdff1aSopenharmony_ci    }
358cabdff1aSopenharmony_ci}
359cabdff1aSopenharmony_ci
360cabdff1aSopenharmony_ci/**
361cabdff1aSopenharmony_ci * Calculate cumulative frequency for next symbol. Does NO update!
362cabdff1aSopenharmony_ci * @param ctx decoder context
363cabdff1aSopenharmony_ci * @param tot_f is the total frequency or (code_value)1<<shift
364cabdff1aSopenharmony_ci * @return the cumulative frequency
365cabdff1aSopenharmony_ci */
366cabdff1aSopenharmony_cistatic inline int range_decode_culfreq(APEContext *ctx, int tot_f)
367cabdff1aSopenharmony_ci{
368cabdff1aSopenharmony_ci    range_dec_normalize(ctx);
369cabdff1aSopenharmony_ci    ctx->rc.help = ctx->rc.range / tot_f;
370cabdff1aSopenharmony_ci    return ctx->rc.low / ctx->rc.help;
371cabdff1aSopenharmony_ci}
372cabdff1aSopenharmony_ci
373cabdff1aSopenharmony_ci/**
374cabdff1aSopenharmony_ci * Decode value with given size in bits
375cabdff1aSopenharmony_ci * @param ctx decoder context
376cabdff1aSopenharmony_ci * @param shift number of bits to decode
377cabdff1aSopenharmony_ci */
378cabdff1aSopenharmony_cistatic inline int range_decode_culshift(APEContext *ctx, int shift)
379cabdff1aSopenharmony_ci{
380cabdff1aSopenharmony_ci    range_dec_normalize(ctx);
381cabdff1aSopenharmony_ci    ctx->rc.help = ctx->rc.range >> shift;
382cabdff1aSopenharmony_ci    return ctx->rc.low / ctx->rc.help;
383cabdff1aSopenharmony_ci}
384cabdff1aSopenharmony_ci
385cabdff1aSopenharmony_ci
386cabdff1aSopenharmony_ci/**
387cabdff1aSopenharmony_ci * Update decoding state
388cabdff1aSopenharmony_ci * @param ctx decoder context
389cabdff1aSopenharmony_ci * @param sy_f the interval length (frequency of the symbol)
390cabdff1aSopenharmony_ci * @param lt_f the lower end (frequency sum of < symbols)
391cabdff1aSopenharmony_ci */
392cabdff1aSopenharmony_cistatic inline void range_decode_update(APEContext *ctx, int sy_f, int lt_f)
393cabdff1aSopenharmony_ci{
394cabdff1aSopenharmony_ci    ctx->rc.low  -= ctx->rc.help * lt_f;
395cabdff1aSopenharmony_ci    ctx->rc.range = ctx->rc.help * sy_f;
396cabdff1aSopenharmony_ci}
397cabdff1aSopenharmony_ci
398cabdff1aSopenharmony_ci/** Decode n bits (n <= 16) without modelling */
399cabdff1aSopenharmony_cistatic inline int range_decode_bits(APEContext *ctx, int n)
400cabdff1aSopenharmony_ci{
401cabdff1aSopenharmony_ci    int sym = range_decode_culshift(ctx, n);
402cabdff1aSopenharmony_ci    range_decode_update(ctx, 1, sym);
403cabdff1aSopenharmony_ci    return sym;
404cabdff1aSopenharmony_ci}
405cabdff1aSopenharmony_ci
406cabdff1aSopenharmony_ci
407cabdff1aSopenharmony_ci#define MODEL_ELEMENTS 64
408cabdff1aSopenharmony_ci
409cabdff1aSopenharmony_ci/**
410cabdff1aSopenharmony_ci * Fixed probabilities for symbols in Monkey Audio version 3.97
411cabdff1aSopenharmony_ci */
412cabdff1aSopenharmony_cistatic const uint16_t counts_3970[22] = {
413cabdff1aSopenharmony_ci        0, 14824, 28224, 39348, 47855, 53994, 58171, 60926,
414cabdff1aSopenharmony_ci    62682, 63786, 64463, 64878, 65126, 65276, 65365, 65419,
415cabdff1aSopenharmony_ci    65450, 65469, 65480, 65487, 65491, 65493,
416cabdff1aSopenharmony_ci};
417cabdff1aSopenharmony_ci
418cabdff1aSopenharmony_ci/**
419cabdff1aSopenharmony_ci * Probability ranges for symbols in Monkey Audio version 3.97
420cabdff1aSopenharmony_ci */
421cabdff1aSopenharmony_cistatic const uint16_t counts_diff_3970[21] = {
422cabdff1aSopenharmony_ci    14824, 13400, 11124, 8507, 6139, 4177, 2755, 1756,
423cabdff1aSopenharmony_ci    1104, 677, 415, 248, 150, 89, 54, 31,
424cabdff1aSopenharmony_ci    19, 11, 7, 4, 2,
425cabdff1aSopenharmony_ci};
426cabdff1aSopenharmony_ci
427cabdff1aSopenharmony_ci/**
428cabdff1aSopenharmony_ci * Fixed probabilities for symbols in Monkey Audio version 3.98
429cabdff1aSopenharmony_ci */
430cabdff1aSopenharmony_cistatic const uint16_t counts_3980[22] = {
431cabdff1aSopenharmony_ci        0, 19578, 36160, 48417, 56323, 60899, 63265, 64435,
432cabdff1aSopenharmony_ci    64971, 65232, 65351, 65416, 65447, 65466, 65476, 65482,
433cabdff1aSopenharmony_ci    65485, 65488, 65490, 65491, 65492, 65493,
434cabdff1aSopenharmony_ci};
435cabdff1aSopenharmony_ci
436cabdff1aSopenharmony_ci/**
437cabdff1aSopenharmony_ci * Probability ranges for symbols in Monkey Audio version 3.98
438cabdff1aSopenharmony_ci */
439cabdff1aSopenharmony_cistatic const uint16_t counts_diff_3980[21] = {
440cabdff1aSopenharmony_ci    19578, 16582, 12257, 7906, 4576, 2366, 1170, 536,
441cabdff1aSopenharmony_ci    261, 119, 65, 31, 19, 10, 6, 3,
442cabdff1aSopenharmony_ci    3, 2, 1, 1, 1,
443cabdff1aSopenharmony_ci};
444cabdff1aSopenharmony_ci
445cabdff1aSopenharmony_ci/**
446cabdff1aSopenharmony_ci * Decode symbol
447cabdff1aSopenharmony_ci * @param ctx decoder context
448cabdff1aSopenharmony_ci * @param counts probability range start position
449cabdff1aSopenharmony_ci * @param counts_diff probability range widths
450cabdff1aSopenharmony_ci */
451cabdff1aSopenharmony_cistatic inline int range_get_symbol(APEContext *ctx,
452cabdff1aSopenharmony_ci                                   const uint16_t counts[],
453cabdff1aSopenharmony_ci                                   const uint16_t counts_diff[])
454cabdff1aSopenharmony_ci{
455cabdff1aSopenharmony_ci    int symbol, cf;
456cabdff1aSopenharmony_ci
457cabdff1aSopenharmony_ci    cf = range_decode_culshift(ctx, 16);
458cabdff1aSopenharmony_ci
459cabdff1aSopenharmony_ci    if(cf > 65492){
460cabdff1aSopenharmony_ci        symbol= cf - 65535 + 63;
461cabdff1aSopenharmony_ci        range_decode_update(ctx, 1, cf);
462cabdff1aSopenharmony_ci        if(cf > 65535)
463cabdff1aSopenharmony_ci            ctx->error=1;
464cabdff1aSopenharmony_ci        return symbol;
465cabdff1aSopenharmony_ci    }
466cabdff1aSopenharmony_ci    /* figure out the symbol inefficiently; a binary search would be much better */
467cabdff1aSopenharmony_ci    for (symbol = 0; counts[symbol + 1] <= cf; symbol++);
468cabdff1aSopenharmony_ci
469cabdff1aSopenharmony_ci    range_decode_update(ctx, counts_diff[symbol], counts[symbol]);
470cabdff1aSopenharmony_ci
471cabdff1aSopenharmony_ci    return symbol;
472cabdff1aSopenharmony_ci}
473cabdff1aSopenharmony_ci/** @} */ // group rangecoder
474cabdff1aSopenharmony_ci
475cabdff1aSopenharmony_cistatic inline void update_rice(APERice *rice, unsigned int x)
476cabdff1aSopenharmony_ci{
477cabdff1aSopenharmony_ci    int lim = rice->k ? (1 << (rice->k + 4)) : 0;
478cabdff1aSopenharmony_ci    rice->ksum += ((x + 1) / 2) - ((rice->ksum + 16) >> 5);
479cabdff1aSopenharmony_ci
480cabdff1aSopenharmony_ci    if (rice->ksum < lim)
481cabdff1aSopenharmony_ci        rice->k--;
482cabdff1aSopenharmony_ci    else if (rice->ksum >= (1 << (rice->k + 5)) && rice->k < 24)
483cabdff1aSopenharmony_ci        rice->k++;
484cabdff1aSopenharmony_ci}
485cabdff1aSopenharmony_ci
486cabdff1aSopenharmony_cistatic inline int get_rice_ook(GetBitContext *gb, int k)
487cabdff1aSopenharmony_ci{
488cabdff1aSopenharmony_ci    unsigned int x;
489cabdff1aSopenharmony_ci
490cabdff1aSopenharmony_ci    x = get_unary(gb, 1, get_bits_left(gb));
491cabdff1aSopenharmony_ci
492cabdff1aSopenharmony_ci    if (k)
493cabdff1aSopenharmony_ci        x = (x << k) | get_bits(gb, k);
494cabdff1aSopenharmony_ci
495cabdff1aSopenharmony_ci    return x;
496cabdff1aSopenharmony_ci}
497cabdff1aSopenharmony_ci
498cabdff1aSopenharmony_cistatic inline int ape_decode_value_3860(APEContext *ctx, GetBitContext *gb,
499cabdff1aSopenharmony_ci                                        APERice *rice)
500cabdff1aSopenharmony_ci{
501cabdff1aSopenharmony_ci    unsigned int x, overflow;
502cabdff1aSopenharmony_ci
503cabdff1aSopenharmony_ci    overflow = get_unary(gb, 1, get_bits_left(gb));
504cabdff1aSopenharmony_ci
505cabdff1aSopenharmony_ci    if (ctx->fileversion > 3880) {
506cabdff1aSopenharmony_ci        while (overflow >= 16) {
507cabdff1aSopenharmony_ci            overflow -= 16;
508cabdff1aSopenharmony_ci            rice->k  += 4;
509cabdff1aSopenharmony_ci        }
510cabdff1aSopenharmony_ci    }
511cabdff1aSopenharmony_ci
512cabdff1aSopenharmony_ci    if (!rice->k)
513cabdff1aSopenharmony_ci        x = overflow;
514cabdff1aSopenharmony_ci    else if(rice->k <= MIN_CACHE_BITS) {
515cabdff1aSopenharmony_ci        x = (overflow << rice->k) + get_bits(gb, rice->k);
516cabdff1aSopenharmony_ci    } else {
517cabdff1aSopenharmony_ci        av_log(ctx->avctx, AV_LOG_ERROR, "Too many bits: %"PRIu32"\n", rice->k);
518cabdff1aSopenharmony_ci        ctx->error = 1;
519cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
520cabdff1aSopenharmony_ci    }
521cabdff1aSopenharmony_ci    rice->ksum += x - (rice->ksum + 8 >> 4);
522cabdff1aSopenharmony_ci    if (rice->ksum < (rice->k ? 1 << (rice->k + 4) : 0))
523cabdff1aSopenharmony_ci        rice->k--;
524cabdff1aSopenharmony_ci    else if (rice->ksum >= (1 << (rice->k + 5)) && rice->k < 24)
525cabdff1aSopenharmony_ci        rice->k++;
526cabdff1aSopenharmony_ci
527cabdff1aSopenharmony_ci    /* Convert to signed */
528cabdff1aSopenharmony_ci    return ((x >> 1) ^ ((x & 1) - 1)) + 1;
529cabdff1aSopenharmony_ci}
530cabdff1aSopenharmony_ci
531cabdff1aSopenharmony_cistatic inline int ape_decode_value_3900(APEContext *ctx, APERice *rice)
532cabdff1aSopenharmony_ci{
533cabdff1aSopenharmony_ci    unsigned int x, overflow;
534cabdff1aSopenharmony_ci    int tmpk;
535cabdff1aSopenharmony_ci
536cabdff1aSopenharmony_ci    overflow = range_get_symbol(ctx, counts_3970, counts_diff_3970);
537cabdff1aSopenharmony_ci
538cabdff1aSopenharmony_ci    if (overflow == (MODEL_ELEMENTS - 1)) {
539cabdff1aSopenharmony_ci        tmpk = range_decode_bits(ctx, 5);
540cabdff1aSopenharmony_ci        overflow = 0;
541cabdff1aSopenharmony_ci    } else
542cabdff1aSopenharmony_ci        tmpk = (rice->k < 1) ? 0 : rice->k - 1;
543cabdff1aSopenharmony_ci
544cabdff1aSopenharmony_ci    if (tmpk <= 16 || ctx->fileversion < 3910) {
545cabdff1aSopenharmony_ci        if (tmpk > 23) {
546cabdff1aSopenharmony_ci            av_log(ctx->avctx, AV_LOG_ERROR, "Too many bits: %d\n", tmpk);
547cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
548cabdff1aSopenharmony_ci        }
549cabdff1aSopenharmony_ci        x = range_decode_bits(ctx, tmpk);
550cabdff1aSopenharmony_ci    } else if (tmpk <= 31) {
551cabdff1aSopenharmony_ci        x = range_decode_bits(ctx, 16);
552cabdff1aSopenharmony_ci        x |= (range_decode_bits(ctx, tmpk - 16) << 16);
553cabdff1aSopenharmony_ci    } else {
554cabdff1aSopenharmony_ci        av_log(ctx->avctx, AV_LOG_ERROR, "Too many bits: %d\n", tmpk);
555cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
556cabdff1aSopenharmony_ci    }
557cabdff1aSopenharmony_ci    x += overflow << tmpk;
558cabdff1aSopenharmony_ci
559cabdff1aSopenharmony_ci    update_rice(rice, x);
560cabdff1aSopenharmony_ci
561cabdff1aSopenharmony_ci    /* Convert to signed */
562cabdff1aSopenharmony_ci    return ((x >> 1) ^ ((x & 1) - 1)) + 1;
563cabdff1aSopenharmony_ci}
564cabdff1aSopenharmony_ci
565cabdff1aSopenharmony_cistatic inline int ape_decode_value_3990(APEContext *ctx, APERice *rice)
566cabdff1aSopenharmony_ci{
567cabdff1aSopenharmony_ci    unsigned int x, overflow, pivot;
568cabdff1aSopenharmony_ci    int base;
569cabdff1aSopenharmony_ci
570cabdff1aSopenharmony_ci    pivot = FFMAX(rice->ksum >> 5, 1);
571cabdff1aSopenharmony_ci
572cabdff1aSopenharmony_ci    overflow = range_get_symbol(ctx, counts_3980, counts_diff_3980);
573cabdff1aSopenharmony_ci
574cabdff1aSopenharmony_ci    if (overflow == (MODEL_ELEMENTS - 1)) {
575cabdff1aSopenharmony_ci        overflow  = (unsigned)range_decode_bits(ctx, 16) << 16;
576cabdff1aSopenharmony_ci        overflow |= range_decode_bits(ctx, 16);
577cabdff1aSopenharmony_ci    }
578cabdff1aSopenharmony_ci
579cabdff1aSopenharmony_ci    if (pivot < 0x10000) {
580cabdff1aSopenharmony_ci        base = range_decode_culfreq(ctx, pivot);
581cabdff1aSopenharmony_ci        range_decode_update(ctx, 1, base);
582cabdff1aSopenharmony_ci    } else {
583cabdff1aSopenharmony_ci        int base_hi = pivot, base_lo;
584cabdff1aSopenharmony_ci        int bbits = 0;
585cabdff1aSopenharmony_ci
586cabdff1aSopenharmony_ci        while (base_hi & ~0xFFFF) {
587cabdff1aSopenharmony_ci            base_hi >>= 1;
588cabdff1aSopenharmony_ci            bbits++;
589cabdff1aSopenharmony_ci        }
590cabdff1aSopenharmony_ci        base_hi = range_decode_culfreq(ctx, base_hi + 1);
591cabdff1aSopenharmony_ci        range_decode_update(ctx, 1, base_hi);
592cabdff1aSopenharmony_ci        base_lo = range_decode_culfreq(ctx, 1 << bbits);
593cabdff1aSopenharmony_ci        range_decode_update(ctx, 1, base_lo);
594cabdff1aSopenharmony_ci
595cabdff1aSopenharmony_ci        base = (base_hi << bbits) + base_lo;
596cabdff1aSopenharmony_ci    }
597cabdff1aSopenharmony_ci
598cabdff1aSopenharmony_ci    x = base + overflow * pivot;
599cabdff1aSopenharmony_ci
600cabdff1aSopenharmony_ci    update_rice(rice, x);
601cabdff1aSopenharmony_ci
602cabdff1aSopenharmony_ci    /* Convert to signed */
603cabdff1aSopenharmony_ci    return ((x >> 1) ^ ((x & 1) - 1)) + 1;
604cabdff1aSopenharmony_ci}
605cabdff1aSopenharmony_ci
606cabdff1aSopenharmony_cistatic int get_k(int ksum)
607cabdff1aSopenharmony_ci{
608cabdff1aSopenharmony_ci    return av_log2(ksum) + !!ksum;
609cabdff1aSopenharmony_ci}
610cabdff1aSopenharmony_ci
611cabdff1aSopenharmony_cistatic void decode_array_0000(APEContext *ctx, GetBitContext *gb,
612cabdff1aSopenharmony_ci                              int32_t *out, APERice *rice, int blockstodecode)
613cabdff1aSopenharmony_ci{
614cabdff1aSopenharmony_ci    int i;
615cabdff1aSopenharmony_ci    unsigned ksummax, ksummin;
616cabdff1aSopenharmony_ci
617cabdff1aSopenharmony_ci    rice->ksum = 0;
618cabdff1aSopenharmony_ci    for (i = 0; i < FFMIN(blockstodecode, 5); i++) {
619cabdff1aSopenharmony_ci        out[i] = get_rice_ook(&ctx->gb, 10);
620cabdff1aSopenharmony_ci        rice->ksum += out[i];
621cabdff1aSopenharmony_ci    }
622cabdff1aSopenharmony_ci
623cabdff1aSopenharmony_ci    if (blockstodecode <= 5)
624cabdff1aSopenharmony_ci        goto end;
625cabdff1aSopenharmony_ci
626cabdff1aSopenharmony_ci    rice->k = get_k(rice->ksum / 10);
627cabdff1aSopenharmony_ci    if (rice->k >= 24)
628cabdff1aSopenharmony_ci        return;
629cabdff1aSopenharmony_ci    for (; i < FFMIN(blockstodecode, 64); i++) {
630cabdff1aSopenharmony_ci        out[i] = get_rice_ook(&ctx->gb, rice->k);
631cabdff1aSopenharmony_ci        rice->ksum += out[i];
632cabdff1aSopenharmony_ci        rice->k = get_k(rice->ksum / ((i + 1) * 2));
633cabdff1aSopenharmony_ci        if (rice->k >= 24)
634cabdff1aSopenharmony_ci            return;
635cabdff1aSopenharmony_ci    }
636cabdff1aSopenharmony_ci
637cabdff1aSopenharmony_ci    if (blockstodecode <= 64)
638cabdff1aSopenharmony_ci        goto end;
639cabdff1aSopenharmony_ci
640cabdff1aSopenharmony_ci    rice->k = get_k(rice->ksum >> 7);
641cabdff1aSopenharmony_ci    ksummax = 1 << rice->k + 7;
642cabdff1aSopenharmony_ci    ksummin = rice->k ? (1 << rice->k + 6) : 0;
643cabdff1aSopenharmony_ci    for (; i < blockstodecode; i++) {
644cabdff1aSopenharmony_ci        if (get_bits_left(&ctx->gb) < 1) {
645cabdff1aSopenharmony_ci            ctx->error = 1;
646cabdff1aSopenharmony_ci            return;
647cabdff1aSopenharmony_ci        }
648cabdff1aSopenharmony_ci        out[i] = get_rice_ook(&ctx->gb, rice->k);
649cabdff1aSopenharmony_ci        rice->ksum += out[i] - (unsigned)out[i - 64];
650cabdff1aSopenharmony_ci        while (rice->ksum < ksummin) {
651cabdff1aSopenharmony_ci            rice->k--;
652cabdff1aSopenharmony_ci            ksummin = rice->k ? ksummin >> 1 : 0;
653cabdff1aSopenharmony_ci            ksummax >>= 1;
654cabdff1aSopenharmony_ci        }
655cabdff1aSopenharmony_ci        while (rice->ksum >= ksummax) {
656cabdff1aSopenharmony_ci            rice->k++;
657cabdff1aSopenharmony_ci            if (rice->k > 24)
658cabdff1aSopenharmony_ci                return;
659cabdff1aSopenharmony_ci            ksummax <<= 1;
660cabdff1aSopenharmony_ci            ksummin = ksummin ? ksummin << 1 : 128;
661cabdff1aSopenharmony_ci        }
662cabdff1aSopenharmony_ci    }
663cabdff1aSopenharmony_ci
664cabdff1aSopenharmony_ciend:
665cabdff1aSopenharmony_ci    for (i = 0; i < blockstodecode; i++)
666cabdff1aSopenharmony_ci        out[i] = ((out[i] >> 1) ^ ((out[i] & 1) - 1)) + 1;
667cabdff1aSopenharmony_ci}
668cabdff1aSopenharmony_ci
669cabdff1aSopenharmony_cistatic void entropy_decode_mono_0000(APEContext *ctx, int blockstodecode)
670cabdff1aSopenharmony_ci{
671cabdff1aSopenharmony_ci    decode_array_0000(ctx, &ctx->gb, ctx->decoded[0], &ctx->riceY,
672cabdff1aSopenharmony_ci                      blockstodecode);
673cabdff1aSopenharmony_ci}
674cabdff1aSopenharmony_ci
675cabdff1aSopenharmony_cistatic void entropy_decode_stereo_0000(APEContext *ctx, int blockstodecode)
676cabdff1aSopenharmony_ci{
677cabdff1aSopenharmony_ci    decode_array_0000(ctx, &ctx->gb, ctx->decoded[0], &ctx->riceY,
678cabdff1aSopenharmony_ci                      blockstodecode);
679cabdff1aSopenharmony_ci    decode_array_0000(ctx, &ctx->gb, ctx->decoded[1], &ctx->riceX,
680cabdff1aSopenharmony_ci                      blockstodecode);
681cabdff1aSopenharmony_ci}
682cabdff1aSopenharmony_ci
683cabdff1aSopenharmony_cistatic void entropy_decode_mono_3860(APEContext *ctx, int blockstodecode)
684cabdff1aSopenharmony_ci{
685cabdff1aSopenharmony_ci    int32_t *decoded0 = ctx->decoded[0];
686cabdff1aSopenharmony_ci
687cabdff1aSopenharmony_ci    while (blockstodecode--)
688cabdff1aSopenharmony_ci        *decoded0++ = ape_decode_value_3860(ctx, &ctx->gb, &ctx->riceY);
689cabdff1aSopenharmony_ci}
690cabdff1aSopenharmony_ci
691cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3860(APEContext *ctx, int blockstodecode)
692cabdff1aSopenharmony_ci{
693cabdff1aSopenharmony_ci    int32_t *decoded0 = ctx->decoded[0];
694cabdff1aSopenharmony_ci    int32_t *decoded1 = ctx->decoded[1];
695cabdff1aSopenharmony_ci    int blocks = blockstodecode;
696cabdff1aSopenharmony_ci
697cabdff1aSopenharmony_ci    while (blockstodecode--)
698cabdff1aSopenharmony_ci        *decoded0++ = ape_decode_value_3860(ctx, &ctx->gb, &ctx->riceY);
699cabdff1aSopenharmony_ci    while (blocks--)
700cabdff1aSopenharmony_ci        *decoded1++ = ape_decode_value_3860(ctx, &ctx->gb, &ctx->riceX);
701cabdff1aSopenharmony_ci}
702cabdff1aSopenharmony_ci
703cabdff1aSopenharmony_cistatic void entropy_decode_mono_3900(APEContext *ctx, int blockstodecode)
704cabdff1aSopenharmony_ci{
705cabdff1aSopenharmony_ci    int32_t *decoded0 = ctx->decoded[0];
706cabdff1aSopenharmony_ci
707cabdff1aSopenharmony_ci    while (blockstodecode--)
708cabdff1aSopenharmony_ci        *decoded0++ = ape_decode_value_3900(ctx, &ctx->riceY);
709cabdff1aSopenharmony_ci}
710cabdff1aSopenharmony_ci
711cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3900(APEContext *ctx, int blockstodecode)
712cabdff1aSopenharmony_ci{
713cabdff1aSopenharmony_ci    int32_t *decoded0 = ctx->decoded[0];
714cabdff1aSopenharmony_ci    int32_t *decoded1 = ctx->decoded[1];
715cabdff1aSopenharmony_ci    int blocks = blockstodecode;
716cabdff1aSopenharmony_ci
717cabdff1aSopenharmony_ci    while (blockstodecode--)
718cabdff1aSopenharmony_ci        *decoded0++ = ape_decode_value_3900(ctx, &ctx->riceY);
719cabdff1aSopenharmony_ci    range_dec_normalize(ctx);
720cabdff1aSopenharmony_ci    // because of some implementation peculiarities we need to backpedal here
721cabdff1aSopenharmony_ci    ctx->ptr -= 1;
722cabdff1aSopenharmony_ci    range_start_decoding(ctx);
723cabdff1aSopenharmony_ci    while (blocks--)
724cabdff1aSopenharmony_ci        *decoded1++ = ape_decode_value_3900(ctx, &ctx->riceX);
725cabdff1aSopenharmony_ci}
726cabdff1aSopenharmony_ci
727cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3930(APEContext *ctx, int blockstodecode)
728cabdff1aSopenharmony_ci{
729cabdff1aSopenharmony_ci    int32_t *decoded0 = ctx->decoded[0];
730cabdff1aSopenharmony_ci    int32_t *decoded1 = ctx->decoded[1];
731cabdff1aSopenharmony_ci
732cabdff1aSopenharmony_ci    while (blockstodecode--) {
733cabdff1aSopenharmony_ci        *decoded0++ = ape_decode_value_3900(ctx, &ctx->riceY);
734cabdff1aSopenharmony_ci        *decoded1++ = ape_decode_value_3900(ctx, &ctx->riceX);
735cabdff1aSopenharmony_ci    }
736cabdff1aSopenharmony_ci}
737cabdff1aSopenharmony_ci
738cabdff1aSopenharmony_cistatic void entropy_decode_mono_3990(APEContext *ctx, int blockstodecode)
739cabdff1aSopenharmony_ci{
740cabdff1aSopenharmony_ci    int32_t *decoded0 = ctx->decoded[0];
741cabdff1aSopenharmony_ci
742cabdff1aSopenharmony_ci    while (blockstodecode--)
743cabdff1aSopenharmony_ci        *decoded0++ = ape_decode_value_3990(ctx, &ctx->riceY);
744cabdff1aSopenharmony_ci}
745cabdff1aSopenharmony_ci
746cabdff1aSopenharmony_cistatic void entropy_decode_stereo_3990(APEContext *ctx, int blockstodecode)
747cabdff1aSopenharmony_ci{
748cabdff1aSopenharmony_ci    int32_t *decoded0 = ctx->decoded[0];
749cabdff1aSopenharmony_ci    int32_t *decoded1 = ctx->decoded[1];
750cabdff1aSopenharmony_ci
751cabdff1aSopenharmony_ci    while (blockstodecode--) {
752cabdff1aSopenharmony_ci        *decoded0++ = ape_decode_value_3990(ctx, &ctx->riceY);
753cabdff1aSopenharmony_ci        *decoded1++ = ape_decode_value_3990(ctx, &ctx->riceX);
754cabdff1aSopenharmony_ci    }
755cabdff1aSopenharmony_ci}
756cabdff1aSopenharmony_ci
757cabdff1aSopenharmony_cistatic int init_entropy_decoder(APEContext *ctx)
758cabdff1aSopenharmony_ci{
759cabdff1aSopenharmony_ci    /* Read the CRC */
760cabdff1aSopenharmony_ci    if (ctx->fileversion >= 3900) {
761cabdff1aSopenharmony_ci        if (ctx->data_end - ctx->ptr < 6)
762cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
763cabdff1aSopenharmony_ci        ctx->CRC = bytestream_get_be32(&ctx->ptr);
764cabdff1aSopenharmony_ci    } else {
765cabdff1aSopenharmony_ci        ctx->CRC = get_bits_long(&ctx->gb, 32);
766cabdff1aSopenharmony_ci    }
767cabdff1aSopenharmony_ci
768cabdff1aSopenharmony_ci    /* Read the frame flags if they exist */
769cabdff1aSopenharmony_ci    ctx->frameflags = 0;
770cabdff1aSopenharmony_ci    ctx->CRC_state = UINT32_MAX;
771cabdff1aSopenharmony_ci    if ((ctx->fileversion > 3820) && (ctx->CRC & 0x80000000)) {
772cabdff1aSopenharmony_ci        ctx->CRC &= ~0x80000000;
773cabdff1aSopenharmony_ci
774cabdff1aSopenharmony_ci        if (ctx->data_end - ctx->ptr < 6)
775cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
776cabdff1aSopenharmony_ci        ctx->frameflags = bytestream_get_be32(&ctx->ptr);
777cabdff1aSopenharmony_ci    }
778cabdff1aSopenharmony_ci
779cabdff1aSopenharmony_ci    /* Initialize the rice structs */
780cabdff1aSopenharmony_ci    ctx->riceX.k = 10;
781cabdff1aSopenharmony_ci    ctx->riceX.ksum = (1 << ctx->riceX.k) * 16;
782cabdff1aSopenharmony_ci    ctx->riceY.k = 10;
783cabdff1aSopenharmony_ci    ctx->riceY.ksum = (1 << ctx->riceY.k) * 16;
784cabdff1aSopenharmony_ci
785cabdff1aSopenharmony_ci    if (ctx->fileversion >= 3900) {
786cabdff1aSopenharmony_ci        /* The first 8 bits of input are ignored. */
787cabdff1aSopenharmony_ci        ctx->ptr++;
788cabdff1aSopenharmony_ci
789cabdff1aSopenharmony_ci        range_start_decoding(ctx);
790cabdff1aSopenharmony_ci    }
791cabdff1aSopenharmony_ci
792cabdff1aSopenharmony_ci    return 0;
793cabdff1aSopenharmony_ci}
794cabdff1aSopenharmony_ci
795cabdff1aSopenharmony_cistatic const int32_t initial_coeffs_fast_3320[1] = {
796cabdff1aSopenharmony_ci    375,
797cabdff1aSopenharmony_ci};
798cabdff1aSopenharmony_ci
799cabdff1aSopenharmony_cistatic const int32_t initial_coeffs_a_3800[3] = {
800cabdff1aSopenharmony_ci    64, 115, 64,
801cabdff1aSopenharmony_ci};
802cabdff1aSopenharmony_ci
803cabdff1aSopenharmony_cistatic const int32_t initial_coeffs_b_3800[2] = {
804cabdff1aSopenharmony_ci    740, 0
805cabdff1aSopenharmony_ci};
806cabdff1aSopenharmony_ci
807cabdff1aSopenharmony_cistatic const int32_t initial_coeffs_3930[4] = {
808cabdff1aSopenharmony_ci    360, 317, -109, 98
809cabdff1aSopenharmony_ci};
810cabdff1aSopenharmony_ci
811cabdff1aSopenharmony_cistatic const int64_t initial_coeffs_3930_64bit[4] = {
812cabdff1aSopenharmony_ci    360, 317, -109, 98
813cabdff1aSopenharmony_ci};
814cabdff1aSopenharmony_ci
815cabdff1aSopenharmony_cistatic void init_predictor_decoder(APEContext *ctx)
816cabdff1aSopenharmony_ci{
817cabdff1aSopenharmony_ci    APEPredictor *p = &ctx->predictor;
818cabdff1aSopenharmony_ci    APEPredictor64 *p64 = &ctx->predictor64;
819cabdff1aSopenharmony_ci
820cabdff1aSopenharmony_ci    /* Zero the history buffers */
821cabdff1aSopenharmony_ci    memset(p->historybuffer, 0, PREDICTOR_SIZE * sizeof(*p->historybuffer));
822cabdff1aSopenharmony_ci    memset(p64->historybuffer, 0, PREDICTOR_SIZE * sizeof(*p64->historybuffer));
823cabdff1aSopenharmony_ci    p->buf = p->historybuffer;
824cabdff1aSopenharmony_ci    p64->buf = p64->historybuffer;
825cabdff1aSopenharmony_ci
826cabdff1aSopenharmony_ci    /* Initialize and zero the coefficients */
827cabdff1aSopenharmony_ci    if (ctx->fileversion < 3930) {
828cabdff1aSopenharmony_ci        if (ctx->compression_level == COMPRESSION_LEVEL_FAST) {
829cabdff1aSopenharmony_ci            memcpy(p->coeffsA[0], initial_coeffs_fast_3320,
830cabdff1aSopenharmony_ci                   sizeof(initial_coeffs_fast_3320));
831cabdff1aSopenharmony_ci            memcpy(p->coeffsA[1], initial_coeffs_fast_3320,
832cabdff1aSopenharmony_ci                   sizeof(initial_coeffs_fast_3320));
833cabdff1aSopenharmony_ci        } else {
834cabdff1aSopenharmony_ci            memcpy(p->coeffsA[0], initial_coeffs_a_3800,
835cabdff1aSopenharmony_ci                   sizeof(initial_coeffs_a_3800));
836cabdff1aSopenharmony_ci            memcpy(p->coeffsA[1], initial_coeffs_a_3800,
837cabdff1aSopenharmony_ci                   sizeof(initial_coeffs_a_3800));
838cabdff1aSopenharmony_ci        }
839cabdff1aSopenharmony_ci    } else {
840cabdff1aSopenharmony_ci        memcpy(p->coeffsA[0], initial_coeffs_3930, sizeof(initial_coeffs_3930));
841cabdff1aSopenharmony_ci        memcpy(p->coeffsA[1], initial_coeffs_3930, sizeof(initial_coeffs_3930));
842cabdff1aSopenharmony_ci        memcpy(p64->coeffsA[0], initial_coeffs_3930_64bit, sizeof(initial_coeffs_3930_64bit));
843cabdff1aSopenharmony_ci        memcpy(p64->coeffsA[1], initial_coeffs_3930_64bit, sizeof(initial_coeffs_3930_64bit));
844cabdff1aSopenharmony_ci    }
845cabdff1aSopenharmony_ci    memset(p->coeffsB, 0, sizeof(p->coeffsB));
846cabdff1aSopenharmony_ci    memset(p64->coeffsB, 0, sizeof(p64->coeffsB));
847cabdff1aSopenharmony_ci    if (ctx->fileversion < 3930) {
848cabdff1aSopenharmony_ci        memcpy(p->coeffsB[0], initial_coeffs_b_3800,
849cabdff1aSopenharmony_ci               sizeof(initial_coeffs_b_3800));
850cabdff1aSopenharmony_ci        memcpy(p->coeffsB[1], initial_coeffs_b_3800,
851cabdff1aSopenharmony_ci               sizeof(initial_coeffs_b_3800));
852cabdff1aSopenharmony_ci    }
853cabdff1aSopenharmony_ci
854cabdff1aSopenharmony_ci    p->filterA[0] = p->filterA[1] = 0;
855cabdff1aSopenharmony_ci    p->filterB[0] = p->filterB[1] = 0;
856cabdff1aSopenharmony_ci    p->lastA[0]   = p->lastA[1]   = 0;
857cabdff1aSopenharmony_ci
858cabdff1aSopenharmony_ci    p64->filterA[0] = p64->filterA[1] = 0;
859cabdff1aSopenharmony_ci    p64->filterB[0] = p64->filterB[1] = 0;
860cabdff1aSopenharmony_ci    p64->lastA[0]   = p64->lastA[1]   = 0;
861cabdff1aSopenharmony_ci
862cabdff1aSopenharmony_ci    p->sample_pos = 0;
863cabdff1aSopenharmony_ci
864cabdff1aSopenharmony_ci    p64->sample_pos = 0;
865cabdff1aSopenharmony_ci}
866cabdff1aSopenharmony_ci
867cabdff1aSopenharmony_ci/** Get inverse sign of integer (-1 for positive, 1 for negative and 0 for zero) */
868cabdff1aSopenharmony_cistatic inline int APESIGN(int32_t x) {
869cabdff1aSopenharmony_ci    return (x < 0) - (x > 0);
870cabdff1aSopenharmony_ci}
871cabdff1aSopenharmony_ci
872cabdff1aSopenharmony_cistatic av_always_inline int filter_fast_3320(APEPredictor *p,
873cabdff1aSopenharmony_ci                                             const int decoded, const int filter,
874cabdff1aSopenharmony_ci                                             const int delayA)
875cabdff1aSopenharmony_ci{
876cabdff1aSopenharmony_ci    int32_t predictionA;
877cabdff1aSopenharmony_ci
878cabdff1aSopenharmony_ci    p->buf[delayA] = p->lastA[filter];
879cabdff1aSopenharmony_ci    if (p->sample_pos < 3) {
880cabdff1aSopenharmony_ci        p->lastA[filter]   = decoded;
881cabdff1aSopenharmony_ci        p->filterA[filter] = decoded;
882cabdff1aSopenharmony_ci        return decoded;
883cabdff1aSopenharmony_ci    }
884cabdff1aSopenharmony_ci
885cabdff1aSopenharmony_ci    predictionA = p->buf[delayA] * 2U - p->buf[delayA - 1];
886cabdff1aSopenharmony_ci    p->lastA[filter] = decoded + (unsigned)((int32_t)(predictionA  * p->coeffsA[filter][0]) >> 9);
887cabdff1aSopenharmony_ci
888cabdff1aSopenharmony_ci    if ((decoded ^ predictionA) > 0)
889cabdff1aSopenharmony_ci        p->coeffsA[filter][0]++;
890cabdff1aSopenharmony_ci    else
891cabdff1aSopenharmony_ci        p->coeffsA[filter][0]--;
892cabdff1aSopenharmony_ci
893cabdff1aSopenharmony_ci    p->filterA[filter] += (unsigned)p->lastA[filter];
894cabdff1aSopenharmony_ci
895cabdff1aSopenharmony_ci    return p->filterA[filter];
896cabdff1aSopenharmony_ci}
897cabdff1aSopenharmony_ci
898cabdff1aSopenharmony_cistatic av_always_inline int filter_3800(APEPredictor *p,
899cabdff1aSopenharmony_ci                                        const unsigned decoded, const int filter,
900cabdff1aSopenharmony_ci                                        const int delayA,  const int delayB,
901cabdff1aSopenharmony_ci                                        const int start,   const int shift)
902cabdff1aSopenharmony_ci{
903cabdff1aSopenharmony_ci    int32_t predictionA, predictionB, sign;
904cabdff1aSopenharmony_ci    int32_t d0, d1, d2, d3, d4;
905cabdff1aSopenharmony_ci
906cabdff1aSopenharmony_ci    p->buf[delayA] = p->lastA[filter];
907cabdff1aSopenharmony_ci    p->buf[delayB] = p->filterB[filter];
908cabdff1aSopenharmony_ci    if (p->sample_pos < start) {
909cabdff1aSopenharmony_ci        predictionA = decoded + p->filterA[filter];
910cabdff1aSopenharmony_ci        p->lastA[filter]   = decoded;
911cabdff1aSopenharmony_ci        p->filterB[filter] = decoded;
912cabdff1aSopenharmony_ci        p->filterA[filter] = predictionA;
913cabdff1aSopenharmony_ci        return predictionA;
914cabdff1aSopenharmony_ci    }
915cabdff1aSopenharmony_ci    d2 =  p->buf[delayA];
916cabdff1aSopenharmony_ci    d1 = (p->buf[delayA] - (unsigned)p->buf[delayA - 1]) * 2;
917cabdff1aSopenharmony_ci    d0 =  p->buf[delayA] + ((p->buf[delayA - 2] - (unsigned)p->buf[delayA - 1]) * 8);
918cabdff1aSopenharmony_ci    d3 =  p->buf[delayB] * 2U - p->buf[delayB - 1];
919cabdff1aSopenharmony_ci    d4 =  p->buf[delayB];
920cabdff1aSopenharmony_ci
921cabdff1aSopenharmony_ci    predictionA = d0 * p->coeffsA[filter][0] +
922cabdff1aSopenharmony_ci                  d1 * p->coeffsA[filter][1] +
923cabdff1aSopenharmony_ci                  d2 * p->coeffsA[filter][2];
924cabdff1aSopenharmony_ci
925cabdff1aSopenharmony_ci    sign = APESIGN(decoded);
926cabdff1aSopenharmony_ci    p->coeffsA[filter][0] += (((d0 >> 30) & 2) - 1) * sign;
927cabdff1aSopenharmony_ci    p->coeffsA[filter][1] += (((d1 >> 28) & 8) - 4) * sign;
928cabdff1aSopenharmony_ci    p->coeffsA[filter][2] += (((d2 >> 28) & 8) - 4) * sign;
929cabdff1aSopenharmony_ci
930cabdff1aSopenharmony_ci    predictionB = d3 * p->coeffsB[filter][0] -
931cabdff1aSopenharmony_ci                  d4 * p->coeffsB[filter][1];
932cabdff1aSopenharmony_ci    p->lastA[filter] = decoded + (predictionA >> 11);
933cabdff1aSopenharmony_ci    sign = APESIGN(p->lastA[filter]);
934cabdff1aSopenharmony_ci    p->coeffsB[filter][0] += (((d3 >> 29) & 4) - 2) * sign;
935cabdff1aSopenharmony_ci    p->coeffsB[filter][1] -= (((d4 >> 30) & 2) - 1) * sign;
936cabdff1aSopenharmony_ci
937cabdff1aSopenharmony_ci    p->filterB[filter] = p->lastA[filter] + (unsigned)(predictionB >> shift);
938cabdff1aSopenharmony_ci    p->filterA[filter] = p->filterB[filter] + (unsigned)((int)(p->filterA[filter] * 31U) >> 5);
939cabdff1aSopenharmony_ci
940cabdff1aSopenharmony_ci    return p->filterA[filter];
941cabdff1aSopenharmony_ci}
942cabdff1aSopenharmony_ci
943cabdff1aSopenharmony_cistatic void long_filter_high_3800(int32_t *buffer, int order, int shift, int length)
944cabdff1aSopenharmony_ci{
945cabdff1aSopenharmony_ci    int i, j;
946cabdff1aSopenharmony_ci    int32_t dotprod, sign;
947cabdff1aSopenharmony_ci    int32_t coeffs[256], delay[256];
948cabdff1aSopenharmony_ci
949cabdff1aSopenharmony_ci    if (order >= length)
950cabdff1aSopenharmony_ci        return;
951cabdff1aSopenharmony_ci
952cabdff1aSopenharmony_ci    memset(coeffs, 0, order * sizeof(*coeffs));
953cabdff1aSopenharmony_ci    for (i = 0; i < order; i++)
954cabdff1aSopenharmony_ci        delay[i] = buffer[i];
955cabdff1aSopenharmony_ci    for (i = order; i < length; i++) {
956cabdff1aSopenharmony_ci        dotprod = 0;
957cabdff1aSopenharmony_ci        sign = APESIGN(buffer[i]);
958cabdff1aSopenharmony_ci        for (j = 0; j < order; j++) {
959cabdff1aSopenharmony_ci            dotprod += delay[j] * (unsigned)coeffs[j];
960cabdff1aSopenharmony_ci            coeffs[j] += ((delay[j] >> 31) | 1) * sign;
961cabdff1aSopenharmony_ci        }
962cabdff1aSopenharmony_ci        buffer[i] -= (unsigned)(dotprod >> shift);
963cabdff1aSopenharmony_ci        for (j = 0; j < order - 1; j++)
964cabdff1aSopenharmony_ci            delay[j] = delay[j + 1];
965cabdff1aSopenharmony_ci        delay[order - 1] = buffer[i];
966cabdff1aSopenharmony_ci    }
967cabdff1aSopenharmony_ci}
968cabdff1aSopenharmony_ci
969cabdff1aSopenharmony_cistatic void long_filter_ehigh_3830(int32_t *buffer, int length)
970cabdff1aSopenharmony_ci{
971cabdff1aSopenharmony_ci    int i, j;
972cabdff1aSopenharmony_ci    int32_t dotprod, sign;
973cabdff1aSopenharmony_ci    int32_t delay[8] = { 0 };
974cabdff1aSopenharmony_ci    uint32_t coeffs[8] = { 0 };
975cabdff1aSopenharmony_ci
976cabdff1aSopenharmony_ci    for (i = 0; i < length; i++) {
977cabdff1aSopenharmony_ci        dotprod = 0;
978cabdff1aSopenharmony_ci        sign = APESIGN(buffer[i]);
979cabdff1aSopenharmony_ci        for (j = 7; j >= 0; j--) {
980cabdff1aSopenharmony_ci            dotprod += delay[j] * coeffs[j];
981cabdff1aSopenharmony_ci            coeffs[j] += ((delay[j] >> 31) | 1) * sign;
982cabdff1aSopenharmony_ci        }
983cabdff1aSopenharmony_ci        for (j = 7; j > 0; j--)
984cabdff1aSopenharmony_ci            delay[j] = delay[j - 1];
985cabdff1aSopenharmony_ci        delay[0] = buffer[i];
986cabdff1aSopenharmony_ci        buffer[i] -= (unsigned)(dotprod >> 9);
987cabdff1aSopenharmony_ci    }
988cabdff1aSopenharmony_ci}
989cabdff1aSopenharmony_ci
990cabdff1aSopenharmony_cistatic void predictor_decode_stereo_3800(APEContext *ctx, int count)
991cabdff1aSopenharmony_ci{
992cabdff1aSopenharmony_ci    APEPredictor *p = &ctx->predictor;
993cabdff1aSopenharmony_ci    int32_t *decoded0 = ctx->decoded[0];
994cabdff1aSopenharmony_ci    int32_t *decoded1 = ctx->decoded[1];
995cabdff1aSopenharmony_ci    int start = 4, shift = 10;
996cabdff1aSopenharmony_ci
997cabdff1aSopenharmony_ci    if (ctx->compression_level == COMPRESSION_LEVEL_HIGH) {
998cabdff1aSopenharmony_ci        start = 16;
999cabdff1aSopenharmony_ci        long_filter_high_3800(decoded0, 16, 9, count);
1000cabdff1aSopenharmony_ci        long_filter_high_3800(decoded1, 16, 9, count);
1001cabdff1aSopenharmony_ci    } else if (ctx->compression_level == COMPRESSION_LEVEL_EXTRA_HIGH) {
1002cabdff1aSopenharmony_ci        int order = 128, shift2 = 11;
1003cabdff1aSopenharmony_ci
1004cabdff1aSopenharmony_ci        if (ctx->fileversion >= 3830) {
1005cabdff1aSopenharmony_ci            order <<= 1;
1006cabdff1aSopenharmony_ci            shift++;
1007cabdff1aSopenharmony_ci            shift2++;
1008cabdff1aSopenharmony_ci            long_filter_ehigh_3830(decoded0 + order, count - order);
1009cabdff1aSopenharmony_ci            long_filter_ehigh_3830(decoded1 + order, count - order);
1010cabdff1aSopenharmony_ci        }
1011cabdff1aSopenharmony_ci        start = order;
1012cabdff1aSopenharmony_ci        long_filter_high_3800(decoded0, order, shift2, count);
1013cabdff1aSopenharmony_ci        long_filter_high_3800(decoded1, order, shift2, count);
1014cabdff1aSopenharmony_ci    }
1015cabdff1aSopenharmony_ci
1016cabdff1aSopenharmony_ci    while (count--) {
1017cabdff1aSopenharmony_ci        int X = *decoded0, Y = *decoded1;
1018cabdff1aSopenharmony_ci        if (ctx->compression_level == COMPRESSION_LEVEL_FAST) {
1019cabdff1aSopenharmony_ci            *decoded0 = filter_fast_3320(p, Y, 0, YDELAYA);
1020cabdff1aSopenharmony_ci            decoded0++;
1021cabdff1aSopenharmony_ci            *decoded1 = filter_fast_3320(p, X, 1, XDELAYA);
1022cabdff1aSopenharmony_ci            decoded1++;
1023cabdff1aSopenharmony_ci        } else {
1024cabdff1aSopenharmony_ci            *decoded0 = filter_3800(p, Y, 0, YDELAYA, YDELAYB,
1025cabdff1aSopenharmony_ci                                    start, shift);
1026cabdff1aSopenharmony_ci            decoded0++;
1027cabdff1aSopenharmony_ci            *decoded1 = filter_3800(p, X, 1, XDELAYA, XDELAYB,
1028cabdff1aSopenharmony_ci                                    start, shift);
1029cabdff1aSopenharmony_ci            decoded1++;
1030cabdff1aSopenharmony_ci        }
1031cabdff1aSopenharmony_ci
1032cabdff1aSopenharmony_ci        /* Combined */
1033cabdff1aSopenharmony_ci        p->buf++;
1034cabdff1aSopenharmony_ci        p->sample_pos++;
1035cabdff1aSopenharmony_ci
1036cabdff1aSopenharmony_ci        /* Have we filled the history buffer? */
1037cabdff1aSopenharmony_ci        if (p->buf == p->historybuffer + HISTORY_SIZE) {
1038cabdff1aSopenharmony_ci            memmove(p->historybuffer, p->buf,
1039cabdff1aSopenharmony_ci                    PREDICTOR_SIZE * sizeof(*p->historybuffer));
1040cabdff1aSopenharmony_ci            p->buf = p->historybuffer;
1041cabdff1aSopenharmony_ci        }
1042cabdff1aSopenharmony_ci    }
1043cabdff1aSopenharmony_ci}
1044cabdff1aSopenharmony_ci
1045cabdff1aSopenharmony_cistatic void predictor_decode_mono_3800(APEContext *ctx, int count)
1046cabdff1aSopenharmony_ci{
1047cabdff1aSopenharmony_ci    APEPredictor *p = &ctx->predictor;
1048cabdff1aSopenharmony_ci    int32_t *decoded0 = ctx->decoded[0];
1049cabdff1aSopenharmony_ci    int start = 4, shift = 10;
1050cabdff1aSopenharmony_ci
1051cabdff1aSopenharmony_ci    if (ctx->compression_level == COMPRESSION_LEVEL_HIGH) {
1052cabdff1aSopenharmony_ci        start = 16;
1053cabdff1aSopenharmony_ci        long_filter_high_3800(decoded0, 16, 9, count);
1054cabdff1aSopenharmony_ci    } else if (ctx->compression_level == COMPRESSION_LEVEL_EXTRA_HIGH) {
1055cabdff1aSopenharmony_ci        int order = 128, shift2 = 11;
1056cabdff1aSopenharmony_ci
1057cabdff1aSopenharmony_ci        if (ctx->fileversion >= 3830) {
1058cabdff1aSopenharmony_ci            order <<= 1;
1059cabdff1aSopenharmony_ci            shift++;
1060cabdff1aSopenharmony_ci            shift2++;
1061cabdff1aSopenharmony_ci            long_filter_ehigh_3830(decoded0 + order, count - order);
1062cabdff1aSopenharmony_ci        }
1063cabdff1aSopenharmony_ci        start = order;
1064cabdff1aSopenharmony_ci        long_filter_high_3800(decoded0, order, shift2, count);
1065cabdff1aSopenharmony_ci    }
1066cabdff1aSopenharmony_ci
1067cabdff1aSopenharmony_ci    while (count--) {
1068cabdff1aSopenharmony_ci        if (ctx->compression_level == COMPRESSION_LEVEL_FAST) {
1069cabdff1aSopenharmony_ci            *decoded0 = filter_fast_3320(p, *decoded0, 0, YDELAYA);
1070cabdff1aSopenharmony_ci            decoded0++;
1071cabdff1aSopenharmony_ci        } else {
1072cabdff1aSopenharmony_ci            *decoded0 = filter_3800(p, *decoded0, 0, YDELAYA, YDELAYB,
1073cabdff1aSopenharmony_ci                                    start, shift);
1074cabdff1aSopenharmony_ci            decoded0++;
1075cabdff1aSopenharmony_ci        }
1076cabdff1aSopenharmony_ci
1077cabdff1aSopenharmony_ci        /* Combined */
1078cabdff1aSopenharmony_ci        p->buf++;
1079cabdff1aSopenharmony_ci        p->sample_pos++;
1080cabdff1aSopenharmony_ci
1081cabdff1aSopenharmony_ci        /* Have we filled the history buffer? */
1082cabdff1aSopenharmony_ci        if (p->buf == p->historybuffer + HISTORY_SIZE) {
1083cabdff1aSopenharmony_ci            memmove(p->historybuffer, p->buf,
1084cabdff1aSopenharmony_ci                    PREDICTOR_SIZE * sizeof(*p->historybuffer));
1085cabdff1aSopenharmony_ci            p->buf = p->historybuffer;
1086cabdff1aSopenharmony_ci        }
1087cabdff1aSopenharmony_ci    }
1088cabdff1aSopenharmony_ci}
1089cabdff1aSopenharmony_ci
1090cabdff1aSopenharmony_cistatic av_always_inline int predictor_update_3930(APEPredictor *p,
1091cabdff1aSopenharmony_ci                                                  const int decoded, const int filter,
1092cabdff1aSopenharmony_ci                                                  const int delayA)
1093cabdff1aSopenharmony_ci{
1094cabdff1aSopenharmony_ci    int32_t predictionA, sign;
1095cabdff1aSopenharmony_ci    uint32_t d0, d1, d2, d3;
1096cabdff1aSopenharmony_ci
1097cabdff1aSopenharmony_ci    p->buf[delayA]     = p->lastA[filter];
1098cabdff1aSopenharmony_ci    d0 = p->buf[delayA    ];
1099cabdff1aSopenharmony_ci    d1 = p->buf[delayA    ] - (unsigned)p->buf[delayA - 1];
1100cabdff1aSopenharmony_ci    d2 = p->buf[delayA - 1] - (unsigned)p->buf[delayA - 2];
1101cabdff1aSopenharmony_ci    d3 = p->buf[delayA - 2] - (unsigned)p->buf[delayA - 3];
1102cabdff1aSopenharmony_ci
1103cabdff1aSopenharmony_ci    predictionA = d0 * p->coeffsA[filter][0] +
1104cabdff1aSopenharmony_ci                  d1 * p->coeffsA[filter][1] +
1105cabdff1aSopenharmony_ci                  d2 * p->coeffsA[filter][2] +
1106cabdff1aSopenharmony_ci                  d3 * p->coeffsA[filter][3];
1107cabdff1aSopenharmony_ci
1108cabdff1aSopenharmony_ci    p->lastA[filter] = decoded + (predictionA >> 9);
1109cabdff1aSopenharmony_ci    p->filterA[filter] = p->lastA[filter] + ((int)(p->filterA[filter] * 31U) >> 5);
1110cabdff1aSopenharmony_ci
1111cabdff1aSopenharmony_ci    sign = APESIGN(decoded);
1112cabdff1aSopenharmony_ci    p->coeffsA[filter][0] += (((int32_t)d0 < 0) * 2 - 1) * sign;
1113cabdff1aSopenharmony_ci    p->coeffsA[filter][1] += (((int32_t)d1 < 0) * 2 - 1) * sign;
1114cabdff1aSopenharmony_ci    p->coeffsA[filter][2] += (((int32_t)d2 < 0) * 2 - 1) * sign;
1115cabdff1aSopenharmony_ci    p->coeffsA[filter][3] += (((int32_t)d3 < 0) * 2 - 1) * sign;
1116cabdff1aSopenharmony_ci
1117cabdff1aSopenharmony_ci    return p->filterA[filter];
1118cabdff1aSopenharmony_ci}
1119cabdff1aSopenharmony_ci
1120cabdff1aSopenharmony_cistatic void predictor_decode_stereo_3930(APEContext *ctx, int count)
1121cabdff1aSopenharmony_ci{
1122cabdff1aSopenharmony_ci    APEPredictor *p = &ctx->predictor;
1123cabdff1aSopenharmony_ci    int32_t *decoded0 = ctx->decoded[0];
1124cabdff1aSopenharmony_ci    int32_t *decoded1 = ctx->decoded[1];
1125cabdff1aSopenharmony_ci
1126cabdff1aSopenharmony_ci    ape_apply_filters(ctx, ctx->decoded[0], ctx->decoded[1], count);
1127cabdff1aSopenharmony_ci
1128cabdff1aSopenharmony_ci    while (count--) {
1129cabdff1aSopenharmony_ci        /* Predictor Y */
1130cabdff1aSopenharmony_ci        int Y = *decoded1, X = *decoded0;
1131cabdff1aSopenharmony_ci        *decoded0 = predictor_update_3930(p, Y, 0, YDELAYA);
1132cabdff1aSopenharmony_ci        decoded0++;
1133cabdff1aSopenharmony_ci        *decoded1 = predictor_update_3930(p, X, 1, XDELAYA);
1134cabdff1aSopenharmony_ci        decoded1++;
1135cabdff1aSopenharmony_ci
1136cabdff1aSopenharmony_ci        /* Combined */
1137cabdff1aSopenharmony_ci        p->buf++;
1138cabdff1aSopenharmony_ci
1139cabdff1aSopenharmony_ci        /* Have we filled the history buffer? */
1140cabdff1aSopenharmony_ci        if (p->buf == p->historybuffer + HISTORY_SIZE) {
1141cabdff1aSopenharmony_ci            memmove(p->historybuffer, p->buf,
1142cabdff1aSopenharmony_ci                    PREDICTOR_SIZE * sizeof(*p->historybuffer));
1143cabdff1aSopenharmony_ci            p->buf = p->historybuffer;
1144cabdff1aSopenharmony_ci        }
1145cabdff1aSopenharmony_ci    }
1146cabdff1aSopenharmony_ci}
1147cabdff1aSopenharmony_ci
1148cabdff1aSopenharmony_cistatic void predictor_decode_mono_3930(APEContext *ctx, int count)
1149cabdff1aSopenharmony_ci{
1150cabdff1aSopenharmony_ci    APEPredictor *p = &ctx->predictor;
1151cabdff1aSopenharmony_ci    int32_t *decoded0 = ctx->decoded[0];
1152cabdff1aSopenharmony_ci
1153cabdff1aSopenharmony_ci    ape_apply_filters(ctx, ctx->decoded[0], NULL, count);
1154cabdff1aSopenharmony_ci
1155cabdff1aSopenharmony_ci    while (count--) {
1156cabdff1aSopenharmony_ci        *decoded0 = predictor_update_3930(p, *decoded0, 0, YDELAYA);
1157cabdff1aSopenharmony_ci        decoded0++;
1158cabdff1aSopenharmony_ci
1159cabdff1aSopenharmony_ci        p->buf++;
1160cabdff1aSopenharmony_ci
1161cabdff1aSopenharmony_ci        /* Have we filled the history buffer? */
1162cabdff1aSopenharmony_ci        if (p->buf == p->historybuffer + HISTORY_SIZE) {
1163cabdff1aSopenharmony_ci            memmove(p->historybuffer, p->buf,
1164cabdff1aSopenharmony_ci                    PREDICTOR_SIZE * sizeof(*p->historybuffer));
1165cabdff1aSopenharmony_ci            p->buf = p->historybuffer;
1166cabdff1aSopenharmony_ci        }
1167cabdff1aSopenharmony_ci    }
1168cabdff1aSopenharmony_ci}
1169cabdff1aSopenharmony_ci
1170cabdff1aSopenharmony_cistatic av_always_inline int predictor_update_filter(APEPredictor64 *p,
1171cabdff1aSopenharmony_ci                                                    const int decoded, const int filter,
1172cabdff1aSopenharmony_ci                                                    const int delayA,  const int delayB,
1173cabdff1aSopenharmony_ci                                                    const int adaptA,  const int adaptB,
1174cabdff1aSopenharmony_ci                                                    int compression_level)
1175cabdff1aSopenharmony_ci{
1176cabdff1aSopenharmony_ci    int64_t predictionA, predictionB;
1177cabdff1aSopenharmony_ci    int32_t sign;
1178cabdff1aSopenharmony_ci
1179cabdff1aSopenharmony_ci    p->buf[delayA]     = p->lastA[filter];
1180cabdff1aSopenharmony_ci    p->buf[adaptA]     = APESIGN(p->buf[delayA]);
1181cabdff1aSopenharmony_ci    p->buf[delayA - 1] = p->buf[delayA] - (uint64_t)p->buf[delayA - 1];
1182cabdff1aSopenharmony_ci    p->buf[adaptA - 1] = APESIGN(p->buf[delayA - 1]);
1183cabdff1aSopenharmony_ci
1184cabdff1aSopenharmony_ci    predictionA = p->buf[delayA    ] * p->coeffsA[filter][0] +
1185cabdff1aSopenharmony_ci                  p->buf[delayA - 1] * p->coeffsA[filter][1] +
1186cabdff1aSopenharmony_ci                  p->buf[delayA - 2] * p->coeffsA[filter][2] +
1187cabdff1aSopenharmony_ci                  p->buf[delayA - 3] * p->coeffsA[filter][3];
1188cabdff1aSopenharmony_ci
1189cabdff1aSopenharmony_ci    /*  Apply a scaled first-order filter compression */
1190cabdff1aSopenharmony_ci    p->buf[delayB]     = p->filterA[filter ^ 1] - ((int64_t)(p->filterB[filter] * 31ULL) >> 5);
1191cabdff1aSopenharmony_ci    p->buf[adaptB]     = APESIGN(p->buf[delayB]);
1192cabdff1aSopenharmony_ci    p->buf[delayB - 1] = p->buf[delayB] - (uint64_t)p->buf[delayB - 1];
1193cabdff1aSopenharmony_ci    p->buf[adaptB - 1] = APESIGN(p->buf[delayB - 1]);
1194cabdff1aSopenharmony_ci    p->filterB[filter] = p->filterA[filter ^ 1];
1195cabdff1aSopenharmony_ci
1196cabdff1aSopenharmony_ci    predictionB = p->buf[delayB    ] * p->coeffsB[filter][0] +
1197cabdff1aSopenharmony_ci                  p->buf[delayB - 1] * p->coeffsB[filter][1] +
1198cabdff1aSopenharmony_ci                  p->buf[delayB - 2] * p->coeffsB[filter][2] +
1199cabdff1aSopenharmony_ci                  p->buf[delayB - 3] * p->coeffsB[filter][3] +
1200cabdff1aSopenharmony_ci                  p->buf[delayB - 4] * p->coeffsB[filter][4];
1201cabdff1aSopenharmony_ci
1202cabdff1aSopenharmony_ci    if (compression_level < COMPRESSION_LEVEL_INSANE) {
1203cabdff1aSopenharmony_ci        predictionA = (int32_t)predictionA;
1204cabdff1aSopenharmony_ci        predictionB = (int32_t)predictionB;
1205cabdff1aSopenharmony_ci        p->lastA[filter] = (int32_t)(decoded + (unsigned)((int32_t)(predictionA + (predictionB >> 1)) >> 10));
1206cabdff1aSopenharmony_ci    } else {
1207cabdff1aSopenharmony_ci        p->lastA[filter] = decoded + ((int64_t)((uint64_t)predictionA + (predictionB >> 1)) >> 10);
1208cabdff1aSopenharmony_ci    }
1209cabdff1aSopenharmony_ci    p->filterA[filter] = p->lastA[filter] + ((int64_t)(p->filterA[filter] * 31ULL) >> 5);
1210cabdff1aSopenharmony_ci
1211cabdff1aSopenharmony_ci    sign = APESIGN(decoded);
1212cabdff1aSopenharmony_ci    p->coeffsA[filter][0] += p->buf[adaptA    ] * sign;
1213cabdff1aSopenharmony_ci    p->coeffsA[filter][1] += p->buf[adaptA - 1] * sign;
1214cabdff1aSopenharmony_ci    p->coeffsA[filter][2] += p->buf[adaptA - 2] * sign;
1215cabdff1aSopenharmony_ci    p->coeffsA[filter][3] += p->buf[adaptA - 3] * sign;
1216cabdff1aSopenharmony_ci    p->coeffsB[filter][0] += p->buf[adaptB    ] * sign;
1217cabdff1aSopenharmony_ci    p->coeffsB[filter][1] += p->buf[adaptB - 1] * sign;
1218cabdff1aSopenharmony_ci    p->coeffsB[filter][2] += p->buf[adaptB - 2] * sign;
1219cabdff1aSopenharmony_ci    p->coeffsB[filter][3] += p->buf[adaptB - 3] * sign;
1220cabdff1aSopenharmony_ci    p->coeffsB[filter][4] += p->buf[adaptB - 4] * sign;
1221cabdff1aSopenharmony_ci
1222cabdff1aSopenharmony_ci    return p->filterA[filter];
1223cabdff1aSopenharmony_ci}
1224cabdff1aSopenharmony_ci
1225cabdff1aSopenharmony_cistatic void predictor_decode_stereo_3950(APEContext *ctx, int count)
1226cabdff1aSopenharmony_ci{
1227cabdff1aSopenharmony_ci    APEPredictor64 *p = &ctx->predictor64;
1228cabdff1aSopenharmony_ci    int32_t *decoded0 = ctx->decoded[0];
1229cabdff1aSopenharmony_ci    int32_t *decoded1 = ctx->decoded[1];
1230cabdff1aSopenharmony_ci
1231cabdff1aSopenharmony_ci    ape_apply_filters(ctx, ctx->decoded[0], ctx->decoded[1], count);
1232cabdff1aSopenharmony_ci
1233cabdff1aSopenharmony_ci    while (count--) {
1234cabdff1aSopenharmony_ci        /* Predictor Y */
1235cabdff1aSopenharmony_ci        *decoded0 = predictor_update_filter(p, *decoded0, 0, YDELAYA, YDELAYB,
1236cabdff1aSopenharmony_ci                                            YADAPTCOEFFSA, YADAPTCOEFFSB,
1237cabdff1aSopenharmony_ci                                            ctx->compression_level);
1238cabdff1aSopenharmony_ci        decoded0++;
1239cabdff1aSopenharmony_ci        *decoded1 = predictor_update_filter(p, *decoded1, 1, XDELAYA, XDELAYB,
1240cabdff1aSopenharmony_ci                                            XADAPTCOEFFSA, XADAPTCOEFFSB,
1241cabdff1aSopenharmony_ci                                            ctx->compression_level);
1242cabdff1aSopenharmony_ci        decoded1++;
1243cabdff1aSopenharmony_ci
1244cabdff1aSopenharmony_ci        /* Combined */
1245cabdff1aSopenharmony_ci        p->buf++;
1246cabdff1aSopenharmony_ci
1247cabdff1aSopenharmony_ci        /* Have we filled the history buffer? */
1248cabdff1aSopenharmony_ci        if (p->buf == p->historybuffer + HISTORY_SIZE) {
1249cabdff1aSopenharmony_ci            memmove(p->historybuffer, p->buf,
1250cabdff1aSopenharmony_ci                    PREDICTOR_SIZE * sizeof(*p->historybuffer));
1251cabdff1aSopenharmony_ci            p->buf = p->historybuffer;
1252cabdff1aSopenharmony_ci        }
1253cabdff1aSopenharmony_ci    }
1254cabdff1aSopenharmony_ci}
1255cabdff1aSopenharmony_ci
1256cabdff1aSopenharmony_cistatic void predictor_decode_mono_3950(APEContext *ctx, int count)
1257cabdff1aSopenharmony_ci{
1258cabdff1aSopenharmony_ci    APEPredictor64 *p = &ctx->predictor64;
1259cabdff1aSopenharmony_ci    int32_t *decoded0 = ctx->decoded[0];
1260cabdff1aSopenharmony_ci    int32_t predictionA, currentA, A, sign;
1261cabdff1aSopenharmony_ci
1262cabdff1aSopenharmony_ci    ape_apply_filters(ctx, ctx->decoded[0], NULL, count);
1263cabdff1aSopenharmony_ci
1264cabdff1aSopenharmony_ci    currentA = p->lastA[0];
1265cabdff1aSopenharmony_ci
1266cabdff1aSopenharmony_ci    while (count--) {
1267cabdff1aSopenharmony_ci        A = *decoded0;
1268cabdff1aSopenharmony_ci
1269cabdff1aSopenharmony_ci        p->buf[YDELAYA] = currentA;
1270cabdff1aSopenharmony_ci        p->buf[YDELAYA - 1] = p->buf[YDELAYA] - (uint64_t)p->buf[YDELAYA - 1];
1271cabdff1aSopenharmony_ci
1272cabdff1aSopenharmony_ci        predictionA = p->buf[YDELAYA    ] * p->coeffsA[0][0] +
1273cabdff1aSopenharmony_ci                      p->buf[YDELAYA - 1] * p->coeffsA[0][1] +
1274cabdff1aSopenharmony_ci                      p->buf[YDELAYA - 2] * p->coeffsA[0][2] +
1275cabdff1aSopenharmony_ci                      p->buf[YDELAYA - 3] * p->coeffsA[0][3];
1276cabdff1aSopenharmony_ci
1277cabdff1aSopenharmony_ci        currentA = A + (uint64_t)(predictionA >> 10);
1278cabdff1aSopenharmony_ci
1279cabdff1aSopenharmony_ci        p->buf[YADAPTCOEFFSA]     = APESIGN(p->buf[YDELAYA    ]);
1280cabdff1aSopenharmony_ci        p->buf[YADAPTCOEFFSA - 1] = APESIGN(p->buf[YDELAYA - 1]);
1281cabdff1aSopenharmony_ci
1282cabdff1aSopenharmony_ci        sign = APESIGN(A);
1283cabdff1aSopenharmony_ci        p->coeffsA[0][0] += p->buf[YADAPTCOEFFSA    ] * sign;
1284cabdff1aSopenharmony_ci        p->coeffsA[0][1] += p->buf[YADAPTCOEFFSA - 1] * sign;
1285cabdff1aSopenharmony_ci        p->coeffsA[0][2] += p->buf[YADAPTCOEFFSA - 2] * sign;
1286cabdff1aSopenharmony_ci        p->coeffsA[0][3] += p->buf[YADAPTCOEFFSA - 3] * sign;
1287cabdff1aSopenharmony_ci
1288cabdff1aSopenharmony_ci        p->buf++;
1289cabdff1aSopenharmony_ci
1290cabdff1aSopenharmony_ci        /* Have we filled the history buffer? */
1291cabdff1aSopenharmony_ci        if (p->buf == p->historybuffer + HISTORY_SIZE) {
1292cabdff1aSopenharmony_ci            memmove(p->historybuffer, p->buf,
1293cabdff1aSopenharmony_ci                    PREDICTOR_SIZE * sizeof(*p->historybuffer));
1294cabdff1aSopenharmony_ci            p->buf = p->historybuffer;
1295cabdff1aSopenharmony_ci        }
1296cabdff1aSopenharmony_ci
1297cabdff1aSopenharmony_ci        p->filterA[0] = currentA + (uint64_t)((int64_t)(p->filterA[0] * 31U) >> 5);
1298cabdff1aSopenharmony_ci        *(decoded0++) = p->filterA[0];
1299cabdff1aSopenharmony_ci    }
1300cabdff1aSopenharmony_ci
1301cabdff1aSopenharmony_ci    p->lastA[0] = currentA;
1302cabdff1aSopenharmony_ci}
1303cabdff1aSopenharmony_ci
1304cabdff1aSopenharmony_cistatic void do_init_filter(APEFilter *f, int16_t *buf, int order)
1305cabdff1aSopenharmony_ci{
1306cabdff1aSopenharmony_ci    f->coeffs = buf;
1307cabdff1aSopenharmony_ci    f->historybuffer = buf + order;
1308cabdff1aSopenharmony_ci    f->delay       = f->historybuffer + order * 2;
1309cabdff1aSopenharmony_ci    f->adaptcoeffs = f->historybuffer + order;
1310cabdff1aSopenharmony_ci
1311cabdff1aSopenharmony_ci    memset(f->historybuffer, 0, (order * 2) * sizeof(*f->historybuffer));
1312cabdff1aSopenharmony_ci    memset(f->coeffs, 0, order * sizeof(*f->coeffs));
1313cabdff1aSopenharmony_ci    f->avg = 0;
1314cabdff1aSopenharmony_ci}
1315cabdff1aSopenharmony_ci
1316cabdff1aSopenharmony_cistatic void init_filter(APEContext *ctx, APEFilter *f, int16_t *buf, int order)
1317cabdff1aSopenharmony_ci{
1318cabdff1aSopenharmony_ci    do_init_filter(&f[0], buf, order);
1319cabdff1aSopenharmony_ci    do_init_filter(&f[1], buf + order * 3 + HISTORY_SIZE, order);
1320cabdff1aSopenharmony_ci}
1321cabdff1aSopenharmony_ci
1322cabdff1aSopenharmony_cistatic void do_apply_filter(APEContext *ctx, int version, APEFilter *f,
1323cabdff1aSopenharmony_ci                            int32_t *data, int count, int order, int fracbits)
1324cabdff1aSopenharmony_ci{
1325cabdff1aSopenharmony_ci    int res;
1326cabdff1aSopenharmony_ci    unsigned absres;
1327cabdff1aSopenharmony_ci
1328cabdff1aSopenharmony_ci    while (count--) {
1329cabdff1aSopenharmony_ci        /* round fixedpoint scalar product */
1330cabdff1aSopenharmony_ci        res = ctx->adsp.scalarproduct_and_madd_int16(f->coeffs,
1331cabdff1aSopenharmony_ci                                                     f->delay - order,
1332cabdff1aSopenharmony_ci                                                     f->adaptcoeffs - order,
1333cabdff1aSopenharmony_ci                                                     order, APESIGN(*data));
1334cabdff1aSopenharmony_ci        res = (int64_t)(res + (1LL << (fracbits - 1))) >> fracbits;
1335cabdff1aSopenharmony_ci        res += (unsigned)*data;
1336cabdff1aSopenharmony_ci        *data++ = res;
1337cabdff1aSopenharmony_ci
1338cabdff1aSopenharmony_ci        /* Update the output history */
1339cabdff1aSopenharmony_ci        *f->delay++ = av_clip_int16(res);
1340cabdff1aSopenharmony_ci
1341cabdff1aSopenharmony_ci        if (version < 3980) {
1342cabdff1aSopenharmony_ci            /* Version ??? to < 3.98 files (untested) */
1343cabdff1aSopenharmony_ci            f->adaptcoeffs[0]  = (res == 0) ? 0 : ((res >> 28) & 8) - 4;
1344cabdff1aSopenharmony_ci            f->adaptcoeffs[-4] >>= 1;
1345cabdff1aSopenharmony_ci            f->adaptcoeffs[-8] >>= 1;
1346cabdff1aSopenharmony_ci        } else {
1347cabdff1aSopenharmony_ci            /* Version 3.98 and later files */
1348cabdff1aSopenharmony_ci
1349cabdff1aSopenharmony_ci            /* Update the adaption coefficients */
1350cabdff1aSopenharmony_ci            absres = FFABSU(res);
1351cabdff1aSopenharmony_ci            if (absres)
1352cabdff1aSopenharmony_ci                *f->adaptcoeffs = APESIGN(res) *
1353cabdff1aSopenharmony_ci                                  (8 << ((absres > f->avg * 3LL) + (absres > (f->avg + f->avg / 3))));
1354cabdff1aSopenharmony_ci                /* equivalent to the following code
1355cabdff1aSopenharmony_ci                    if (absres <= f->avg * 4 / 3)
1356cabdff1aSopenharmony_ci                        *f->adaptcoeffs = APESIGN(res) * 8;
1357cabdff1aSopenharmony_ci                    else if (absres <= f->avg * 3)
1358cabdff1aSopenharmony_ci                        *f->adaptcoeffs = APESIGN(res) * 16;
1359cabdff1aSopenharmony_ci                    else
1360cabdff1aSopenharmony_ci                        *f->adaptcoeffs = APESIGN(res) * 32;
1361cabdff1aSopenharmony_ci                */
1362cabdff1aSopenharmony_ci            else
1363cabdff1aSopenharmony_ci                *f->adaptcoeffs = 0;
1364cabdff1aSopenharmony_ci
1365cabdff1aSopenharmony_ci            f->avg += (int)(absres - (unsigned)f->avg) / 16;
1366cabdff1aSopenharmony_ci
1367cabdff1aSopenharmony_ci            f->adaptcoeffs[-1] >>= 1;
1368cabdff1aSopenharmony_ci            f->adaptcoeffs[-2] >>= 1;
1369cabdff1aSopenharmony_ci            f->adaptcoeffs[-8] >>= 1;
1370cabdff1aSopenharmony_ci        }
1371cabdff1aSopenharmony_ci
1372cabdff1aSopenharmony_ci        f->adaptcoeffs++;
1373cabdff1aSopenharmony_ci
1374cabdff1aSopenharmony_ci        /* Have we filled the history buffer? */
1375cabdff1aSopenharmony_ci        if (f->delay == f->historybuffer + HISTORY_SIZE + (order * 2)) {
1376cabdff1aSopenharmony_ci            memmove(f->historybuffer, f->delay - (order * 2),
1377cabdff1aSopenharmony_ci                    (order * 2) * sizeof(*f->historybuffer));
1378cabdff1aSopenharmony_ci            f->delay = f->historybuffer + order * 2;
1379cabdff1aSopenharmony_ci            f->adaptcoeffs = f->historybuffer + order;
1380cabdff1aSopenharmony_ci        }
1381cabdff1aSopenharmony_ci    }
1382cabdff1aSopenharmony_ci}
1383cabdff1aSopenharmony_ci
1384cabdff1aSopenharmony_cistatic void apply_filter(APEContext *ctx, APEFilter *f,
1385cabdff1aSopenharmony_ci                         int32_t *data0, int32_t *data1,
1386cabdff1aSopenharmony_ci                         int count, int order, int fracbits)
1387cabdff1aSopenharmony_ci{
1388cabdff1aSopenharmony_ci    do_apply_filter(ctx, ctx->fileversion, &f[0], data0, count, order, fracbits);
1389cabdff1aSopenharmony_ci    if (data1)
1390cabdff1aSopenharmony_ci        do_apply_filter(ctx, ctx->fileversion, &f[1], data1, count, order, fracbits);
1391cabdff1aSopenharmony_ci}
1392cabdff1aSopenharmony_ci
1393cabdff1aSopenharmony_cistatic void ape_apply_filters(APEContext *ctx, int32_t *decoded0,
1394cabdff1aSopenharmony_ci                              int32_t *decoded1, int count)
1395cabdff1aSopenharmony_ci{
1396cabdff1aSopenharmony_ci    int i;
1397cabdff1aSopenharmony_ci
1398cabdff1aSopenharmony_ci    for (i = 0; i < APE_FILTER_LEVELS; i++) {
1399cabdff1aSopenharmony_ci        if (!ape_filter_orders[ctx->fset][i])
1400cabdff1aSopenharmony_ci            break;
1401cabdff1aSopenharmony_ci        apply_filter(ctx, ctx->filters[i], decoded0, decoded1, count,
1402cabdff1aSopenharmony_ci                     ape_filter_orders[ctx->fset][i],
1403cabdff1aSopenharmony_ci                     ape_filter_fracbits[ctx->fset][i]);
1404cabdff1aSopenharmony_ci    }
1405cabdff1aSopenharmony_ci}
1406cabdff1aSopenharmony_ci
1407cabdff1aSopenharmony_cistatic int init_frame_decoder(APEContext *ctx)
1408cabdff1aSopenharmony_ci{
1409cabdff1aSopenharmony_ci    int i, ret;
1410cabdff1aSopenharmony_ci    if ((ret = init_entropy_decoder(ctx)) < 0)
1411cabdff1aSopenharmony_ci        return ret;
1412cabdff1aSopenharmony_ci    init_predictor_decoder(ctx);
1413cabdff1aSopenharmony_ci
1414cabdff1aSopenharmony_ci    for (i = 0; i < APE_FILTER_LEVELS; i++) {
1415cabdff1aSopenharmony_ci        if (!ape_filter_orders[ctx->fset][i])
1416cabdff1aSopenharmony_ci            break;
1417cabdff1aSopenharmony_ci        init_filter(ctx, ctx->filters[i], ctx->filterbuf[i],
1418cabdff1aSopenharmony_ci                    ape_filter_orders[ctx->fset][i]);
1419cabdff1aSopenharmony_ci    }
1420cabdff1aSopenharmony_ci    return 0;
1421cabdff1aSopenharmony_ci}
1422cabdff1aSopenharmony_ci
1423cabdff1aSopenharmony_cistatic void ape_unpack_mono(APEContext *ctx, int count)
1424cabdff1aSopenharmony_ci{
1425cabdff1aSopenharmony_ci    if (ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE) {
1426cabdff1aSopenharmony_ci        /* We are pure silence, so we're done. */
1427cabdff1aSopenharmony_ci        av_log(ctx->avctx, AV_LOG_DEBUG, "pure silence mono\n");
1428cabdff1aSopenharmony_ci        return;
1429cabdff1aSopenharmony_ci    }
1430cabdff1aSopenharmony_ci
1431cabdff1aSopenharmony_ci    ctx->entropy_decode_mono(ctx, count);
1432cabdff1aSopenharmony_ci    if (ctx->error)
1433cabdff1aSopenharmony_ci        return;
1434cabdff1aSopenharmony_ci
1435cabdff1aSopenharmony_ci    /* Now apply the predictor decoding */
1436cabdff1aSopenharmony_ci    ctx->predictor_decode_mono(ctx, count);
1437cabdff1aSopenharmony_ci
1438cabdff1aSopenharmony_ci    /* Pseudo-stereo - just copy left channel to right channel */
1439cabdff1aSopenharmony_ci    if (ctx->channels == 2) {
1440cabdff1aSopenharmony_ci        memcpy(ctx->decoded[1], ctx->decoded[0], count * sizeof(*ctx->decoded[1]));
1441cabdff1aSopenharmony_ci    }
1442cabdff1aSopenharmony_ci}
1443cabdff1aSopenharmony_ci
1444cabdff1aSopenharmony_cistatic void ape_unpack_stereo(APEContext *ctx, int count)
1445cabdff1aSopenharmony_ci{
1446cabdff1aSopenharmony_ci    unsigned left, right;
1447cabdff1aSopenharmony_ci    int32_t *decoded0 = ctx->decoded[0];
1448cabdff1aSopenharmony_ci    int32_t *decoded1 = ctx->decoded[1];
1449cabdff1aSopenharmony_ci
1450cabdff1aSopenharmony_ci    if ((ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE) == APE_FRAMECODE_STEREO_SILENCE) {
1451cabdff1aSopenharmony_ci        /* We are pure silence, so we're done. */
1452cabdff1aSopenharmony_ci        av_log(ctx->avctx, AV_LOG_DEBUG, "pure silence stereo\n");
1453cabdff1aSopenharmony_ci        return;
1454cabdff1aSopenharmony_ci    }
1455cabdff1aSopenharmony_ci
1456cabdff1aSopenharmony_ci    ctx->entropy_decode_stereo(ctx, count);
1457cabdff1aSopenharmony_ci    if (ctx->error)
1458cabdff1aSopenharmony_ci        return;
1459cabdff1aSopenharmony_ci
1460cabdff1aSopenharmony_ci    /* Now apply the predictor decoding */
1461cabdff1aSopenharmony_ci    ctx->predictor_decode_stereo(ctx, count);
1462cabdff1aSopenharmony_ci
1463cabdff1aSopenharmony_ci    /* Decorrelate and scale to output depth */
1464cabdff1aSopenharmony_ci    while (count--) {
1465cabdff1aSopenharmony_ci        left = *decoded1 - (unsigned)(*decoded0 / 2);
1466cabdff1aSopenharmony_ci        right = left + *decoded0;
1467cabdff1aSopenharmony_ci
1468cabdff1aSopenharmony_ci        *(decoded0++) = left;
1469cabdff1aSopenharmony_ci        *(decoded1++) = right;
1470cabdff1aSopenharmony_ci    }
1471cabdff1aSopenharmony_ci}
1472cabdff1aSopenharmony_ci
1473cabdff1aSopenharmony_cistatic int ape_decode_frame(AVCodecContext *avctx, AVFrame *frame,
1474cabdff1aSopenharmony_ci                            int *got_frame_ptr, AVPacket *avpkt)
1475cabdff1aSopenharmony_ci{
1476cabdff1aSopenharmony_ci    const uint8_t *buf = avpkt->data;
1477cabdff1aSopenharmony_ci    APEContext *s = avctx->priv_data;
1478cabdff1aSopenharmony_ci    uint8_t *sample8;
1479cabdff1aSopenharmony_ci    int16_t *sample16;
1480cabdff1aSopenharmony_ci    int32_t *sample24;
1481cabdff1aSopenharmony_ci    int i, ch, ret;
1482cabdff1aSopenharmony_ci    int blockstodecode;
1483cabdff1aSopenharmony_ci    uint64_t decoded_buffer_size;
1484cabdff1aSopenharmony_ci
1485cabdff1aSopenharmony_ci    /* this should never be negative, but bad things will happen if it is, so
1486cabdff1aSopenharmony_ci       check it just to make sure. */
1487cabdff1aSopenharmony_ci    av_assert0(s->samples >= 0);
1488cabdff1aSopenharmony_ci
1489cabdff1aSopenharmony_ci    if(!s->samples){
1490cabdff1aSopenharmony_ci        uint32_t nblocks, offset;
1491cabdff1aSopenharmony_ci        int buf_size;
1492cabdff1aSopenharmony_ci
1493cabdff1aSopenharmony_ci        if (!avpkt->size) {
1494cabdff1aSopenharmony_ci            *got_frame_ptr = 0;
1495cabdff1aSopenharmony_ci            return 0;
1496cabdff1aSopenharmony_ci        }
1497cabdff1aSopenharmony_ci        if (avpkt->size < 8) {
1498cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "Packet is too small\n");
1499cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1500cabdff1aSopenharmony_ci        }
1501cabdff1aSopenharmony_ci        buf_size = avpkt->size & ~3;
1502cabdff1aSopenharmony_ci        if (buf_size != avpkt->size) {
1503cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_WARNING, "packet size is not a multiple of 4. "
1504cabdff1aSopenharmony_ci                   "extra bytes at the end will be skipped.\n");
1505cabdff1aSopenharmony_ci        }
1506cabdff1aSopenharmony_ci        if (s->fileversion < 3950) // previous versions overread two bytes
1507cabdff1aSopenharmony_ci            buf_size += 2;
1508cabdff1aSopenharmony_ci        av_fast_padded_malloc(&s->data, &s->data_size, buf_size);
1509cabdff1aSopenharmony_ci        if (!s->data)
1510cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
1511cabdff1aSopenharmony_ci        s->bdsp.bswap_buf((uint32_t *) s->data, (const uint32_t *) buf,
1512cabdff1aSopenharmony_ci                          buf_size >> 2);
1513cabdff1aSopenharmony_ci        memset(s->data + (buf_size & ~3), 0, buf_size & 3);
1514cabdff1aSopenharmony_ci        s->ptr = s->data;
1515cabdff1aSopenharmony_ci        s->data_end = s->data + buf_size;
1516cabdff1aSopenharmony_ci
1517cabdff1aSopenharmony_ci        nblocks = bytestream_get_be32(&s->ptr);
1518cabdff1aSopenharmony_ci        offset  = bytestream_get_be32(&s->ptr);
1519cabdff1aSopenharmony_ci        if (s->fileversion >= 3900) {
1520cabdff1aSopenharmony_ci            if (offset > 3) {
1521cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "Incorrect offset passed\n");
1522cabdff1aSopenharmony_ci                av_freep(&s->data);
1523cabdff1aSopenharmony_ci                s->data_size = 0;
1524cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1525cabdff1aSopenharmony_ci            }
1526cabdff1aSopenharmony_ci            if (s->data_end - s->ptr < offset) {
1527cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "Packet is too small\n");
1528cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1529cabdff1aSopenharmony_ci            }
1530cabdff1aSopenharmony_ci            s->ptr += offset;
1531cabdff1aSopenharmony_ci        } else {
1532cabdff1aSopenharmony_ci            if ((ret = init_get_bits8(&s->gb, s->ptr, s->data_end - s->ptr)) < 0)
1533cabdff1aSopenharmony_ci                return ret;
1534cabdff1aSopenharmony_ci            if (s->fileversion > 3800)
1535cabdff1aSopenharmony_ci                skip_bits_long(&s->gb, offset * 8);
1536cabdff1aSopenharmony_ci            else
1537cabdff1aSopenharmony_ci                skip_bits_long(&s->gb, offset);
1538cabdff1aSopenharmony_ci        }
1539cabdff1aSopenharmony_ci
1540cabdff1aSopenharmony_ci        if (!nblocks || nblocks > INT_MAX / 2 / sizeof(*s->decoded_buffer) - 8) {
1541cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "Invalid sample count: %"PRIu32".\n",
1542cabdff1aSopenharmony_ci                   nblocks);
1543cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1544cabdff1aSopenharmony_ci        }
1545cabdff1aSopenharmony_ci
1546cabdff1aSopenharmony_ci        /* Initialize the frame decoder */
1547cabdff1aSopenharmony_ci        if (init_frame_decoder(s) < 0) {
1548cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "Error reading frame header\n");
1549cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1550cabdff1aSopenharmony_ci        }
1551cabdff1aSopenharmony_ci        s->samples = nblocks;
1552cabdff1aSopenharmony_ci    }
1553cabdff1aSopenharmony_ci
1554cabdff1aSopenharmony_ci    if (!s->data) {
1555cabdff1aSopenharmony_ci        *got_frame_ptr = 0;
1556cabdff1aSopenharmony_ci        return avpkt->size;
1557cabdff1aSopenharmony_ci    }
1558cabdff1aSopenharmony_ci
1559cabdff1aSopenharmony_ci    blockstodecode = FFMIN(s->blocks_per_loop, s->samples);
1560cabdff1aSopenharmony_ci    // for old files coefficients were not interleaved,
1561cabdff1aSopenharmony_ci    // so we need to decode all of them at once
1562cabdff1aSopenharmony_ci    if (s->fileversion < 3930)
1563cabdff1aSopenharmony_ci        blockstodecode = s->samples;
1564cabdff1aSopenharmony_ci
1565cabdff1aSopenharmony_ci    /* reallocate decoded sample buffer if needed */
1566cabdff1aSopenharmony_ci    decoded_buffer_size = 2LL * FFALIGN(blockstodecode, 8) * sizeof(*s->decoded_buffer);
1567cabdff1aSopenharmony_ci    av_assert0(decoded_buffer_size <= INT_MAX);
1568cabdff1aSopenharmony_ci
1569cabdff1aSopenharmony_ci    /* get output buffer */
1570cabdff1aSopenharmony_ci    frame->nb_samples = blockstodecode;
1571cabdff1aSopenharmony_ci    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
1572cabdff1aSopenharmony_ci        s->samples=0;
1573cabdff1aSopenharmony_ci        return ret;
1574cabdff1aSopenharmony_ci    }
1575cabdff1aSopenharmony_ci
1576cabdff1aSopenharmony_ci    av_fast_malloc(&s->decoded_buffer, &s->decoded_size, decoded_buffer_size);
1577cabdff1aSopenharmony_ci    if (!s->decoded_buffer)
1578cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
1579cabdff1aSopenharmony_ci    memset(s->decoded_buffer, 0, decoded_buffer_size);
1580cabdff1aSopenharmony_ci    s->decoded[0] = s->decoded_buffer;
1581cabdff1aSopenharmony_ci    s->decoded[1] = s->decoded_buffer + FFALIGN(blockstodecode, 8);
1582cabdff1aSopenharmony_ci
1583cabdff1aSopenharmony_ci    s->error=0;
1584cabdff1aSopenharmony_ci
1585cabdff1aSopenharmony_ci    if ((s->channels == 1) || (s->frameflags & APE_FRAMECODE_PSEUDO_STEREO))
1586cabdff1aSopenharmony_ci        ape_unpack_mono(s, blockstodecode);
1587cabdff1aSopenharmony_ci    else
1588cabdff1aSopenharmony_ci        ape_unpack_stereo(s, blockstodecode);
1589cabdff1aSopenharmony_ci    emms_c();
1590cabdff1aSopenharmony_ci
1591cabdff1aSopenharmony_ci    if (s->error) {
1592cabdff1aSopenharmony_ci        s->samples=0;
1593cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Error decoding frame\n");
1594cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1595cabdff1aSopenharmony_ci    }
1596cabdff1aSopenharmony_ci
1597cabdff1aSopenharmony_ci    switch (s->bps) {
1598cabdff1aSopenharmony_ci    case 8:
1599cabdff1aSopenharmony_ci        for (ch = 0; ch < s->channels; ch++) {
1600cabdff1aSopenharmony_ci            sample8 = (uint8_t *)frame->data[ch];
1601cabdff1aSopenharmony_ci            for (i = 0; i < blockstodecode; i++)
1602cabdff1aSopenharmony_ci                *sample8++ = (s->decoded[ch][i] + 0x80U) & 0xff;
1603cabdff1aSopenharmony_ci        }
1604cabdff1aSopenharmony_ci        break;
1605cabdff1aSopenharmony_ci    case 16:
1606cabdff1aSopenharmony_ci        for (ch = 0; ch < s->channels; ch++) {
1607cabdff1aSopenharmony_ci            sample16 = (int16_t *)frame->data[ch];
1608cabdff1aSopenharmony_ci            for (i = 0; i < blockstodecode; i++)
1609cabdff1aSopenharmony_ci                *sample16++ = s->decoded[ch][i];
1610cabdff1aSopenharmony_ci        }
1611cabdff1aSopenharmony_ci        break;
1612cabdff1aSopenharmony_ci    case 24:
1613cabdff1aSopenharmony_ci        for (ch = 0; ch < s->channels; ch++) {
1614cabdff1aSopenharmony_ci            sample24 = (int32_t *)frame->data[ch];
1615cabdff1aSopenharmony_ci            for (i = 0; i < blockstodecode; i++)
1616cabdff1aSopenharmony_ci                *sample24++ = s->decoded[ch][i] * 256U;
1617cabdff1aSopenharmony_ci        }
1618cabdff1aSopenharmony_ci        break;
1619cabdff1aSopenharmony_ci    }
1620cabdff1aSopenharmony_ci
1621cabdff1aSopenharmony_ci    s->samples -= blockstodecode;
1622cabdff1aSopenharmony_ci
1623cabdff1aSopenharmony_ci    if (avctx->err_recognition & AV_EF_CRCCHECK &&
1624cabdff1aSopenharmony_ci        s->fileversion >= 3900) {
1625cabdff1aSopenharmony_ci        uint32_t crc = s->CRC_state;
1626cabdff1aSopenharmony_ci        const AVCRC *crc_tab = av_crc_get_table(AV_CRC_32_IEEE_LE);
1627cabdff1aSopenharmony_ci        int stride = s->bps == 24 ? 4 : (s->bps>>3);
1628cabdff1aSopenharmony_ci        int offset = s->bps == 24;
1629cabdff1aSopenharmony_ci        int bytes  = s->bps >> 3;
1630cabdff1aSopenharmony_ci
1631cabdff1aSopenharmony_ci        for (i = 0; i < blockstodecode; i++) {
1632cabdff1aSopenharmony_ci            for (ch = 0; ch < s->channels; ch++) {
1633cabdff1aSopenharmony_ci#if HAVE_BIGENDIAN
1634cabdff1aSopenharmony_ci                uint8_t *smp_native = frame->data[ch] + i*stride;
1635cabdff1aSopenharmony_ci                uint8_t smp[4];
1636cabdff1aSopenharmony_ci                for(int j = 0; j<stride; j++)
1637cabdff1aSopenharmony_ci                    smp[j] = smp_native[stride-j-1];
1638cabdff1aSopenharmony_ci#else
1639cabdff1aSopenharmony_ci                uint8_t *smp = frame->data[ch] + i*stride;
1640cabdff1aSopenharmony_ci#endif
1641cabdff1aSopenharmony_ci                crc = av_crc(crc_tab, crc, smp+offset, bytes);
1642cabdff1aSopenharmony_ci            }
1643cabdff1aSopenharmony_ci        }
1644cabdff1aSopenharmony_ci
1645cabdff1aSopenharmony_ci        if (!s->samples && (~crc >> 1) ^ s->CRC) {
1646cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "CRC mismatch! Previously decoded "
1647cabdff1aSopenharmony_ci                   "frames may have been affected as well.\n");
1648cabdff1aSopenharmony_ci            if (avctx->err_recognition & AV_EF_EXPLODE)
1649cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1650cabdff1aSopenharmony_ci        }
1651cabdff1aSopenharmony_ci
1652cabdff1aSopenharmony_ci        s->CRC_state = crc;
1653cabdff1aSopenharmony_ci    }
1654cabdff1aSopenharmony_ci
1655cabdff1aSopenharmony_ci    *got_frame_ptr = 1;
1656cabdff1aSopenharmony_ci
1657cabdff1aSopenharmony_ci    return !s->samples ? avpkt->size : 0;
1658cabdff1aSopenharmony_ci}
1659cabdff1aSopenharmony_ci
1660cabdff1aSopenharmony_cistatic void ape_flush(AVCodecContext *avctx)
1661cabdff1aSopenharmony_ci{
1662cabdff1aSopenharmony_ci    APEContext *s = avctx->priv_data;
1663cabdff1aSopenharmony_ci    s->samples= 0;
1664cabdff1aSopenharmony_ci}
1665cabdff1aSopenharmony_ci
1666cabdff1aSopenharmony_ci#define OFFSET(x) offsetof(APEContext, x)
1667cabdff1aSopenharmony_ci#define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM)
1668cabdff1aSopenharmony_cistatic const AVOption options[] = {
1669cabdff1aSopenharmony_ci    { "max_samples", "maximum number of samples decoded per call",             OFFSET(blocks_per_loop), AV_OPT_TYPE_INT,   { .i64 = 4608 },    1,       INT_MAX, PAR, "max_samples" },
1670cabdff1aSopenharmony_ci    { "all",         "no maximum. decode all samples for each packet at once", 0,                       AV_OPT_TYPE_CONST, { .i64 = INT_MAX }, INT_MIN, INT_MAX, PAR, "max_samples" },
1671cabdff1aSopenharmony_ci    { NULL},
1672cabdff1aSopenharmony_ci};
1673cabdff1aSopenharmony_ci
1674cabdff1aSopenharmony_cistatic const AVClass ape_decoder_class = {
1675cabdff1aSopenharmony_ci    .class_name = "APE decoder",
1676cabdff1aSopenharmony_ci    .item_name  = av_default_item_name,
1677cabdff1aSopenharmony_ci    .option     = options,
1678cabdff1aSopenharmony_ci    .version    = LIBAVUTIL_VERSION_INT,
1679cabdff1aSopenharmony_ci};
1680cabdff1aSopenharmony_ci
1681cabdff1aSopenharmony_ciconst FFCodec ff_ape_decoder = {
1682cabdff1aSopenharmony_ci    .p.name         = "ape",
1683cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("Monkey's Audio"),
1684cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_AUDIO,
1685cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_APE,
1686cabdff1aSopenharmony_ci    .priv_data_size = sizeof(APEContext),
1687cabdff1aSopenharmony_ci    .init           = ape_decode_init,
1688cabdff1aSopenharmony_ci    .close          = ape_decode_close,
1689cabdff1aSopenharmony_ci    FF_CODEC_DECODE_CB(ape_decode_frame),
1690cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DELAY |
1691cabdff1aSopenharmony_ci                      AV_CODEC_CAP_DR1,
1692cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
1693cabdff1aSopenharmony_ci    .flush          = ape_flush,
1694cabdff1aSopenharmony_ci    .p.sample_fmts  = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_U8P,
1695cabdff1aSopenharmony_ci                                                      AV_SAMPLE_FMT_S16P,
1696cabdff1aSopenharmony_ci                                                      AV_SAMPLE_FMT_S32P,
1697cabdff1aSopenharmony_ci                                                      AV_SAMPLE_FMT_NONE },
1698cabdff1aSopenharmony_ci    .p.priv_class   = &ape_decoder_class,
1699cabdff1aSopenharmony_ci};
1700