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