1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Bink Audio decoder
3cabdff1aSopenharmony_ci * Copyright (c) 2007-2011 Peter Ross (pross@xvid.org)
4cabdff1aSopenharmony_ci * Copyright (c) 2009 Daniel Verkamp (daniel@drv.nu)
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/**
24cabdff1aSopenharmony_ci * @file
25cabdff1aSopenharmony_ci * Bink Audio decoder
26cabdff1aSopenharmony_ci *
27cabdff1aSopenharmony_ci * Technical details here:
28cabdff1aSopenharmony_ci *  http://wiki.multimedia.cx/index.php?title=Bink_Audio
29cabdff1aSopenharmony_ci */
30cabdff1aSopenharmony_ci
31cabdff1aSopenharmony_ci#include "config_components.h"
32cabdff1aSopenharmony_ci
33cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h"
34cabdff1aSopenharmony_ci#include "libavutil/intfloat.h"
35cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h"
36cabdff1aSopenharmony_ci
37cabdff1aSopenharmony_ci#define BITSTREAM_READER_LE
38cabdff1aSopenharmony_ci#include "avcodec.h"
39cabdff1aSopenharmony_ci#include "dct.h"
40cabdff1aSopenharmony_ci#include "decode.h"
41cabdff1aSopenharmony_ci#include "get_bits.h"
42cabdff1aSopenharmony_ci#include "codec_internal.h"
43cabdff1aSopenharmony_ci#include "internal.h"
44cabdff1aSopenharmony_ci#include "rdft.h"
45cabdff1aSopenharmony_ci#include "wma_freqs.h"
46cabdff1aSopenharmony_ci
47cabdff1aSopenharmony_ci#define MAX_DCT_CHANNELS 6
48cabdff1aSopenharmony_ci#define MAX_CHANNELS 2
49cabdff1aSopenharmony_ci#define BINK_BLOCK_MAX_SIZE (MAX_CHANNELS << 11)
50cabdff1aSopenharmony_ci
51cabdff1aSopenharmony_citypedef struct BinkAudioContext {
52cabdff1aSopenharmony_ci    GetBitContext gb;
53cabdff1aSopenharmony_ci    int version_b;          ///< Bink version 'b'
54cabdff1aSopenharmony_ci    int first;
55cabdff1aSopenharmony_ci    int channels;
56cabdff1aSopenharmony_ci    int ch_offset;
57cabdff1aSopenharmony_ci    int frame_len;          ///< transform size (samples)
58cabdff1aSopenharmony_ci    int overlap_len;        ///< overlap size (samples)
59cabdff1aSopenharmony_ci    int block_size;
60cabdff1aSopenharmony_ci    int num_bands;
61cabdff1aSopenharmony_ci    float root;
62cabdff1aSopenharmony_ci    unsigned int bands[26];
63cabdff1aSopenharmony_ci    float previous[MAX_DCT_CHANNELS][BINK_BLOCK_MAX_SIZE / 16];  ///< coeffs from previous audio block
64cabdff1aSopenharmony_ci    float quant_table[96];
65cabdff1aSopenharmony_ci    AVPacket *pkt;
66cabdff1aSopenharmony_ci    union {
67cabdff1aSopenharmony_ci        RDFTContext rdft;
68cabdff1aSopenharmony_ci        DCTContext dct;
69cabdff1aSopenharmony_ci    } trans;
70cabdff1aSopenharmony_ci} BinkAudioContext;
71cabdff1aSopenharmony_ci
72cabdff1aSopenharmony_ci
73cabdff1aSopenharmony_cistatic av_cold int decode_init(AVCodecContext *avctx)
74cabdff1aSopenharmony_ci{
75cabdff1aSopenharmony_ci    BinkAudioContext *s = avctx->priv_data;
76cabdff1aSopenharmony_ci    int sample_rate = avctx->sample_rate;
77cabdff1aSopenharmony_ci    int sample_rate_half;
78cabdff1aSopenharmony_ci    int i, ret;
79cabdff1aSopenharmony_ci    int frame_len_bits;
80cabdff1aSopenharmony_ci    int max_channels = avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT ? MAX_CHANNELS : MAX_DCT_CHANNELS;
81cabdff1aSopenharmony_ci    int channels = avctx->ch_layout.nb_channels;
82cabdff1aSopenharmony_ci
83cabdff1aSopenharmony_ci    /* determine frame length */
84cabdff1aSopenharmony_ci    if (avctx->sample_rate < 22050) {
85cabdff1aSopenharmony_ci        frame_len_bits = 9;
86cabdff1aSopenharmony_ci    } else if (avctx->sample_rate < 44100) {
87cabdff1aSopenharmony_ci        frame_len_bits = 10;
88cabdff1aSopenharmony_ci    } else {
89cabdff1aSopenharmony_ci        frame_len_bits = 11;
90cabdff1aSopenharmony_ci    }
91cabdff1aSopenharmony_ci
92cabdff1aSopenharmony_ci    if (channels < 1 || channels > max_channels) {
93cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "invalid number of channels: %d\n", channels);
94cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
95cabdff1aSopenharmony_ci    }
96cabdff1aSopenharmony_ci    av_channel_layout_uninit(&avctx->ch_layout);
97cabdff1aSopenharmony_ci    av_channel_layout_default(&avctx->ch_layout, channels);
98cabdff1aSopenharmony_ci
99cabdff1aSopenharmony_ci    s->version_b = avctx->extradata_size >= 4 && avctx->extradata[3] == 'b';
100cabdff1aSopenharmony_ci
101cabdff1aSopenharmony_ci    if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT) {
102cabdff1aSopenharmony_ci        // audio is already interleaved for the RDFT format variant
103cabdff1aSopenharmony_ci        avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
104cabdff1aSopenharmony_ci        if (sample_rate > INT_MAX / channels)
105cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
106cabdff1aSopenharmony_ci        sample_rate  *= channels;
107cabdff1aSopenharmony_ci        s->channels = 1;
108cabdff1aSopenharmony_ci        if (!s->version_b)
109cabdff1aSopenharmony_ci            frame_len_bits += av_log2(channels);
110cabdff1aSopenharmony_ci    } else {
111cabdff1aSopenharmony_ci        s->channels = channels;
112cabdff1aSopenharmony_ci        avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
113cabdff1aSopenharmony_ci    }
114cabdff1aSopenharmony_ci
115cabdff1aSopenharmony_ci    s->frame_len     = 1 << frame_len_bits;
116cabdff1aSopenharmony_ci    s->overlap_len   = s->frame_len / 16;
117cabdff1aSopenharmony_ci    s->block_size    = (s->frame_len - s->overlap_len) * FFMIN(MAX_CHANNELS, s->channels);
118cabdff1aSopenharmony_ci    sample_rate_half = (sample_rate + 1LL) / 2;
119cabdff1aSopenharmony_ci    if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
120cabdff1aSopenharmony_ci        s->root = 2.0 / (sqrt(s->frame_len) * 32768.0);
121cabdff1aSopenharmony_ci    else
122cabdff1aSopenharmony_ci        s->root = s->frame_len / (sqrt(s->frame_len) * 32768.0);
123cabdff1aSopenharmony_ci    for (i = 0; i < 96; i++) {
124cabdff1aSopenharmony_ci        /* constant is result of 0.066399999/log10(M_E) */
125cabdff1aSopenharmony_ci        s->quant_table[i] = expf(i * 0.15289164787221953823f) * s->root;
126cabdff1aSopenharmony_ci    }
127cabdff1aSopenharmony_ci
128cabdff1aSopenharmony_ci    /* calculate number of bands */
129cabdff1aSopenharmony_ci    for (s->num_bands = 1; s->num_bands < 25; s->num_bands++)
130cabdff1aSopenharmony_ci        if (sample_rate_half <= ff_wma_critical_freqs[s->num_bands - 1])
131cabdff1aSopenharmony_ci            break;
132cabdff1aSopenharmony_ci
133cabdff1aSopenharmony_ci    /* populate bands data */
134cabdff1aSopenharmony_ci    s->bands[0] = 2;
135cabdff1aSopenharmony_ci    for (i = 1; i < s->num_bands; i++)
136cabdff1aSopenharmony_ci        s->bands[i] = (ff_wma_critical_freqs[i - 1] * s->frame_len / sample_rate_half) & ~1;
137cabdff1aSopenharmony_ci    s->bands[s->num_bands] = s->frame_len;
138cabdff1aSopenharmony_ci
139cabdff1aSopenharmony_ci    s->first = 1;
140cabdff1aSopenharmony_ci
141cabdff1aSopenharmony_ci    if (CONFIG_BINKAUDIO_RDFT_DECODER && avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
142cabdff1aSopenharmony_ci        ret = ff_rdft_init(&s->trans.rdft, frame_len_bits, DFT_C2R);
143cabdff1aSopenharmony_ci    else if (CONFIG_BINKAUDIO_DCT_DECODER)
144cabdff1aSopenharmony_ci        ret = ff_dct_init(&s->trans.dct, frame_len_bits, DCT_III);
145cabdff1aSopenharmony_ci    else
146cabdff1aSopenharmony_ci        av_assert0(0);
147cabdff1aSopenharmony_ci    if (ret < 0)
148cabdff1aSopenharmony_ci        return ret;
149cabdff1aSopenharmony_ci
150cabdff1aSopenharmony_ci    s->pkt = avctx->internal->in_pkt;
151cabdff1aSopenharmony_ci
152cabdff1aSopenharmony_ci    return 0;
153cabdff1aSopenharmony_ci}
154cabdff1aSopenharmony_ci
155cabdff1aSopenharmony_cistatic float get_float(GetBitContext *gb)
156cabdff1aSopenharmony_ci{
157cabdff1aSopenharmony_ci    int power = get_bits(gb, 5);
158cabdff1aSopenharmony_ci    float f = ldexpf(get_bits(gb, 23), power - 23);
159cabdff1aSopenharmony_ci    if (get_bits1(gb))
160cabdff1aSopenharmony_ci        f = -f;
161cabdff1aSopenharmony_ci    return f;
162cabdff1aSopenharmony_ci}
163cabdff1aSopenharmony_ci
164cabdff1aSopenharmony_cistatic const uint8_t rle_length_tab[16] = {
165cabdff1aSopenharmony_ci    2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 32, 64
166cabdff1aSopenharmony_ci};
167cabdff1aSopenharmony_ci
168cabdff1aSopenharmony_ci/**
169cabdff1aSopenharmony_ci * Decode Bink Audio block
170cabdff1aSopenharmony_ci * @param[out] out Output buffer (must contain s->block_size elements)
171cabdff1aSopenharmony_ci * @return 0 on success, negative error code on failure
172cabdff1aSopenharmony_ci */
173cabdff1aSopenharmony_cistatic int decode_block(BinkAudioContext *s, float **out, int use_dct,
174cabdff1aSopenharmony_ci                        int channels, int ch_offset)
175cabdff1aSopenharmony_ci{
176cabdff1aSopenharmony_ci    int ch, i, j, k;
177cabdff1aSopenharmony_ci    float q, quant[25];
178cabdff1aSopenharmony_ci    int width, coeff;
179cabdff1aSopenharmony_ci    GetBitContext *gb = &s->gb;
180cabdff1aSopenharmony_ci
181cabdff1aSopenharmony_ci    if (use_dct)
182cabdff1aSopenharmony_ci        skip_bits(gb, 2);
183cabdff1aSopenharmony_ci
184cabdff1aSopenharmony_ci    for (ch = 0; ch < channels; ch++) {
185cabdff1aSopenharmony_ci        FFTSample *coeffs = out[ch + ch_offset];
186cabdff1aSopenharmony_ci
187cabdff1aSopenharmony_ci        if (s->version_b) {
188cabdff1aSopenharmony_ci            if (get_bits_left(gb) < 64)
189cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
190cabdff1aSopenharmony_ci            coeffs[0] = av_int2float(get_bits_long(gb, 32)) * s->root;
191cabdff1aSopenharmony_ci            coeffs[1] = av_int2float(get_bits_long(gb, 32)) * s->root;
192cabdff1aSopenharmony_ci        } else {
193cabdff1aSopenharmony_ci            if (get_bits_left(gb) < 58)
194cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
195cabdff1aSopenharmony_ci            coeffs[0] = get_float(gb) * s->root;
196cabdff1aSopenharmony_ci            coeffs[1] = get_float(gb) * s->root;
197cabdff1aSopenharmony_ci        }
198cabdff1aSopenharmony_ci
199cabdff1aSopenharmony_ci        if (get_bits_left(gb) < s->num_bands * 8)
200cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
201cabdff1aSopenharmony_ci        for (i = 0; i < s->num_bands; i++) {
202cabdff1aSopenharmony_ci            int value = get_bits(gb, 8);
203cabdff1aSopenharmony_ci            quant[i]  = s->quant_table[FFMIN(value, 95)];
204cabdff1aSopenharmony_ci        }
205cabdff1aSopenharmony_ci
206cabdff1aSopenharmony_ci        k = 0;
207cabdff1aSopenharmony_ci        q = quant[0];
208cabdff1aSopenharmony_ci
209cabdff1aSopenharmony_ci        // parse coefficients
210cabdff1aSopenharmony_ci        i = 2;
211cabdff1aSopenharmony_ci        while (i < s->frame_len) {
212cabdff1aSopenharmony_ci            if (s->version_b) {
213cabdff1aSopenharmony_ci                j = i + 16;
214cabdff1aSopenharmony_ci            } else {
215cabdff1aSopenharmony_ci                int v = get_bits1(gb);
216cabdff1aSopenharmony_ci                if (v) {
217cabdff1aSopenharmony_ci                    v = get_bits(gb, 4);
218cabdff1aSopenharmony_ci                    j = i + rle_length_tab[v] * 8;
219cabdff1aSopenharmony_ci                } else {
220cabdff1aSopenharmony_ci                    j = i + 8;
221cabdff1aSopenharmony_ci                }
222cabdff1aSopenharmony_ci            }
223cabdff1aSopenharmony_ci
224cabdff1aSopenharmony_ci            j = FFMIN(j, s->frame_len);
225cabdff1aSopenharmony_ci
226cabdff1aSopenharmony_ci            width = get_bits(gb, 4);
227cabdff1aSopenharmony_ci            if (width == 0) {
228cabdff1aSopenharmony_ci                memset(coeffs + i, 0, (j - i) * sizeof(*coeffs));
229cabdff1aSopenharmony_ci                i = j;
230cabdff1aSopenharmony_ci                while (s->bands[k] < i)
231cabdff1aSopenharmony_ci                    q = quant[k++];
232cabdff1aSopenharmony_ci            } else {
233cabdff1aSopenharmony_ci                while (i < j) {
234cabdff1aSopenharmony_ci                    if (s->bands[k] == i)
235cabdff1aSopenharmony_ci                        q = quant[k++];
236cabdff1aSopenharmony_ci                    coeff = get_bits(gb, width);
237cabdff1aSopenharmony_ci                    if (coeff) {
238cabdff1aSopenharmony_ci                        int v;
239cabdff1aSopenharmony_ci                        v = get_bits1(gb);
240cabdff1aSopenharmony_ci                        if (v)
241cabdff1aSopenharmony_ci                            coeffs[i] = -q * coeff;
242cabdff1aSopenharmony_ci                        else
243cabdff1aSopenharmony_ci                            coeffs[i] =  q * coeff;
244cabdff1aSopenharmony_ci                    } else {
245cabdff1aSopenharmony_ci                        coeffs[i] = 0.0f;
246cabdff1aSopenharmony_ci                    }
247cabdff1aSopenharmony_ci                    i++;
248cabdff1aSopenharmony_ci                }
249cabdff1aSopenharmony_ci            }
250cabdff1aSopenharmony_ci        }
251cabdff1aSopenharmony_ci
252cabdff1aSopenharmony_ci        if (CONFIG_BINKAUDIO_DCT_DECODER && use_dct) {
253cabdff1aSopenharmony_ci            coeffs[0] /= 0.5;
254cabdff1aSopenharmony_ci            s->trans.dct.dct_calc(&s->trans.dct,  coeffs);
255cabdff1aSopenharmony_ci        }
256cabdff1aSopenharmony_ci        else if (CONFIG_BINKAUDIO_RDFT_DECODER)
257cabdff1aSopenharmony_ci            s->trans.rdft.rdft_calc(&s->trans.rdft, coeffs);
258cabdff1aSopenharmony_ci    }
259cabdff1aSopenharmony_ci
260cabdff1aSopenharmony_ci    for (ch = 0; ch < channels; ch++) {
261cabdff1aSopenharmony_ci        int j;
262cabdff1aSopenharmony_ci        int count = s->overlap_len * channels;
263cabdff1aSopenharmony_ci        if (!s->first) {
264cabdff1aSopenharmony_ci            j = ch;
265cabdff1aSopenharmony_ci            for (i = 0; i < s->overlap_len; i++, j += channels)
266cabdff1aSopenharmony_ci                out[ch + ch_offset][i] = (s->previous[ch + ch_offset][i] * (count - j) +
267cabdff1aSopenharmony_ci                                                  out[ch + ch_offset][i] *          j) / count;
268cabdff1aSopenharmony_ci        }
269cabdff1aSopenharmony_ci        memcpy(s->previous[ch + ch_offset], &out[ch + ch_offset][s->frame_len - s->overlap_len],
270cabdff1aSopenharmony_ci               s->overlap_len * sizeof(*s->previous[ch + ch_offset]));
271cabdff1aSopenharmony_ci    }
272cabdff1aSopenharmony_ci
273cabdff1aSopenharmony_ci    s->first = 0;
274cabdff1aSopenharmony_ci
275cabdff1aSopenharmony_ci    return 0;
276cabdff1aSopenharmony_ci}
277cabdff1aSopenharmony_ci
278cabdff1aSopenharmony_cistatic av_cold int decode_end(AVCodecContext *avctx)
279cabdff1aSopenharmony_ci{
280cabdff1aSopenharmony_ci    BinkAudioContext * s = avctx->priv_data;
281cabdff1aSopenharmony_ci    if (CONFIG_BINKAUDIO_RDFT_DECODER && avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
282cabdff1aSopenharmony_ci        ff_rdft_end(&s->trans.rdft);
283cabdff1aSopenharmony_ci    else if (CONFIG_BINKAUDIO_DCT_DECODER)
284cabdff1aSopenharmony_ci        ff_dct_end(&s->trans.dct);
285cabdff1aSopenharmony_ci
286cabdff1aSopenharmony_ci    return 0;
287cabdff1aSopenharmony_ci}
288cabdff1aSopenharmony_ci
289cabdff1aSopenharmony_cistatic void get_bits_align32(GetBitContext *s)
290cabdff1aSopenharmony_ci{
291cabdff1aSopenharmony_ci    int n = (-get_bits_count(s)) & 31;
292cabdff1aSopenharmony_ci    if (n) skip_bits(s, n);
293cabdff1aSopenharmony_ci}
294cabdff1aSopenharmony_ci
295cabdff1aSopenharmony_cistatic int binkaudio_receive_frame(AVCodecContext *avctx, AVFrame *frame)
296cabdff1aSopenharmony_ci{
297cabdff1aSopenharmony_ci    BinkAudioContext *s = avctx->priv_data;
298cabdff1aSopenharmony_ci    GetBitContext *gb = &s->gb;
299cabdff1aSopenharmony_ci    int ret;
300cabdff1aSopenharmony_ci
301cabdff1aSopenharmony_ciagain:
302cabdff1aSopenharmony_ci    if (!s->pkt->data) {
303cabdff1aSopenharmony_ci        ret = ff_decode_get_packet(avctx, s->pkt);
304cabdff1aSopenharmony_ci        if (ret < 0) {
305cabdff1aSopenharmony_ci            s->ch_offset = 0;
306cabdff1aSopenharmony_ci            return ret;
307cabdff1aSopenharmony_ci        }
308cabdff1aSopenharmony_ci
309cabdff1aSopenharmony_ci        if (s->pkt->size < 4) {
310cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "Packet is too small\n");
311cabdff1aSopenharmony_ci            ret = AVERROR_INVALIDDATA;
312cabdff1aSopenharmony_ci            goto fail;
313cabdff1aSopenharmony_ci        }
314cabdff1aSopenharmony_ci
315cabdff1aSopenharmony_ci        ret = init_get_bits8(gb, s->pkt->data, s->pkt->size);
316cabdff1aSopenharmony_ci        if (ret < 0)
317cabdff1aSopenharmony_ci            goto fail;
318cabdff1aSopenharmony_ci
319cabdff1aSopenharmony_ci        /* skip reported size */
320cabdff1aSopenharmony_ci        skip_bits_long(gb, 32);
321cabdff1aSopenharmony_ci    }
322cabdff1aSopenharmony_ci
323cabdff1aSopenharmony_ci    /* get output buffer */
324cabdff1aSopenharmony_ci    if (s->ch_offset == 0) {
325cabdff1aSopenharmony_ci        frame->nb_samples = s->frame_len;
326cabdff1aSopenharmony_ci        if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
327cabdff1aSopenharmony_ci            return ret;
328cabdff1aSopenharmony_ci    }
329cabdff1aSopenharmony_ci
330cabdff1aSopenharmony_ci    if (decode_block(s, (float **)frame->extended_data,
331cabdff1aSopenharmony_ci                     avctx->codec->id == AV_CODEC_ID_BINKAUDIO_DCT,
332cabdff1aSopenharmony_ci                     FFMIN(MAX_CHANNELS, s->channels - s->ch_offset), s->ch_offset)) {
333cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Incomplete packet\n");
334cabdff1aSopenharmony_ci        s->ch_offset = 0;
335cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
336cabdff1aSopenharmony_ci    }
337cabdff1aSopenharmony_ci    s->ch_offset += MAX_CHANNELS;
338cabdff1aSopenharmony_ci    get_bits_align32(gb);
339cabdff1aSopenharmony_ci    if (!get_bits_left(gb)) {
340cabdff1aSopenharmony_ci        memset(gb, 0, sizeof(*gb));
341cabdff1aSopenharmony_ci        av_packet_unref(s->pkt);
342cabdff1aSopenharmony_ci    }
343cabdff1aSopenharmony_ci    if (s->ch_offset >= s->channels) {
344cabdff1aSopenharmony_ci        s->ch_offset = 0;
345cabdff1aSopenharmony_ci    } else {
346cabdff1aSopenharmony_ci        goto again;
347cabdff1aSopenharmony_ci    }
348cabdff1aSopenharmony_ci
349cabdff1aSopenharmony_ci    frame->nb_samples = s->block_size / FFMIN(avctx->ch_layout.nb_channels, MAX_CHANNELS);
350cabdff1aSopenharmony_ci
351cabdff1aSopenharmony_ci    return 0;
352cabdff1aSopenharmony_cifail:
353cabdff1aSopenharmony_ci    s->ch_offset = 0;
354cabdff1aSopenharmony_ci    av_packet_unref(s->pkt);
355cabdff1aSopenharmony_ci    return ret;
356cabdff1aSopenharmony_ci}
357cabdff1aSopenharmony_ci
358cabdff1aSopenharmony_cistatic void decode_flush(AVCodecContext *avctx)
359cabdff1aSopenharmony_ci{
360cabdff1aSopenharmony_ci    BinkAudioContext *const s = avctx->priv_data;
361cabdff1aSopenharmony_ci
362cabdff1aSopenharmony_ci    /* s->pkt coincides with avctx->internal->in_pkt
363cabdff1aSopenharmony_ci     * and is unreferenced generically when flushing. */
364cabdff1aSopenharmony_ci    s->first = 1;
365cabdff1aSopenharmony_ci    s->ch_offset = 0;
366cabdff1aSopenharmony_ci}
367cabdff1aSopenharmony_ci
368cabdff1aSopenharmony_ciconst FFCodec ff_binkaudio_rdft_decoder = {
369cabdff1aSopenharmony_ci    .p.name         = "binkaudio_rdft",
370cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("Bink Audio (RDFT)"),
371cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_AUDIO,
372cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_BINKAUDIO_RDFT,
373cabdff1aSopenharmony_ci    .priv_data_size = sizeof(BinkAudioContext),
374cabdff1aSopenharmony_ci    .init           = decode_init,
375cabdff1aSopenharmony_ci    .flush          = decode_flush,
376cabdff1aSopenharmony_ci    .close          = decode_end,
377cabdff1aSopenharmony_ci    FF_CODEC_RECEIVE_FRAME_CB(binkaudio_receive_frame),
378cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_DR1,
379cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
380cabdff1aSopenharmony_ci};
381cabdff1aSopenharmony_ci
382cabdff1aSopenharmony_ciconst FFCodec ff_binkaudio_dct_decoder = {
383cabdff1aSopenharmony_ci    .p.name         = "binkaudio_dct",
384cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("Bink Audio (DCT)"),
385cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_AUDIO,
386cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_BINKAUDIO_DCT,
387cabdff1aSopenharmony_ci    .priv_data_size = sizeof(BinkAudioContext),
388cabdff1aSopenharmony_ci    .init           = decode_init,
389cabdff1aSopenharmony_ci    .flush          = decode_flush,
390cabdff1aSopenharmony_ci    .close          = decode_end,
391cabdff1aSopenharmony_ci    FF_CODEC_RECEIVE_FRAME_CB(binkaudio_receive_frame),
392cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_DR1,
393cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
394cabdff1aSopenharmony_ci};
395