1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Shorten decoder
3cabdff1aSopenharmony_ci * Copyright (c) 2005 Jeff Muizelaar
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci/**
23cabdff1aSopenharmony_ci * @file
24cabdff1aSopenharmony_ci * Shorten decoder
25cabdff1aSopenharmony_ci * @author Jeff Muizelaar
26cabdff1aSopenharmony_ci */
27cabdff1aSopenharmony_ci
28cabdff1aSopenharmony_ci#include <limits.h>
29cabdff1aSopenharmony_ci#include "avcodec.h"
30cabdff1aSopenharmony_ci#include "bswapdsp.h"
31cabdff1aSopenharmony_ci#include "bytestream.h"
32cabdff1aSopenharmony_ci#include "codec_internal.h"
33cabdff1aSopenharmony_ci#include "get_bits.h"
34cabdff1aSopenharmony_ci#include "golomb.h"
35cabdff1aSopenharmony_ci#include "internal.h"
36cabdff1aSopenharmony_ci
37cabdff1aSopenharmony_ci#define MAX_CHANNELS 8
38cabdff1aSopenharmony_ci#define MAX_BLOCKSIZE 65535
39cabdff1aSopenharmony_ci
40cabdff1aSopenharmony_ci#define OUT_BUFFER_SIZE 16384
41cabdff1aSopenharmony_ci
42cabdff1aSopenharmony_ci#define ULONGSIZE 2
43cabdff1aSopenharmony_ci
44cabdff1aSopenharmony_ci#define WAVE_FORMAT_PCM 0x0001
45cabdff1aSopenharmony_ci
46cabdff1aSopenharmony_ci#define DEFAULT_BLOCK_SIZE 256
47cabdff1aSopenharmony_ci
48cabdff1aSopenharmony_ci#define TYPESIZE 4
49cabdff1aSopenharmony_ci#define CHANSIZE 0
50cabdff1aSopenharmony_ci#define LPCQSIZE 2
51cabdff1aSopenharmony_ci#define ENERGYSIZE 3
52cabdff1aSopenharmony_ci#define BITSHIFTSIZE 2
53cabdff1aSopenharmony_ci
54cabdff1aSopenharmony_ci#define TYPE_S8    1
55cabdff1aSopenharmony_ci#define TYPE_U8    2
56cabdff1aSopenharmony_ci#define TYPE_S16HL 3
57cabdff1aSopenharmony_ci#define TYPE_U16HL 4
58cabdff1aSopenharmony_ci#define TYPE_S16LH 5
59cabdff1aSopenharmony_ci#define TYPE_U16LH 6
60cabdff1aSopenharmony_ci
61cabdff1aSopenharmony_ci#define NWRAP 3
62cabdff1aSopenharmony_ci#define NSKIPSIZE 1
63cabdff1aSopenharmony_ci
64cabdff1aSopenharmony_ci#define LPCQUANT 5
65cabdff1aSopenharmony_ci#define V2LPCQOFFSET (1 << LPCQUANT)
66cabdff1aSopenharmony_ci
67cabdff1aSopenharmony_ci#define FNSIZE 2
68cabdff1aSopenharmony_ci#define FN_DIFF0        0
69cabdff1aSopenharmony_ci#define FN_DIFF1        1
70cabdff1aSopenharmony_ci#define FN_DIFF2        2
71cabdff1aSopenharmony_ci#define FN_DIFF3        3
72cabdff1aSopenharmony_ci#define FN_QUIT         4
73cabdff1aSopenharmony_ci#define FN_BLOCKSIZE    5
74cabdff1aSopenharmony_ci#define FN_BITSHIFT     6
75cabdff1aSopenharmony_ci#define FN_QLPC         7
76cabdff1aSopenharmony_ci#define FN_ZERO         8
77cabdff1aSopenharmony_ci#define FN_VERBATIM     9
78cabdff1aSopenharmony_ci
79cabdff1aSopenharmony_ci/** indicates if the FN_* command is audio or non-audio */
80cabdff1aSopenharmony_cistatic const uint8_t is_audio_command[10] = { 1, 1, 1, 1, 0, 0, 0, 1, 1, 0 };
81cabdff1aSopenharmony_ci
82cabdff1aSopenharmony_ci#define VERBATIM_CKSIZE_SIZE 5
83cabdff1aSopenharmony_ci#define VERBATIM_BYTE_SIZE 8
84cabdff1aSopenharmony_ci#define CANONICAL_HEADER_SIZE 44
85cabdff1aSopenharmony_ci
86cabdff1aSopenharmony_citypedef struct ShortenContext {
87cabdff1aSopenharmony_ci    AVCodecContext *avctx;
88cabdff1aSopenharmony_ci    GetBitContext gb;
89cabdff1aSopenharmony_ci
90cabdff1aSopenharmony_ci    int min_framesize, max_framesize;
91cabdff1aSopenharmony_ci    unsigned channels;
92cabdff1aSopenharmony_ci
93cabdff1aSopenharmony_ci    int32_t *decoded[MAX_CHANNELS];
94cabdff1aSopenharmony_ci    int32_t *decoded_base[MAX_CHANNELS];
95cabdff1aSopenharmony_ci    int32_t *offset[MAX_CHANNELS];
96cabdff1aSopenharmony_ci    int *coeffs;
97cabdff1aSopenharmony_ci    uint8_t *bitstream;
98cabdff1aSopenharmony_ci    int bitstream_size;
99cabdff1aSopenharmony_ci    int bitstream_index;
100cabdff1aSopenharmony_ci    unsigned int allocated_bitstream_size;
101cabdff1aSopenharmony_ci    int header_size;
102cabdff1aSopenharmony_ci    uint8_t header[OUT_BUFFER_SIZE];
103cabdff1aSopenharmony_ci    int version;
104cabdff1aSopenharmony_ci    int cur_chan;
105cabdff1aSopenharmony_ci    int bitshift;
106cabdff1aSopenharmony_ci    int nmean;
107cabdff1aSopenharmony_ci    int internal_ftype;
108cabdff1aSopenharmony_ci    int nwrap;
109cabdff1aSopenharmony_ci    int blocksize;
110cabdff1aSopenharmony_ci    int bitindex;
111cabdff1aSopenharmony_ci    int32_t lpcqoffset;
112cabdff1aSopenharmony_ci    int got_header;
113cabdff1aSopenharmony_ci    int got_quit_command;
114cabdff1aSopenharmony_ci    int swap;
115cabdff1aSopenharmony_ci    BswapDSPContext bdsp;
116cabdff1aSopenharmony_ci} ShortenContext;
117cabdff1aSopenharmony_ci
118cabdff1aSopenharmony_cistatic av_cold int shorten_decode_init(AVCodecContext *avctx)
119cabdff1aSopenharmony_ci{
120cabdff1aSopenharmony_ci    ShortenContext *s = avctx->priv_data;
121cabdff1aSopenharmony_ci    s->avctx          = avctx;
122cabdff1aSopenharmony_ci
123cabdff1aSopenharmony_ci    ff_bswapdsp_init(&s->bdsp);
124cabdff1aSopenharmony_ci
125cabdff1aSopenharmony_ci    return 0;
126cabdff1aSopenharmony_ci}
127cabdff1aSopenharmony_ci
128cabdff1aSopenharmony_cistatic int allocate_buffers(ShortenContext *s)
129cabdff1aSopenharmony_ci{
130cabdff1aSopenharmony_ci    int i, chan, err;
131cabdff1aSopenharmony_ci
132cabdff1aSopenharmony_ci    for (chan = 0; chan < s->channels; chan++) {
133cabdff1aSopenharmony_ci        if (FFMAX(1, s->nmean) >= UINT_MAX / sizeof(int32_t)) {
134cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "nmean too large\n");
135cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
136cabdff1aSopenharmony_ci        }
137cabdff1aSopenharmony_ci        if (s->blocksize + (uint64_t)s->nwrap >= UINT_MAX / sizeof(int32_t)) {
138cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR,
139cabdff1aSopenharmony_ci                   "s->blocksize + s->nwrap too large\n");
140cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
141cabdff1aSopenharmony_ci        }
142cabdff1aSopenharmony_ci
143cabdff1aSopenharmony_ci        if ((err = av_reallocp_array(&s->offset[chan],
144cabdff1aSopenharmony_ci                               sizeof(int32_t),
145cabdff1aSopenharmony_ci                               FFMAX(1, s->nmean))) < 0)
146cabdff1aSopenharmony_ci            return err;
147cabdff1aSopenharmony_ci
148cabdff1aSopenharmony_ci        if ((err = av_reallocp_array(&s->decoded_base[chan], (s->blocksize + s->nwrap),
149cabdff1aSopenharmony_ci                               sizeof(s->decoded_base[0][0]))) < 0)
150cabdff1aSopenharmony_ci            return err;
151cabdff1aSopenharmony_ci        for (i = 0; i < s->nwrap; i++)
152cabdff1aSopenharmony_ci            s->decoded_base[chan][i] = 0;
153cabdff1aSopenharmony_ci        s->decoded[chan] = s->decoded_base[chan] + s->nwrap;
154cabdff1aSopenharmony_ci    }
155cabdff1aSopenharmony_ci
156cabdff1aSopenharmony_ci    if ((err = av_reallocp_array(&s->coeffs, s->nwrap, sizeof(*s->coeffs))) < 0)
157cabdff1aSopenharmony_ci        return err;
158cabdff1aSopenharmony_ci
159cabdff1aSopenharmony_ci    return 0;
160cabdff1aSopenharmony_ci}
161cabdff1aSopenharmony_ci
162cabdff1aSopenharmony_cistatic inline unsigned int get_uint(ShortenContext *s, int k)
163cabdff1aSopenharmony_ci{
164cabdff1aSopenharmony_ci    if (s->version != 0) {
165cabdff1aSopenharmony_ci        k = get_ur_golomb_shorten(&s->gb, ULONGSIZE);
166cabdff1aSopenharmony_ci        if (k > 31U)
167cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
168cabdff1aSopenharmony_ci    }
169cabdff1aSopenharmony_ci    return get_ur_golomb_shorten(&s->gb, k);
170cabdff1aSopenharmony_ci}
171cabdff1aSopenharmony_ci
172cabdff1aSopenharmony_cistatic void fix_bitshift(ShortenContext *s, int32_t *buffer)
173cabdff1aSopenharmony_ci{
174cabdff1aSopenharmony_ci    int i;
175cabdff1aSopenharmony_ci
176cabdff1aSopenharmony_ci    if (s->bitshift == 32) {
177cabdff1aSopenharmony_ci        for (i = 0; i < s->blocksize; i++)
178cabdff1aSopenharmony_ci            buffer[i] = 0;
179cabdff1aSopenharmony_ci    } else if (s->bitshift != 0) {
180cabdff1aSopenharmony_ci        for (i = 0; i < s->blocksize; i++)
181cabdff1aSopenharmony_ci            buffer[i] *= 1U << s->bitshift;
182cabdff1aSopenharmony_ci    }
183cabdff1aSopenharmony_ci}
184cabdff1aSopenharmony_ci
185cabdff1aSopenharmony_cistatic int init_offset(ShortenContext *s)
186cabdff1aSopenharmony_ci{
187cabdff1aSopenharmony_ci    int32_t mean = 0;
188cabdff1aSopenharmony_ci    int chan, i;
189cabdff1aSopenharmony_ci    int nblock = FFMAX(1, s->nmean);
190cabdff1aSopenharmony_ci    /* initialise offset */
191cabdff1aSopenharmony_ci    switch (s->internal_ftype) {
192cabdff1aSopenharmony_ci    case TYPE_U8:
193cabdff1aSopenharmony_ci        s->avctx->sample_fmt = AV_SAMPLE_FMT_U8P;
194cabdff1aSopenharmony_ci        mean = 0x80;
195cabdff1aSopenharmony_ci        break;
196cabdff1aSopenharmony_ci    case TYPE_S16HL:
197cabdff1aSopenharmony_ci    case TYPE_S16LH:
198cabdff1aSopenharmony_ci        s->avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
199cabdff1aSopenharmony_ci        break;
200cabdff1aSopenharmony_ci    default:
201cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "unknown audio type\n");
202cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
203cabdff1aSopenharmony_ci    }
204cabdff1aSopenharmony_ci
205cabdff1aSopenharmony_ci    for (chan = 0; chan < s->channels; chan++)
206cabdff1aSopenharmony_ci        for (i = 0; i < nblock; i++)
207cabdff1aSopenharmony_ci            s->offset[chan][i] = mean;
208cabdff1aSopenharmony_ci    return 0;
209cabdff1aSopenharmony_ci}
210cabdff1aSopenharmony_ci
211cabdff1aSopenharmony_cistatic int decode_aiff_header(AVCodecContext *avctx, const uint8_t *header,
212cabdff1aSopenharmony_ci                              int header_size)
213cabdff1aSopenharmony_ci{
214cabdff1aSopenharmony_ci    ShortenContext *s = avctx->priv_data;
215cabdff1aSopenharmony_ci    int len, bps, exp;
216cabdff1aSopenharmony_ci    GetByteContext gb;
217cabdff1aSopenharmony_ci    uint64_t val;
218cabdff1aSopenharmony_ci    uint32_t tag;
219cabdff1aSopenharmony_ci
220cabdff1aSopenharmony_ci    bytestream2_init(&gb, header, header_size);
221cabdff1aSopenharmony_ci
222cabdff1aSopenharmony_ci    if (bytestream2_get_le32(&gb) != MKTAG('F', 'O', 'R', 'M')) {
223cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "missing FORM tag\n");
224cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
225cabdff1aSopenharmony_ci    }
226cabdff1aSopenharmony_ci
227cabdff1aSopenharmony_ci    bytestream2_skip(&gb, 4); /* chunk size */
228cabdff1aSopenharmony_ci
229cabdff1aSopenharmony_ci    tag = bytestream2_get_le32(&gb);
230cabdff1aSopenharmony_ci    if (tag != MKTAG('A', 'I', 'F', 'F') &&
231cabdff1aSopenharmony_ci        tag != MKTAG('A', 'I', 'F', 'C')) {
232cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "missing AIFF tag\n");
233cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
234cabdff1aSopenharmony_ci    }
235cabdff1aSopenharmony_ci
236cabdff1aSopenharmony_ci    while (bytestream2_get_le32(&gb) != MKTAG('C', 'O', 'M', 'M')) {
237cabdff1aSopenharmony_ci        len = bytestream2_get_be32(&gb);
238cabdff1aSopenharmony_ci        if (len < 0 || bytestream2_get_bytes_left(&gb) < 18LL + len + (len&1)) {
239cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "no COMM chunk found\n");
240cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
241cabdff1aSopenharmony_ci        }
242cabdff1aSopenharmony_ci        bytestream2_skip(&gb, len + (len & 1));
243cabdff1aSopenharmony_ci    }
244cabdff1aSopenharmony_ci    len = bytestream2_get_be32(&gb);
245cabdff1aSopenharmony_ci
246cabdff1aSopenharmony_ci    if (len < 18) {
247cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "COMM chunk was too short\n");
248cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
249cabdff1aSopenharmony_ci    }
250cabdff1aSopenharmony_ci
251cabdff1aSopenharmony_ci    bytestream2_skip(&gb, 6);
252cabdff1aSopenharmony_ci    bps = bytestream2_get_be16(&gb);
253cabdff1aSopenharmony_ci    avctx->bits_per_coded_sample = bps;
254cabdff1aSopenharmony_ci
255cabdff1aSopenharmony_ci    s->swap = tag == MKTAG('A', 'I', 'F', 'C');
256cabdff1aSopenharmony_ci
257cabdff1aSopenharmony_ci    if (bps != 16 && bps != 8) {
258cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "unsupported number of bits per sample: %d\n", bps);
259cabdff1aSopenharmony_ci        return AVERROR(ENOSYS);
260cabdff1aSopenharmony_ci    }
261cabdff1aSopenharmony_ci
262cabdff1aSopenharmony_ci    exp = bytestream2_get_be16(&gb) - 16383 - 63;
263cabdff1aSopenharmony_ci    val = bytestream2_get_be64(&gb);
264cabdff1aSopenharmony_ci    if (exp < -63 || exp > 63) {
265cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "exp %d is out of range\n", exp);
266cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
267cabdff1aSopenharmony_ci    }
268cabdff1aSopenharmony_ci    if (exp >= 0)
269cabdff1aSopenharmony_ci        avctx->sample_rate = val << exp;
270cabdff1aSopenharmony_ci    else
271cabdff1aSopenharmony_ci        avctx->sample_rate = (val + (1ULL<<(-exp-1))) >> -exp;
272cabdff1aSopenharmony_ci    len -= 18;
273cabdff1aSopenharmony_ci    if (len > 0)
274cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_INFO, "%d header bytes unparsed\n", len);
275cabdff1aSopenharmony_ci
276cabdff1aSopenharmony_ci    return 0;
277cabdff1aSopenharmony_ci}
278cabdff1aSopenharmony_ci
279cabdff1aSopenharmony_cistatic int decode_wave_header(AVCodecContext *avctx, const uint8_t *header,
280cabdff1aSopenharmony_ci                              int header_size)
281cabdff1aSopenharmony_ci{
282cabdff1aSopenharmony_ci    int len, bps;
283cabdff1aSopenharmony_ci    short wave_format;
284cabdff1aSopenharmony_ci    GetByteContext gb;
285cabdff1aSopenharmony_ci
286cabdff1aSopenharmony_ci    bytestream2_init(&gb, header, header_size);
287cabdff1aSopenharmony_ci
288cabdff1aSopenharmony_ci    if (bytestream2_get_le32(&gb) != MKTAG('R', 'I', 'F', 'F')) {
289cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "missing RIFF tag\n");
290cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
291cabdff1aSopenharmony_ci    }
292cabdff1aSopenharmony_ci
293cabdff1aSopenharmony_ci    bytestream2_skip(&gb, 4); /* chunk size */
294cabdff1aSopenharmony_ci
295cabdff1aSopenharmony_ci    if (bytestream2_get_le32(&gb) != MKTAG('W', 'A', 'V', 'E')) {
296cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "missing WAVE tag\n");
297cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
298cabdff1aSopenharmony_ci    }
299cabdff1aSopenharmony_ci
300cabdff1aSopenharmony_ci    while (bytestream2_get_le32(&gb) != MKTAG('f', 'm', 't', ' ')) {
301cabdff1aSopenharmony_ci        len = bytestream2_get_le32(&gb);
302cabdff1aSopenharmony_ci        bytestream2_skip(&gb, len);
303cabdff1aSopenharmony_ci        if (len < 0 || bytestream2_get_bytes_left(&gb) < 16) {
304cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "no fmt chunk found\n");
305cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
306cabdff1aSopenharmony_ci        }
307cabdff1aSopenharmony_ci    }
308cabdff1aSopenharmony_ci    len = bytestream2_get_le32(&gb);
309cabdff1aSopenharmony_ci
310cabdff1aSopenharmony_ci    if (len < 16) {
311cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "fmt chunk was too short\n");
312cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
313cabdff1aSopenharmony_ci    }
314cabdff1aSopenharmony_ci
315cabdff1aSopenharmony_ci    wave_format = bytestream2_get_le16(&gb);
316cabdff1aSopenharmony_ci
317cabdff1aSopenharmony_ci    switch (wave_format) {
318cabdff1aSopenharmony_ci    case WAVE_FORMAT_PCM:
319cabdff1aSopenharmony_ci        break;
320cabdff1aSopenharmony_ci    default:
321cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "unsupported wave format\n");
322cabdff1aSopenharmony_ci        return AVERROR(ENOSYS);
323cabdff1aSopenharmony_ci    }
324cabdff1aSopenharmony_ci
325cabdff1aSopenharmony_ci    bytestream2_skip(&gb, 2); // skip channels    (already got from shorten header)
326cabdff1aSopenharmony_ci    avctx->sample_rate = bytestream2_get_le32(&gb);
327cabdff1aSopenharmony_ci    bytestream2_skip(&gb, 4); // skip bit rate    (represents original uncompressed bit rate)
328cabdff1aSopenharmony_ci    bytestream2_skip(&gb, 2); // skip block align (not needed)
329cabdff1aSopenharmony_ci    bps = bytestream2_get_le16(&gb);
330cabdff1aSopenharmony_ci    avctx->bits_per_coded_sample = bps;
331cabdff1aSopenharmony_ci
332cabdff1aSopenharmony_ci    if (bps != 16 && bps != 8) {
333cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "unsupported number of bits per sample: %d\n", bps);
334cabdff1aSopenharmony_ci        return AVERROR(ENOSYS);
335cabdff1aSopenharmony_ci    }
336cabdff1aSopenharmony_ci
337cabdff1aSopenharmony_ci    len -= 16;
338cabdff1aSopenharmony_ci    if (len > 0)
339cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_INFO, "%d header bytes unparsed\n", len);
340cabdff1aSopenharmony_ci
341cabdff1aSopenharmony_ci    return 0;
342cabdff1aSopenharmony_ci}
343cabdff1aSopenharmony_ci
344cabdff1aSopenharmony_cistatic const int fixed_coeffs[][3] = {
345cabdff1aSopenharmony_ci    { 0,  0,  0 },
346cabdff1aSopenharmony_ci    { 1,  0,  0 },
347cabdff1aSopenharmony_ci    { 2, -1,  0 },
348cabdff1aSopenharmony_ci    { 3, -3,  1 }
349cabdff1aSopenharmony_ci};
350cabdff1aSopenharmony_ci
351cabdff1aSopenharmony_cistatic int decode_subframe_lpc(ShortenContext *s, int command, int channel,
352cabdff1aSopenharmony_ci                               int residual_size, int32_t coffset)
353cabdff1aSopenharmony_ci{
354cabdff1aSopenharmony_ci    int pred_order, sum, qshift, init_sum, i, j;
355cabdff1aSopenharmony_ci    const int *coeffs;
356cabdff1aSopenharmony_ci
357cabdff1aSopenharmony_ci    if (command == FN_QLPC) {
358cabdff1aSopenharmony_ci        /* read/validate prediction order */
359cabdff1aSopenharmony_ci        pred_order = get_ur_golomb_shorten(&s->gb, LPCQSIZE);
360cabdff1aSopenharmony_ci        if ((unsigned)pred_order > s->nwrap) {
361cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "invalid pred_order %d\n",
362cabdff1aSopenharmony_ci                   pred_order);
363cabdff1aSopenharmony_ci            return AVERROR(EINVAL);
364cabdff1aSopenharmony_ci        }
365cabdff1aSopenharmony_ci        /* read LPC coefficients */
366cabdff1aSopenharmony_ci        for (i = 0; i < pred_order; i++)
367cabdff1aSopenharmony_ci            s->coeffs[i] = get_sr_golomb_shorten(&s->gb, LPCQUANT);
368cabdff1aSopenharmony_ci        coeffs = s->coeffs;
369cabdff1aSopenharmony_ci
370cabdff1aSopenharmony_ci        qshift = LPCQUANT;
371cabdff1aSopenharmony_ci    } else {
372cabdff1aSopenharmony_ci        /* fixed LPC coeffs */
373cabdff1aSopenharmony_ci        pred_order = command;
374cabdff1aSopenharmony_ci        if (pred_order >= FF_ARRAY_ELEMS(fixed_coeffs)) {
375cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "invalid pred_order %d\n",
376cabdff1aSopenharmony_ci                   pred_order);
377cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
378cabdff1aSopenharmony_ci        }
379cabdff1aSopenharmony_ci        coeffs     = fixed_coeffs[pred_order];
380cabdff1aSopenharmony_ci        qshift     = 0;
381cabdff1aSopenharmony_ci    }
382cabdff1aSopenharmony_ci
383cabdff1aSopenharmony_ci    /* subtract offset from previous samples to use in prediction */
384cabdff1aSopenharmony_ci    if (command == FN_QLPC && coffset)
385cabdff1aSopenharmony_ci        for (i = -pred_order; i < 0; i++)
386cabdff1aSopenharmony_ci            s->decoded[channel][i] -= (unsigned)coffset;
387cabdff1aSopenharmony_ci
388cabdff1aSopenharmony_ci    /* decode residual and do LPC prediction */
389cabdff1aSopenharmony_ci    init_sum = pred_order ? (command == FN_QLPC ? s->lpcqoffset : 0) : coffset;
390cabdff1aSopenharmony_ci    for (i = 0; i < s->blocksize; i++) {
391cabdff1aSopenharmony_ci        sum = init_sum;
392cabdff1aSopenharmony_ci        for (j = 0; j < pred_order; j++)
393cabdff1aSopenharmony_ci            sum += coeffs[j] * (unsigned)s->decoded[channel][i - j - 1];
394cabdff1aSopenharmony_ci        s->decoded[channel][i] = get_sr_golomb_shorten(&s->gb, residual_size) +
395cabdff1aSopenharmony_ci                                 (unsigned)(sum >> qshift);
396cabdff1aSopenharmony_ci    }
397cabdff1aSopenharmony_ci
398cabdff1aSopenharmony_ci    /* add offset to current samples */
399cabdff1aSopenharmony_ci    if (command == FN_QLPC && coffset)
400cabdff1aSopenharmony_ci        for (i = 0; i < s->blocksize; i++)
401cabdff1aSopenharmony_ci            s->decoded[channel][i] += (unsigned)coffset;
402cabdff1aSopenharmony_ci
403cabdff1aSopenharmony_ci    return 0;
404cabdff1aSopenharmony_ci}
405cabdff1aSopenharmony_ci
406cabdff1aSopenharmony_cistatic int read_header(ShortenContext *s)
407cabdff1aSopenharmony_ci{
408cabdff1aSopenharmony_ci    int i, ret;
409cabdff1aSopenharmony_ci    int maxnlpc = 0;
410cabdff1aSopenharmony_ci    /* shorten signature */
411cabdff1aSopenharmony_ci    if (get_bits_long(&s->gb, 32) != AV_RB32("ajkg")) {
412cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "missing shorten magic 'ajkg'\n");
413cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
414cabdff1aSopenharmony_ci    }
415cabdff1aSopenharmony_ci
416cabdff1aSopenharmony_ci    s->lpcqoffset     = 0;
417cabdff1aSopenharmony_ci    s->blocksize      = DEFAULT_BLOCK_SIZE;
418cabdff1aSopenharmony_ci    s->nmean          = -1;
419cabdff1aSopenharmony_ci    s->version        = get_bits(&s->gb, 8);
420cabdff1aSopenharmony_ci    s->internal_ftype = get_uint(s, TYPESIZE);
421cabdff1aSopenharmony_ci
422cabdff1aSopenharmony_ci    s->channels = get_uint(s, CHANSIZE);
423cabdff1aSopenharmony_ci    if (!s->channels) {
424cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "No channels reported\n");
425cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
426cabdff1aSopenharmony_ci    }
427cabdff1aSopenharmony_ci    if (s->channels > MAX_CHANNELS) {
428cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "too many channels: %d\n", s->channels);
429cabdff1aSopenharmony_ci        s->channels = 0;
430cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
431cabdff1aSopenharmony_ci    }
432cabdff1aSopenharmony_ci    if (s->avctx->ch_layout.nb_channels != s->channels) {
433cabdff1aSopenharmony_ci        av_channel_layout_uninit(&s->avctx->ch_layout);
434cabdff1aSopenharmony_ci        s->avctx->ch_layout.nb_channels = s->channels;
435cabdff1aSopenharmony_ci        s->avctx->ch_layout.order       = AV_CHANNEL_ORDER_UNSPEC;
436cabdff1aSopenharmony_ci    }
437cabdff1aSopenharmony_ci
438cabdff1aSopenharmony_ci    /* get blocksize if version > 0 */
439cabdff1aSopenharmony_ci    if (s->version > 0) {
440cabdff1aSopenharmony_ci        int skip_bytes;
441cabdff1aSopenharmony_ci        unsigned blocksize;
442cabdff1aSopenharmony_ci
443cabdff1aSopenharmony_ci        blocksize = get_uint(s, av_log2(DEFAULT_BLOCK_SIZE));
444cabdff1aSopenharmony_ci        if (!blocksize || blocksize > MAX_BLOCKSIZE) {
445cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR,
446cabdff1aSopenharmony_ci                   "invalid or unsupported block size: %d\n",
447cabdff1aSopenharmony_ci                   blocksize);
448cabdff1aSopenharmony_ci            return AVERROR(EINVAL);
449cabdff1aSopenharmony_ci        }
450cabdff1aSopenharmony_ci        s->blocksize = blocksize;
451cabdff1aSopenharmony_ci
452cabdff1aSopenharmony_ci        maxnlpc  = get_uint(s, LPCQSIZE);
453cabdff1aSopenharmony_ci        if (maxnlpc > 1024U) {
454cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "maxnlpc is: %d\n", maxnlpc);
455cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
456cabdff1aSopenharmony_ci        }
457cabdff1aSopenharmony_ci        s->nmean = get_uint(s, 0);
458cabdff1aSopenharmony_ci        if (s->nmean > 32768U) {
459cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "nmean is: %d\n", s->nmean);
460cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
461cabdff1aSopenharmony_ci        }
462cabdff1aSopenharmony_ci
463cabdff1aSopenharmony_ci        skip_bytes = get_uint(s, NSKIPSIZE);
464cabdff1aSopenharmony_ci        if ((unsigned)skip_bytes > FFMAX(get_bits_left(&s->gb), 0)/8) {
465cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "invalid skip_bytes: %d\n", skip_bytes);
466cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
467cabdff1aSopenharmony_ci        }
468cabdff1aSopenharmony_ci
469cabdff1aSopenharmony_ci        for (i = 0; i < skip_bytes; i++)
470cabdff1aSopenharmony_ci            skip_bits(&s->gb, 8);
471cabdff1aSopenharmony_ci    }
472cabdff1aSopenharmony_ci    s->nwrap = FFMAX(NWRAP, maxnlpc);
473cabdff1aSopenharmony_ci
474cabdff1aSopenharmony_ci    if (s->version > 1)
475cabdff1aSopenharmony_ci        s->lpcqoffset = V2LPCQOFFSET;
476cabdff1aSopenharmony_ci
477cabdff1aSopenharmony_ci    if (s->avctx->extradata_size > 0)
478cabdff1aSopenharmony_ci        goto end;
479cabdff1aSopenharmony_ci
480cabdff1aSopenharmony_ci    if (get_ur_golomb_shorten(&s->gb, FNSIZE) != FN_VERBATIM) {
481cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR,
482cabdff1aSopenharmony_ci               "missing verbatim section at beginning of stream\n");
483cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
484cabdff1aSopenharmony_ci    }
485cabdff1aSopenharmony_ci
486cabdff1aSopenharmony_ci    s->header_size = get_ur_golomb_shorten(&s->gb, VERBATIM_CKSIZE_SIZE);
487cabdff1aSopenharmony_ci    if (s->header_size >= OUT_BUFFER_SIZE ||
488cabdff1aSopenharmony_ci        s->header_size < CANONICAL_HEADER_SIZE) {
489cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "header is wrong size: %d\n",
490cabdff1aSopenharmony_ci               s->header_size);
491cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
492cabdff1aSopenharmony_ci    }
493cabdff1aSopenharmony_ci
494cabdff1aSopenharmony_ci    for (i = 0; i < s->header_size; i++)
495cabdff1aSopenharmony_ci        s->header[i] = (char)get_ur_golomb_shorten(&s->gb, VERBATIM_BYTE_SIZE);
496cabdff1aSopenharmony_ci
497cabdff1aSopenharmony_ci    if (AV_RL32(s->header) == MKTAG('R','I','F','F')) {
498cabdff1aSopenharmony_ci        if ((ret = decode_wave_header(s->avctx, s->header, s->header_size)) < 0)
499cabdff1aSopenharmony_ci            return ret;
500cabdff1aSopenharmony_ci    } else if (AV_RL32(s->header) == MKTAG('F','O','R','M')) {
501cabdff1aSopenharmony_ci        if ((ret = decode_aiff_header(s->avctx, s->header, s->header_size)) < 0)
502cabdff1aSopenharmony_ci            return ret;
503cabdff1aSopenharmony_ci    } else {
504cabdff1aSopenharmony_ci        avpriv_report_missing_feature(s->avctx, "unsupported bit packing %"
505cabdff1aSopenharmony_ci                                      PRIX32, AV_RL32(s->header));
506cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
507cabdff1aSopenharmony_ci    }
508cabdff1aSopenharmony_ci
509cabdff1aSopenharmony_ciend:
510cabdff1aSopenharmony_ci
511cabdff1aSopenharmony_ci    if ((ret = allocate_buffers(s)) < 0)
512cabdff1aSopenharmony_ci        return ret;
513cabdff1aSopenharmony_ci
514cabdff1aSopenharmony_ci    if ((ret = init_offset(s)) < 0)
515cabdff1aSopenharmony_ci        return ret;
516cabdff1aSopenharmony_ci
517cabdff1aSopenharmony_ci    s->cur_chan = 0;
518cabdff1aSopenharmony_ci    s->bitshift = 0;
519cabdff1aSopenharmony_ci
520cabdff1aSopenharmony_ci    s->got_header = 1;
521cabdff1aSopenharmony_ci
522cabdff1aSopenharmony_ci    return 0;
523cabdff1aSopenharmony_ci}
524cabdff1aSopenharmony_ci
525cabdff1aSopenharmony_cistatic int shorten_decode_frame(AVCodecContext *avctx, AVFrame *frame,
526cabdff1aSopenharmony_ci                                int *got_frame_ptr, AVPacket *avpkt)
527cabdff1aSopenharmony_ci{
528cabdff1aSopenharmony_ci    const uint8_t *buf = avpkt->data;
529cabdff1aSopenharmony_ci    int buf_size       = avpkt->size;
530cabdff1aSopenharmony_ci    ShortenContext *s  = avctx->priv_data;
531cabdff1aSopenharmony_ci    int i, input_buf_size = 0;
532cabdff1aSopenharmony_ci    int ret;
533cabdff1aSopenharmony_ci
534cabdff1aSopenharmony_ci    /* allocate internal bitstream buffer */
535cabdff1aSopenharmony_ci    if (s->max_framesize == 0) {
536cabdff1aSopenharmony_ci        void *tmp_ptr;
537cabdff1aSopenharmony_ci        s->max_framesize = 8192; // should hopefully be enough for the first header
538cabdff1aSopenharmony_ci        tmp_ptr = av_fast_realloc(s->bitstream, &s->allocated_bitstream_size,
539cabdff1aSopenharmony_ci                                  s->max_framesize + AV_INPUT_BUFFER_PADDING_SIZE);
540cabdff1aSopenharmony_ci        if (!tmp_ptr) {
541cabdff1aSopenharmony_ci            s->max_framesize = 0;
542cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "error allocating bitstream buffer\n");
543cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
544cabdff1aSopenharmony_ci        }
545cabdff1aSopenharmony_ci        memset(tmp_ptr, 0, s->allocated_bitstream_size);
546cabdff1aSopenharmony_ci        s->bitstream = tmp_ptr;
547cabdff1aSopenharmony_ci    }
548cabdff1aSopenharmony_ci
549cabdff1aSopenharmony_ci    /* append current packet data to bitstream buffer */
550cabdff1aSopenharmony_ci    buf_size       = FFMIN(buf_size, s->max_framesize - s->bitstream_size);
551cabdff1aSopenharmony_ci    input_buf_size = buf_size;
552cabdff1aSopenharmony_ci
553cabdff1aSopenharmony_ci    if (s->bitstream_index + s->bitstream_size + buf_size + AV_INPUT_BUFFER_PADDING_SIZE >
554cabdff1aSopenharmony_ci        s->allocated_bitstream_size) {
555cabdff1aSopenharmony_ci        memmove(s->bitstream, &s->bitstream[s->bitstream_index],
556cabdff1aSopenharmony_ci                s->bitstream_size);
557cabdff1aSopenharmony_ci        s->bitstream_index = 0;
558cabdff1aSopenharmony_ci    }
559cabdff1aSopenharmony_ci    if (buf)
560cabdff1aSopenharmony_ci        memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf,
561cabdff1aSopenharmony_ci               buf_size);
562cabdff1aSopenharmony_ci    buf               = &s->bitstream[s->bitstream_index];
563cabdff1aSopenharmony_ci    buf_size         += s->bitstream_size;
564cabdff1aSopenharmony_ci    s->bitstream_size = buf_size;
565cabdff1aSopenharmony_ci    memset(buf + buf_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
566cabdff1aSopenharmony_ci
567cabdff1aSopenharmony_ci    /* do not decode until buffer has at least max_framesize bytes or
568cabdff1aSopenharmony_ci     * the end of the file has been reached */
569cabdff1aSopenharmony_ci    if (buf_size < s->max_framesize && avpkt->data) {
570cabdff1aSopenharmony_ci        *got_frame_ptr = 0;
571cabdff1aSopenharmony_ci        return input_buf_size;
572cabdff1aSopenharmony_ci    }
573cabdff1aSopenharmony_ci    /* init and position bitstream reader */
574cabdff1aSopenharmony_ci    if ((ret = init_get_bits8(&s->gb, buf, buf_size)) < 0)
575cabdff1aSopenharmony_ci        return ret;
576cabdff1aSopenharmony_ci    skip_bits(&s->gb, s->bitindex);
577cabdff1aSopenharmony_ci
578cabdff1aSopenharmony_ci    /* process header or next subblock */
579cabdff1aSopenharmony_ci    if (!s->got_header) {
580cabdff1aSopenharmony_ci
581cabdff1aSopenharmony_ci        if ((ret = read_header(s)) < 0)
582cabdff1aSopenharmony_ci            return ret;
583cabdff1aSopenharmony_ci
584cabdff1aSopenharmony_ci        if (avpkt->size) {
585cabdff1aSopenharmony_ci            int max_framesize;
586cabdff1aSopenharmony_ci            void *tmp_ptr;
587cabdff1aSopenharmony_ci
588cabdff1aSopenharmony_ci            max_framesize = FFMAX(s->max_framesize, s->blocksize * s->channels * 8);
589cabdff1aSopenharmony_ci            tmp_ptr = av_fast_realloc(s->bitstream, &s->allocated_bitstream_size,
590cabdff1aSopenharmony_ci                                      max_framesize + AV_INPUT_BUFFER_PADDING_SIZE);
591cabdff1aSopenharmony_ci            if (!tmp_ptr) {
592cabdff1aSopenharmony_ci                av_log(avctx, AV_LOG_ERROR, "error allocating bitstream buffer\n");
593cabdff1aSopenharmony_ci                return AVERROR(ENOMEM);
594cabdff1aSopenharmony_ci            }
595cabdff1aSopenharmony_ci            s->bitstream = tmp_ptr;
596cabdff1aSopenharmony_ci            s->max_framesize = max_framesize;
597cabdff1aSopenharmony_ci            *got_frame_ptr = 0;
598cabdff1aSopenharmony_ci            goto finish_frame;
599cabdff1aSopenharmony_ci        }
600cabdff1aSopenharmony_ci    }
601cabdff1aSopenharmony_ci
602cabdff1aSopenharmony_ci    /* if quit command was read previously, don't decode anything */
603cabdff1aSopenharmony_ci    if (s->got_quit_command) {
604cabdff1aSopenharmony_ci        *got_frame_ptr = 0;
605cabdff1aSopenharmony_ci        return avpkt->size;
606cabdff1aSopenharmony_ci    }
607cabdff1aSopenharmony_ci
608cabdff1aSopenharmony_ci    s->cur_chan = 0;
609cabdff1aSopenharmony_ci    while (s->cur_chan < s->channels) {
610cabdff1aSopenharmony_ci        unsigned cmd;
611cabdff1aSopenharmony_ci        int len;
612cabdff1aSopenharmony_ci
613cabdff1aSopenharmony_ci        if (get_bits_left(&s->gb) < 3 + FNSIZE) {
614cabdff1aSopenharmony_ci            *got_frame_ptr = 0;
615cabdff1aSopenharmony_ci            break;
616cabdff1aSopenharmony_ci        }
617cabdff1aSopenharmony_ci
618cabdff1aSopenharmony_ci        cmd = get_ur_golomb_shorten(&s->gb, FNSIZE);
619cabdff1aSopenharmony_ci
620cabdff1aSopenharmony_ci        if (cmd > FN_VERBATIM) {
621cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "unknown shorten function %d\n", cmd);
622cabdff1aSopenharmony_ci            *got_frame_ptr = 0;
623cabdff1aSopenharmony_ci            break;
624cabdff1aSopenharmony_ci        }
625cabdff1aSopenharmony_ci
626cabdff1aSopenharmony_ci        if (!is_audio_command[cmd]) {
627cabdff1aSopenharmony_ci            /* process non-audio command */
628cabdff1aSopenharmony_ci            switch (cmd) {
629cabdff1aSopenharmony_ci            case FN_VERBATIM:
630cabdff1aSopenharmony_ci                len = get_ur_golomb_shorten(&s->gb, VERBATIM_CKSIZE_SIZE);
631cabdff1aSopenharmony_ci                if (len < 0 || len > get_bits_left(&s->gb)) {
632cabdff1aSopenharmony_ci                    av_log(avctx, AV_LOG_ERROR, "verbatim length %d invalid\n",
633cabdff1aSopenharmony_ci                           len);
634cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
635cabdff1aSopenharmony_ci                }
636cabdff1aSopenharmony_ci                while (len--)
637cabdff1aSopenharmony_ci                    get_ur_golomb_shorten(&s->gb, VERBATIM_BYTE_SIZE);
638cabdff1aSopenharmony_ci                break;
639cabdff1aSopenharmony_ci            case FN_BITSHIFT: {
640cabdff1aSopenharmony_ci                unsigned bitshift = get_ur_golomb_shorten(&s->gb, BITSHIFTSIZE);
641cabdff1aSopenharmony_ci                if (bitshift > 32) {
642cabdff1aSopenharmony_ci                    av_log(avctx, AV_LOG_ERROR, "bitshift %d is invalid\n",
643cabdff1aSopenharmony_ci                           bitshift);
644cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
645cabdff1aSopenharmony_ci                }
646cabdff1aSopenharmony_ci                s->bitshift = bitshift;
647cabdff1aSopenharmony_ci                break;
648cabdff1aSopenharmony_ci            }
649cabdff1aSopenharmony_ci            case FN_BLOCKSIZE: {
650cabdff1aSopenharmony_ci                unsigned blocksize = get_uint(s, av_log2(s->blocksize));
651cabdff1aSopenharmony_ci                if (blocksize > s->blocksize) {
652cabdff1aSopenharmony_ci                    avpriv_report_missing_feature(avctx,
653cabdff1aSopenharmony_ci                                                  "Increasing block size");
654cabdff1aSopenharmony_ci                    return AVERROR_PATCHWELCOME;
655cabdff1aSopenharmony_ci                }
656cabdff1aSopenharmony_ci                if (!blocksize || blocksize > MAX_BLOCKSIZE) {
657cabdff1aSopenharmony_ci                    av_log(avctx, AV_LOG_ERROR, "invalid or unsupported "
658cabdff1aSopenharmony_ci                                                "block size: %d\n", blocksize);
659cabdff1aSopenharmony_ci                    return AVERROR(EINVAL);
660cabdff1aSopenharmony_ci                }
661cabdff1aSopenharmony_ci                s->blocksize = blocksize;
662cabdff1aSopenharmony_ci                break;
663cabdff1aSopenharmony_ci            }
664cabdff1aSopenharmony_ci            case FN_QUIT:
665cabdff1aSopenharmony_ci                s->got_quit_command = 1;
666cabdff1aSopenharmony_ci                break;
667cabdff1aSopenharmony_ci            }
668cabdff1aSopenharmony_ci            if (cmd == FN_QUIT)
669cabdff1aSopenharmony_ci                break;
670cabdff1aSopenharmony_ci        } else {
671cabdff1aSopenharmony_ci            /* process audio command */
672cabdff1aSopenharmony_ci            int residual_size = 0;
673cabdff1aSopenharmony_ci            int channel = s->cur_chan;
674cabdff1aSopenharmony_ci            int32_t coffset;
675cabdff1aSopenharmony_ci
676cabdff1aSopenharmony_ci            /* get Rice code for residual decoding */
677cabdff1aSopenharmony_ci            if (cmd != FN_ZERO) {
678cabdff1aSopenharmony_ci                residual_size = get_ur_golomb_shorten(&s->gb, ENERGYSIZE);
679cabdff1aSopenharmony_ci                /* This is a hack as version 0 differed in the definition
680cabdff1aSopenharmony_ci                 * of get_sr_golomb_shorten(). */
681cabdff1aSopenharmony_ci                if (s->version == 0)
682cabdff1aSopenharmony_ci                    residual_size--;
683cabdff1aSopenharmony_ci                if (residual_size > 30U) {
684cabdff1aSopenharmony_ci                    av_log(avctx, AV_LOG_ERROR, "residual size unsupportd: %d\n", residual_size);
685cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
686cabdff1aSopenharmony_ci                }
687cabdff1aSopenharmony_ci            }
688cabdff1aSopenharmony_ci
689cabdff1aSopenharmony_ci            /* calculate sample offset using means from previous blocks */
690cabdff1aSopenharmony_ci            if (s->nmean == 0)
691cabdff1aSopenharmony_ci                coffset = s->offset[channel][0];
692cabdff1aSopenharmony_ci            else {
693cabdff1aSopenharmony_ci                int32_t sum = (s->version < 2) ? 0 : s->nmean / 2;
694cabdff1aSopenharmony_ci                for (i = 0; i < s->nmean; i++)
695cabdff1aSopenharmony_ci                    sum += (unsigned)s->offset[channel][i];
696cabdff1aSopenharmony_ci                coffset = sum / s->nmean;
697cabdff1aSopenharmony_ci                if (s->version >= 2)
698cabdff1aSopenharmony_ci                    coffset = s->bitshift == 0 ? coffset : coffset >> s->bitshift - 1 >> 1;
699cabdff1aSopenharmony_ci            }
700cabdff1aSopenharmony_ci
701cabdff1aSopenharmony_ci            /* decode samples for this channel */
702cabdff1aSopenharmony_ci            if (cmd == FN_ZERO) {
703cabdff1aSopenharmony_ci                for (i = 0; i < s->blocksize; i++)
704cabdff1aSopenharmony_ci                    s->decoded[channel][i] = 0;
705cabdff1aSopenharmony_ci            } else {
706cabdff1aSopenharmony_ci                if ((ret = decode_subframe_lpc(s, cmd, channel,
707cabdff1aSopenharmony_ci                                               residual_size, coffset)) < 0)
708cabdff1aSopenharmony_ci                    return ret;
709cabdff1aSopenharmony_ci            }
710cabdff1aSopenharmony_ci
711cabdff1aSopenharmony_ci            /* update means with info from the current block */
712cabdff1aSopenharmony_ci            if (s->nmean > 0) {
713cabdff1aSopenharmony_ci                int64_t sum = (s->version < 2) ? 0 : s->blocksize / 2;
714cabdff1aSopenharmony_ci                for (i = 0; i < s->blocksize; i++)
715cabdff1aSopenharmony_ci                    sum += s->decoded[channel][i];
716cabdff1aSopenharmony_ci
717cabdff1aSopenharmony_ci                for (i = 1; i < s->nmean; i++)
718cabdff1aSopenharmony_ci                    s->offset[channel][i - 1] = s->offset[channel][i];
719cabdff1aSopenharmony_ci
720cabdff1aSopenharmony_ci                if (s->version < 2)
721cabdff1aSopenharmony_ci                    s->offset[channel][s->nmean - 1] = sum / s->blocksize;
722cabdff1aSopenharmony_ci                else
723cabdff1aSopenharmony_ci                    s->offset[channel][s->nmean - 1] = s->bitshift == 32 ? 0 : (sum / s->blocksize) * (1LL << s->bitshift);
724cabdff1aSopenharmony_ci            }
725cabdff1aSopenharmony_ci
726cabdff1aSopenharmony_ci            /* copy wrap samples for use with next block */
727cabdff1aSopenharmony_ci            for (i = -s->nwrap; i < 0; i++)
728cabdff1aSopenharmony_ci                s->decoded[channel][i] = s->decoded[channel][i + s->blocksize];
729cabdff1aSopenharmony_ci
730cabdff1aSopenharmony_ci            /* shift samples to add in unused zero bits which were removed
731cabdff1aSopenharmony_ci             * during encoding */
732cabdff1aSopenharmony_ci            fix_bitshift(s, s->decoded[channel]);
733cabdff1aSopenharmony_ci
734cabdff1aSopenharmony_ci            /* if this is the last channel in the block, output the samples */
735cabdff1aSopenharmony_ci            s->cur_chan++;
736cabdff1aSopenharmony_ci            if (s->cur_chan == s->channels) {
737cabdff1aSopenharmony_ci                uint8_t *samples_u8;
738cabdff1aSopenharmony_ci                int16_t *samples_s16;
739cabdff1aSopenharmony_ci                int chan;
740cabdff1aSopenharmony_ci
741cabdff1aSopenharmony_ci                /* get output buffer */
742cabdff1aSopenharmony_ci                frame->nb_samples = s->blocksize;
743cabdff1aSopenharmony_ci                if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
744cabdff1aSopenharmony_ci                    return ret;
745cabdff1aSopenharmony_ci
746cabdff1aSopenharmony_ci                for (chan = 0; chan < s->channels; chan++) {
747cabdff1aSopenharmony_ci                    samples_u8  = ((uint8_t **)frame->extended_data)[chan];
748cabdff1aSopenharmony_ci                    samples_s16 = ((int16_t **)frame->extended_data)[chan];
749cabdff1aSopenharmony_ci                    for (i = 0; i < s->blocksize; i++) {
750cabdff1aSopenharmony_ci                        switch (s->internal_ftype) {
751cabdff1aSopenharmony_ci                        case TYPE_U8:
752cabdff1aSopenharmony_ci                            *samples_u8++ = av_clip_uint8(s->decoded[chan][i]);
753cabdff1aSopenharmony_ci                            break;
754cabdff1aSopenharmony_ci                        case TYPE_S16HL:
755cabdff1aSopenharmony_ci                        case TYPE_S16LH:
756cabdff1aSopenharmony_ci                            *samples_s16++ = av_clip_int16(s->decoded[chan][i]);
757cabdff1aSopenharmony_ci                            break;
758cabdff1aSopenharmony_ci                        }
759cabdff1aSopenharmony_ci                    }
760cabdff1aSopenharmony_ci                    if (s->swap && s->internal_ftype != TYPE_U8)
761cabdff1aSopenharmony_ci                        s->bdsp.bswap16_buf(((uint16_t **)frame->extended_data)[chan],
762cabdff1aSopenharmony_ci                                            ((uint16_t **)frame->extended_data)[chan],
763cabdff1aSopenharmony_ci                                            s->blocksize);
764cabdff1aSopenharmony_ci
765cabdff1aSopenharmony_ci                }
766cabdff1aSopenharmony_ci
767cabdff1aSopenharmony_ci                *got_frame_ptr = 1;
768cabdff1aSopenharmony_ci            }
769cabdff1aSopenharmony_ci        }
770cabdff1aSopenharmony_ci    }
771cabdff1aSopenharmony_ci    if (s->cur_chan < s->channels)
772cabdff1aSopenharmony_ci        *got_frame_ptr = 0;
773cabdff1aSopenharmony_ci
774cabdff1aSopenharmony_cifinish_frame:
775cabdff1aSopenharmony_ci    s->bitindex = get_bits_count(&s->gb) - 8 * (get_bits_count(&s->gb) / 8);
776cabdff1aSopenharmony_ci    i           = get_bits_count(&s->gb) / 8;
777cabdff1aSopenharmony_ci    if (i > buf_size) {
778cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "overread: %d\n", i - buf_size);
779cabdff1aSopenharmony_ci        s->bitstream_size  = 0;
780cabdff1aSopenharmony_ci        s->bitstream_index = 0;
781cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
782cabdff1aSopenharmony_ci    }
783cabdff1aSopenharmony_ci    if (s->bitstream_size) {
784cabdff1aSopenharmony_ci        s->bitstream_index += i;
785cabdff1aSopenharmony_ci        s->bitstream_size  -= i;
786cabdff1aSopenharmony_ci        return input_buf_size;
787cabdff1aSopenharmony_ci    } else
788cabdff1aSopenharmony_ci        return i;
789cabdff1aSopenharmony_ci}
790cabdff1aSopenharmony_ci
791cabdff1aSopenharmony_cistatic av_cold int shorten_decode_close(AVCodecContext *avctx)
792cabdff1aSopenharmony_ci{
793cabdff1aSopenharmony_ci    ShortenContext *s = avctx->priv_data;
794cabdff1aSopenharmony_ci    int i;
795cabdff1aSopenharmony_ci
796cabdff1aSopenharmony_ci    for (i = 0; i < s->channels; i++) {
797cabdff1aSopenharmony_ci        s->decoded[i] = NULL;
798cabdff1aSopenharmony_ci        av_freep(&s->decoded_base[i]);
799cabdff1aSopenharmony_ci        av_freep(&s->offset[i]);
800cabdff1aSopenharmony_ci    }
801cabdff1aSopenharmony_ci    av_freep(&s->bitstream);
802cabdff1aSopenharmony_ci    av_freep(&s->coeffs);
803cabdff1aSopenharmony_ci
804cabdff1aSopenharmony_ci    return 0;
805cabdff1aSopenharmony_ci}
806cabdff1aSopenharmony_ci
807cabdff1aSopenharmony_ciconst FFCodec ff_shorten_decoder = {
808cabdff1aSopenharmony_ci    .p.name         = "shorten",
809cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("Shorten"),
810cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_AUDIO,
811cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_SHORTEN,
812cabdff1aSopenharmony_ci    .priv_data_size = sizeof(ShortenContext),
813cabdff1aSopenharmony_ci    .init           = shorten_decode_init,
814cabdff1aSopenharmony_ci    .close          = shorten_decode_close,
815cabdff1aSopenharmony_ci    FF_CODEC_DECODE_CB(shorten_decode_frame),
816cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF |
817cabdff1aSopenharmony_ci                      AV_CODEC_CAP_DELAY |
818cabdff1aSopenharmony_ci                      AV_CODEC_CAP_DR1 |
819cabdff1aSopenharmony_ci                      AV_CODEC_CAP_SUBFRAMES ,
820cabdff1aSopenharmony_ci    .p.sample_fmts  = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
821cabdff1aSopenharmony_ci                                                      AV_SAMPLE_FMT_U8P,
822cabdff1aSopenharmony_ci                                                      AV_SAMPLE_FMT_NONE },
823cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
824cabdff1aSopenharmony_ci};
825