FFmpeg
binkaudio.c
Go to the documentation of this file.
1 /*
2  * Bink Audio decoder
3  * Copyright (c) 2007-2011 Peter Ross (pross@xvid.org)
4  * Copyright (c) 2009 Daniel Verkamp (daniel@drv.nu)
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 /**
24  * @file
25  * Bink Audio decoder
26  *
27  * Technical details here:
28  * http://wiki.multimedia.cx/index.php?title=Bink_Audio
29  */
30 
32 #include "libavutil/intfloat.h"
33 
34 #define BITSTREAM_READER_LE
35 #include "avcodec.h"
36 #include "dct.h"
37 #include "decode.h"
38 #include "get_bits.h"
39 #include "internal.h"
40 #include "rdft.h"
41 #include "wma_freqs.h"
42 
43 static float quant_table[96];
44 
45 #define MAX_CHANNELS 2
46 #define BINK_BLOCK_MAX_SIZE (MAX_CHANNELS << 11)
47 
48 typedef struct BinkAudioContext {
50  int version_b; ///< Bink version 'b'
51  int first;
52  int channels;
53  int frame_len; ///< transform size (samples)
54  int overlap_len; ///< overlap size (samples)
56  int num_bands;
57  unsigned int *bands;
58  float root;
60  float previous[MAX_CHANNELS][BINK_BLOCK_MAX_SIZE / 16]; ///< coeffs from previous audio block
62  union {
65  } trans;
67 
68 
70 {
71  BinkAudioContext *s = avctx->priv_data;
72  int sample_rate = avctx->sample_rate;
73  int sample_rate_half;
74  int i;
75  int frame_len_bits;
76 
77  /* determine frame length */
78  if (avctx->sample_rate < 22050) {
79  frame_len_bits = 9;
80  } else if (avctx->sample_rate < 44100) {
81  frame_len_bits = 10;
82  } else {
83  frame_len_bits = 11;
84  }
85 
86  if (avctx->channels < 1 || avctx->channels > MAX_CHANNELS) {
87  av_log(avctx, AV_LOG_ERROR, "invalid number of channels: %d\n", avctx->channels);
88  return AVERROR_INVALIDDATA;
89  }
90  avctx->channel_layout = avctx->channels == 1 ? AV_CH_LAYOUT_MONO :
92 
93  s->version_b = avctx->extradata_size >= 4 && avctx->extradata[3] == 'b';
94 
95  if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT) {
96  // audio is already interleaved for the RDFT format variant
98  if (sample_rate > INT_MAX / avctx->channels)
99  return AVERROR_INVALIDDATA;
100  sample_rate *= avctx->channels;
101  s->channels = 1;
102  if (!s->version_b)
103  frame_len_bits += av_log2(avctx->channels);
104  } else {
105  s->channels = avctx->channels;
107  }
108 
109  s->frame_len = 1 << frame_len_bits;
110  s->overlap_len = s->frame_len / 16;
111  s->block_size = (s->frame_len - s->overlap_len) * s->channels;
112  sample_rate_half = (sample_rate + 1LL) / 2;
113  if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
114  s->root = 2.0 / (sqrt(s->frame_len) * 32768.0);
115  else
116  s->root = s->frame_len / (sqrt(s->frame_len) * 32768.0);
117  for (i = 0; i < 96; i++) {
118  /* constant is result of 0.066399999/log10(M_E) */
119  quant_table[i] = expf(i * 0.15289164787221953823f) * s->root;
120  }
121 
122  /* calculate number of bands */
123  for (s->num_bands = 1; s->num_bands < 25; s->num_bands++)
124  if (sample_rate_half <= ff_wma_critical_freqs[s->num_bands - 1])
125  break;
126 
127  s->bands = av_malloc((s->num_bands + 1) * sizeof(*s->bands));
128  if (!s->bands)
129  return AVERROR(ENOMEM);
130 
131  /* populate bands data */
132  s->bands[0] = 2;
133  for (i = 1; i < s->num_bands; i++)
134  s->bands[i] = (ff_wma_critical_freqs[i - 1] * s->frame_len / sample_rate_half) & ~1;
135  s->bands[s->num_bands] = s->frame_len;
136 
137  s->first = 1;
138 
139  if (CONFIG_BINKAUDIO_RDFT_DECODER && avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
140  ff_rdft_init(&s->trans.rdft, frame_len_bits, DFT_C2R);
141  else if (CONFIG_BINKAUDIO_DCT_DECODER)
142  ff_dct_init(&s->trans.dct, frame_len_bits, DCT_III);
143  else
144  av_assert0(0);
145 
146  s->pkt = av_packet_alloc();
147  if (!s->pkt)
148  return AVERROR(ENOMEM);
149 
150  return 0;
151 }
152 
153 static float get_float(GetBitContext *gb)
154 {
155  int power = get_bits(gb, 5);
156  float f = ldexpf(get_bits_long(gb, 23), power - 23);
157  if (get_bits1(gb))
158  f = -f;
159  return f;
160 }
161 
162 static const uint8_t rle_length_tab[16] = {
163  2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 32, 64
164 };
165 
166 /**
167  * Decode Bink Audio block
168  * @param[out] out Output buffer (must contain s->block_size elements)
169  * @return 0 on success, negative error code on failure
170  */
171 static int decode_block(BinkAudioContext *s, float **out, int use_dct)
172 {
173  int ch, i, j, k;
174  float q, quant[25];
175  int width, coeff;
176  GetBitContext *gb = &s->gb;
177 
178  if (use_dct)
179  skip_bits(gb, 2);
180 
181  for (ch = 0; ch < s->channels; ch++) {
182  FFTSample *coeffs = out[ch];
183 
184  if (s->version_b) {
185  if (get_bits_left(gb) < 64)
186  return AVERROR_INVALIDDATA;
187  coeffs[0] = av_int2float(get_bits_long(gb, 32)) * s->root;
188  coeffs[1] = av_int2float(get_bits_long(gb, 32)) * s->root;
189  } else {
190  if (get_bits_left(gb) < 58)
191  return AVERROR_INVALIDDATA;
192  coeffs[0] = get_float(gb) * s->root;
193  coeffs[1] = get_float(gb) * s->root;
194  }
195 
196  if (get_bits_left(gb) < s->num_bands * 8)
197  return AVERROR_INVALIDDATA;
198  for (i = 0; i < s->num_bands; i++) {
199  int value = get_bits(gb, 8);
200  quant[i] = quant_table[FFMIN(value, 95)];
201  }
202 
203  k = 0;
204  q = quant[0];
205 
206  // parse coefficients
207  i = 2;
208  while (i < s->frame_len) {
209  if (s->version_b) {
210  j = i + 16;
211  } else {
212  int v = get_bits1(gb);
213  if (v) {
214  v = get_bits(gb, 4);
215  j = i + rle_length_tab[v] * 8;
216  } else {
217  j = i + 8;
218  }
219  }
220 
221  j = FFMIN(j, s->frame_len);
222 
223  width = get_bits(gb, 4);
224  if (width == 0) {
225  memset(coeffs + i, 0, (j - i) * sizeof(*coeffs));
226  i = j;
227  while (s->bands[k] < i)
228  q = quant[k++];
229  } else {
230  while (i < j) {
231  if (s->bands[k] == i)
232  q = quant[k++];
233  coeff = get_bits(gb, width);
234  if (coeff) {
235  int v;
236  v = get_bits1(gb);
237  if (v)
238  coeffs[i] = -q * coeff;
239  else
240  coeffs[i] = q * coeff;
241  } else {
242  coeffs[i] = 0.0f;
243  }
244  i++;
245  }
246  }
247  }
248 
249  if (CONFIG_BINKAUDIO_DCT_DECODER && use_dct) {
250  coeffs[0] /= 0.5;
251  s->trans.dct.dct_calc(&s->trans.dct, coeffs);
252  }
253  else if (CONFIG_BINKAUDIO_RDFT_DECODER)
254  s->trans.rdft.rdft_calc(&s->trans.rdft, coeffs);
255  }
256 
257  for (ch = 0; ch < s->channels; ch++) {
258  int j;
259  int count = s->overlap_len * s->channels;
260  if (!s->first) {
261  j = ch;
262  for (i = 0; i < s->overlap_len; i++, j += s->channels)
263  out[ch][i] = (s->previous[ch][i] * (count - j) +
264  out[ch][i] * j) / count;
265  }
266  memcpy(s->previous[ch], &out[ch][s->frame_len - s->overlap_len],
267  s->overlap_len * sizeof(*s->previous[ch]));
268  }
269 
270  s->first = 0;
271 
272  return 0;
273 }
274 
276 {
277  BinkAudioContext * s = avctx->priv_data;
278  av_freep(&s->bands);
279  if (CONFIG_BINKAUDIO_RDFT_DECODER && avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT)
280  ff_rdft_end(&s->trans.rdft);
281  else if (CONFIG_BINKAUDIO_DCT_DECODER)
282  ff_dct_end(&s->trans.dct);
283 
284  av_packet_free(&s->pkt);
285 
286  return 0;
287 }
288 
290 {
291  int n = (-get_bits_count(s)) & 31;
292  if (n) skip_bits(s, n);
293 }
294 
296 {
297  BinkAudioContext *s = avctx->priv_data;
298  GetBitContext *gb = &s->gb;
299  int ret;
300 
301  if (!s->pkt->data) {
302  ret = ff_decode_get_packet(avctx, s->pkt);
303  if (ret < 0)
304  return ret;
305 
306  if (s->pkt->size < 4) {
307  av_log(avctx, AV_LOG_ERROR, "Packet is too small\n");
309  goto fail;
310  }
311 
312  ret = init_get_bits8(gb, s->pkt->data, s->pkt->size);
313  if (ret < 0)
314  goto fail;
315 
316  /* skip reported size */
317  skip_bits_long(gb, 32);
318  }
319 
320  /* get output buffer */
321  frame->nb_samples = s->frame_len;
322  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
323  return ret;
324 
325  if (decode_block(s, (float **)frame->extended_data,
326  avctx->codec->id == AV_CODEC_ID_BINKAUDIO_DCT)) {
327  av_log(avctx, AV_LOG_ERROR, "Incomplete packet\n");
328  return AVERROR_INVALIDDATA;
329  }
330  get_bits_align32(gb);
331  if (!get_bits_left(gb)) {
332  memset(gb, 0, sizeof(*gb));
333  av_packet_unref(s->pkt);
334  }
335 
336  frame->nb_samples = s->block_size / avctx->channels;
337 
338  return 0;
339 fail:
340  av_packet_unref(s->pkt);
341  return ret;
342 }
343 
345  .name = "binkaudio_rdft",
346  .long_name = NULL_IF_CONFIG_SMALL("Bink Audio (RDFT)"),
347  .type = AVMEDIA_TYPE_AUDIO,
349  .priv_data_size = sizeof(BinkAudioContext),
350  .init = decode_init,
351  .close = decode_end,
353  .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1,
354 };
355 
357  .name = "binkaudio_dct",
358  .long_name = NULL_IF_CONFIG_SMALL("Bink Audio (DCT)"),
359  .type = AVMEDIA_TYPE_AUDIO,
361  .priv_data_size = sizeof(BinkAudioContext),
362  .init = decode_init,
363  .close = decode_end,
365  .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1,
366 };
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:599
AVCodec
AVCodec.
Definition: avcodec.h:3481
AV_SAMPLE_FMT_FLTP
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition: samplefmt.h:69
skip_bits_long
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:291
ff_decode_get_packet
int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt)
Called by decoders to get the next packet for decoding.
Definition: decode.c:329
BinkAudioContext::first
int first
Definition: binkaudio.c:51
BinkAudioContext::version_b
int version_b
Bink version 'b'.
Definition: binkaudio.c:50
init
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:849
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
AVCodecContext::channel_layout
uint64_t channel_layout
Audio channel layout.
Definition: avcodec.h:2276
out
FILE * out
Definition: movenc.c:54
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:2225
wma_freqs.h
n
int n
Definition: avisynth_c.h:760
BinkAudioContext::channels
int channels
Definition: binkaudio.c:52
AV_CH_LAYOUT_MONO
#define AV_CH_LAYOUT_MONO
Definition: channel_layout.h:85
rdft.h
get_bits_long
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:546
get_float
static float get_float(GetBitContext *gb)
Definition: binkaudio.c:153
BINK_BLOCK_MAX_SIZE
#define BINK_BLOCK_MAX_SIZE
Definition: binkaudio.c:46
ch
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(const uint8_t *) pi - 0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(const int16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(const int16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(const int32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(const int32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(const int64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0f/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float *) pi *(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double *) pi *(INT64_C(1)<< 63))) #define FMT_PAIR_FUNC(out, in) static conv_func_type *const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={ FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64), };static void cpy1(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, len);} static void cpy2(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 2 *len);} static void cpy4(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 4 *len);} static void cpy8(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 8 *len);} AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, const int *ch_map, int flags) { AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) return NULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) return NULL;if(channels==1){ in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);} ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map) { switch(av_get_bytes_per_sample(in_fmt)){ case 1:ctx->simd_f=cpy1;break;case 2:ctx->simd_f=cpy2;break;case 4:ctx->simd_f=cpy4;break;case 8:ctx->simd_f=cpy8;break;} } if(HAVE_X86ASM &&1) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels);if(ARCH_ARM) swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels);if(ARCH_AARCH64) swri_audio_convert_init_aarch64(ctx, out_fmt, in_fmt, channels);return ctx;} void swri_audio_convert_free(AudioConvert **ctx) { av_freep(ctx);} int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len) { int ch;int off=0;const int os=(out->planar ? 1 :out->ch_count) *out->bps;unsigned misaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask) { int planes=in->planar ? in->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;} if(ctx->out_simd_align_mask) { int planes=out->planar ? out->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;} if(ctx->simd_f &&!ctx->ch_map &&!misaligned){ off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){ if(out->planar==in->planar){ int planes=out->planar ? out->ch_count :1;for(ch=0;ch< planes;ch++){ ctx->simd_f(out-> ch ch
Definition: audioconvert.c:56
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:219
count
void INT64 INT64 count
Definition: avisynth_c.h:767
ff_binkaudio_rdft_decoder
AVCodec ff_binkaudio_rdft_decoder
Definition: binkaudio.c:344
DFT_C2R
@ DFT_C2R
Definition: avfft.h:75
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:295
internal.h
expf
#define expf(x)
Definition: libm.h:283
intfloat.h
sample_rate
sample_rate
Definition: ffmpeg_filter.c:191
av_packet_free
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition: avpacket.c:62
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
BinkAudioContext::gb
GetBitContext gb
Definition: binkaudio.c:49
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:467
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
DCT_III
@ DCT_III
Definition: avfft.h:95
AVCodecContext::codec
const struct AVCodec * codec
Definition: avcodec.h:1574
fail
#define fail()
Definition: checkasm.h:120
av_int2float
static av_always_inline float av_int2float(uint32_t i)
Reinterpret a 32-bit integer as a float.
Definition: intfloat.h:40
GetBitContext
Definition: get_bits.h:61
ff_rdft_end
av_cold void ff_rdft_end(RDFTContext *s)
Definition: rdft.c:114
AV_CH_LAYOUT_STEREO
#define AV_CH_LAYOUT_STEREO
Definition: channel_layout.h:86
BinkAudioContext
Definition: binkaudio.c:48
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
av_cold
#define av_cold
Definition: attributes.h:84
dct.h
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:677
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:1667
width
#define width
s
#define s(width, name)
Definition: cbs_vp9.c:257
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
decode_end
static av_cold int decode_end(AVCodecContext *avctx)
Definition: binkaudio.c:275
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
binkaudio_receive_frame
static int binkaudio_receive_frame(AVCodecContext *avctx, AVFrame *frame)
Definition: binkaudio.c:295
AV_CODEC_ID_BINKAUDIO_DCT
@ AV_CODEC_ID_BINKAUDIO_DCT
Definition: avcodec.h:612
decode.h
get_bits.h
ff_wma_critical_freqs
const uint16_t ff_wma_critical_freqs[25]
Definition: wma_freqs.c:23
f
#define f(width, name)
Definition: cbs_vp9.c:255
ldexpf
#define ldexpf(x, exp)
Definition: libm.h:389
BinkAudioContext::bands
unsigned int * bands
Definition: binkaudio.c:57
BinkAudioContext::overlap_len
int overlap_len
overlap size (samples)
Definition: binkaudio.c:54
BinkAudioContext::previous
float previous[MAX_CHANNELS][BINK_BLOCK_MAX_SIZE/16]
coeffs from previous audio block
Definition: binkaudio.c:60
receive_frame
static CopyRet receive_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame)
Definition: crystalhd.c:560
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
FFTSample
float FFTSample
Definition: avfft.h:35
BinkAudioContext::pkt
AVPacket * pkt
Definition: binkaudio.c:61
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1965
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: avcodec.h:981
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:188
ff_binkaudio_dct_decoder
AVCodec ff_binkaudio_dct_decoder
Definition: binkaudio.c:356
BinkAudioContext::root
float root
Definition: binkaudio.c:58
BinkAudioContext::coeffs
FFTSample coeffs[BINK_BLOCK_MAX_SIZE]
Definition: binkaudio.c:59
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:2233
FFMIN
#define FFMIN(a, b)
Definition: common.h:96
rle_length_tab
static const uint8_t rle_length_tab[16]
Definition: binkaudio.c:162
quant_table
static float quant_table[96]
Definition: binkaudio.c:43
BinkAudioContext::frame_len
int frame_len
transform size (samples)
Definition: binkaudio.c:53
av_packet_alloc
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition: avpacket.c:51
ff_dct_end
av_cold void ff_dct_end(DCTContext *s)
Definition: dct.c:221
AVCodecContext::channels
int channels
number of audio channels
Definition: avcodec.h:2226
decode_init
static av_cold int decode_init(AVCodecContext *avctx)
Definition: binkaudio.c:69
AVCodec::id
enum AVCodecID id
Definition: avcodec.h:3495
ff_rdft_init
av_cold int ff_rdft_init(RDFTContext *s, int nbits, enum RDFTransformType trans)
Set up a real FFT.
Definition: rdft.c:88
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem.h:112
BinkAudioContext::rdft
RDFTContext rdft
Definition: binkaudio.c:63
ff_dct_init
av_cold int ff_dct_init(DCTContext *s, int nbits, enum DCTTransformType inverse)
Set up DCT.
Definition: dct.c:177
decode_block
static int decode_block(BinkAudioContext *s, float **out, int use_dct)
Decode Bink Audio block.
Definition: binkaudio.c:171
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
AVCodecContext::extradata
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:1666
get_bits_align32
static void get_bits_align32(GetBitContext *s)
Definition: binkaudio.c:289
RDFTContext
Definition: rdft.h:28
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
uint8_t
uint8_t
Definition: audio_convert.c:194
DCTContext
Definition: dct.h:32
AVCodec::name
const char * name
Name of the codec implementation.
Definition: avcodec.h:3488
avcodec.h
ret
ret
Definition: filter_design.txt:187
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
BinkAudioContext::dct
DCTContext dct
Definition: binkaudio.c:64
AVCodecContext
main external API structure.
Definition: avcodec.h:1565
channel_layout.h
AV_CODEC_CAP_DELAY
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition: avcodec.h:1006
BinkAudioContext::trans
union BinkAudioContext::@46 trans
quant
const uint8_t * quant
Definition: vorbis_enc_data.h:458
BinkAudioContext::num_bands
int num_bands
Definition: binkaudio.c:56
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:1592
AVPacket
This structure stores compressed data.
Definition: avcodec.h:1454
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
BinkAudioContext::block_size
int block_size
Definition: binkaudio.c:55
coeff
static const double coeff[2][5]
Definition: vf_owdenoise.c:72
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
AV_CODEC_ID_BINKAUDIO_RDFT
@ AV_CODEC_ID_BINKAUDIO_RDFT
Definition: avcodec.h:611
MAX_CHANNELS
#define MAX_CHANNELS
Definition: binkaudio.c:45
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
AV_SAMPLE_FMT_FLT
@ AV_SAMPLE_FMT_FLT
float
Definition: samplefmt.h:63