FFmpeg
wmadec.c
Go to the documentation of this file.
1 /*
2  * WMA compatible decoder
3  * Copyright (c) 2002 The FFmpeg Project
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * WMA compatible decoder.
25  * This decoder handles Microsoft Windows Media Audio data, versions 1 & 2.
26  * WMA v1 is identified by audio format 0x160 in Microsoft media files
27  * (ASF/AVI/WAV). WMA v2 is identified by audio format 0x161.
28  *
29  * To use this decoder, a calling application must supply the extra data
30  * bytes provided with the WMA data. These are the extra, codec-specific
31  * bytes at the end of a WAVEFORMATEX data structure. Transmit these bytes
32  * to the decoder using the extradata[_size] fields in AVCodecContext. There
33  * should be 4 extra bytes for v1 data and 6 extra bytes for v2 data.
34  */
35 
36 #include "config_components.h"
37 
38 #include "libavutil/attributes.h"
39 #include "libavutil/avassert.h"
40 #include "libavutil/ffmath.h"
41 
42 #include "avcodec.h"
43 #include "codec_internal.h"
44 #include "decode.h"
45 #include "internal.h"
46 #include "wma.h"
47 
48 #define EXPVLCBITS 8
49 #define EXPMAX ((19 + EXPVLCBITS - 1) / EXPVLCBITS)
50 
51 #define HGAINVLCBITS 9
52 #define HGAINMAX ((13 + HGAINVLCBITS - 1) / HGAINVLCBITS)
53 
54 static void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len);
55 
56 #ifdef TRACE
57 static void dump_floats(WMACodecContext *s, const char *name,
58  int prec, const float *tab, int n)
59 {
60  int i;
61 
62  ff_tlog(s->avctx, "%s[%d]:\n", name, n);
63  for (i = 0; i < n; i++) {
64  if ((i & 7) == 0)
65  ff_tlog(s->avctx, "%4d: ", i);
66  ff_tlog(s->avctx, " %8.*f", prec, tab[i]);
67  if ((i & 7) == 7)
68  ff_tlog(s->avctx, "\n");
69  }
70  if ((i & 7) != 0)
71  ff_tlog(s->avctx, "\n");
72 }
73 #endif /* TRACE */
74 
76 {
77  WMACodecContext *s = avctx->priv_data;
78  int i, flags2, ret;
79  uint8_t *extradata;
80 
81  if (!avctx->block_align) {
82  av_log(avctx, AV_LOG_ERROR, "block_align is not set\n");
83  return AVERROR(EINVAL);
84  }
85 
86  s->avctx = avctx;
87 
88  /* extract flag info */
89  flags2 = 0;
90  extradata = avctx->extradata;
91  if (avctx->codec->id == AV_CODEC_ID_WMAV1 && avctx->extradata_size >= 4)
92  flags2 = AV_RL16(extradata + 2);
93  else if (avctx->codec->id == AV_CODEC_ID_WMAV2 && avctx->extradata_size >= 6)
94  flags2 = AV_RL16(extradata + 4);
95 
96  s->use_exp_vlc = flags2 & 0x0001;
97  s->use_bit_reservoir = flags2 & 0x0002;
98  s->use_variable_block_len = flags2 & 0x0004;
99 
100  if (avctx->codec->id == AV_CODEC_ID_WMAV2 && avctx->extradata_size >= 8){
101  if (AV_RL16(extradata+4)==0xd && s->use_variable_block_len){
102  av_log(avctx, AV_LOG_WARNING, "Disabling use_variable_block_len, if this fails contact the ffmpeg developers and send us the file\n");
103  s->use_variable_block_len= 0; // this fixes issue1503
104  }
105  }
106 
107  for (i=0; i<MAX_CHANNELS; i++)
108  s->max_exponent[i] = 1.0;
109 
110  if ((ret = ff_wma_init(avctx, flags2)) < 0)
111  return ret;
112 
113  /* init MDCT */
114  for (i = 0; i < s->nb_block_sizes; i++) {
115  float scale = 1.0 / 32768.0;
116  ret = av_tx_init(&s->mdct_ctx[i], &s->mdct_fn[i], AV_TX_FLOAT_MDCT,
117  1, 1 << (s->frame_len_bits - i), &scale, AV_TX_FULL_IMDCT);
118  if (ret < 0)
119  return ret;
120  }
121 
122  if (s->use_noise_coding) {
125  &ff_wma_hgain_hufftab[0][1], 2,
126  &ff_wma_hgain_hufftab[0][0], 2, 1,
127  -18, 0, avctx);
128  if (ret < 0)
129  return ret;
130  }
131 
132  if (s->use_exp_vlc) {
133  // FIXME move out of context
134  ret = vlc_init(&s->exp_vlc, EXPVLCBITS, sizeof(ff_aac_scalefactor_bits),
136  ff_aac_scalefactor_code, 4, 4, 0);
137  if (ret < 0)
138  return ret;
139  } else
140  wma_lsp_to_curve_init(s, s->frame_len);
141 
143 
144  avctx->delay = s->frame_len * 2;
145 
146  return 0;
147 }
148 
149 /**
150  * compute x^-0.25 with an exponent and mantissa table. We use linear
151  * interpolation to reduce the mantissa table size at a small speed
152  * expense (linear interpolation approximately doubles the number of
153  * bits of precision).
154  */
155 static inline float pow_m1_4(WMACodecContext *s, float x)
156 {
157  union {
158  float f;
159  unsigned int v;
160  } u, t;
161  unsigned int e, m;
162  float a, b;
163 
164  u.f = x;
165  e = u.v >> 23;
166  m = (u.v >> (23 - LSP_POW_BITS)) & ((1 << LSP_POW_BITS) - 1);
167  /* build interpolation scale: 1 <= t < 2. */
168  t.v = ((u.v << LSP_POW_BITS) & ((1 << 23) - 1)) | (127 << 23);
169  a = s->lsp_pow_m_table1[m];
170  b = s->lsp_pow_m_table2[m];
171  return s->lsp_pow_e_table[e] * (a + b * t.f);
172 }
173 
174 static av_cold void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len)
175 {
176  float wdel, a, b;
177  int i, e, m;
178 
179  wdel = M_PI / frame_len;
180  for (i = 0; i < frame_len; i++)
181  s->lsp_cos_table[i] = 2.0f * cos(wdel * i);
182 
183  /* tables for x^-0.25 computation */
184  for (i = 0; i < 256; i++) {
185  e = i - 126;
186  s->lsp_pow_e_table[i] = exp2f(e * -0.25);
187  }
188 
189  /* NOTE: these two tables are needed to avoid two operations in
190  * pow_m1_4 */
191  b = 1.0;
192  for (i = (1 << LSP_POW_BITS) - 1; i >= 0; i--) {
193  m = (1 << LSP_POW_BITS) + i;
194  a = (float) m * (0.5 / (1 << LSP_POW_BITS));
195  a = 1/sqrt(sqrt(a));
196  s->lsp_pow_m_table1[i] = 2 * a - b;
197  s->lsp_pow_m_table2[i] = b - a;
198  b = a;
199  }
200 }
201 
202 /**
203  * NOTE: We use the same code as Vorbis here
204  * @todo optimize it further with SSE/3Dnow
205  */
206 static void wma_lsp_to_curve(WMACodecContext *s, float *out, float *val_max_ptr,
207  int n, float *lsp)
208 {
209  int i, j;
210  float p, q, w, v, val_max;
211 
212  val_max = 0;
213  for (i = 0; i < n; i++) {
214  p = 0.5f;
215  q = 0.5f;
216  w = s->lsp_cos_table[i];
217  for (j = 1; j < NB_LSP_COEFS; j += 2) {
218  q *= w - lsp[j - 1];
219  p *= w - lsp[j];
220  }
221  p *= p * (2.0f - w);
222  q *= q * (2.0f + w);
223  v = p + q;
224  v = pow_m1_4(s, v);
225  if (v > val_max)
226  val_max = v;
227  out[i] = v;
228  }
229  *val_max_ptr = val_max;
230 }
231 
232 /**
233  * decode exponents coded with LSP coefficients (same idea as Vorbis)
234  */
235 static void decode_exp_lsp(WMACodecContext *s, int ch)
236 {
237  float lsp_coefs[NB_LSP_COEFS];
238  int val, i;
239 
240  for (i = 0; i < NB_LSP_COEFS; i++) {
241  if (i == 0 || i >= 8)
242  val = get_bits(&s->gb, 3);
243  else
244  val = get_bits(&s->gb, 4);
245  lsp_coefs[i] = ff_wma_lsp_codebook[i][val];
246  }
247 
248  wma_lsp_to_curve(s, s->exponents[ch], &s->max_exponent[ch],
249  s->block_len, lsp_coefs);
250 }
251 
252 /** pow(10, i / 16.0) for i in -60..95 */
253 static const float pow_tab[] = {
254  1.7782794100389e-04, 2.0535250264571e-04,
255  2.3713737056617e-04, 2.7384196342644e-04,
256  3.1622776601684e-04, 3.6517412725484e-04,
257  4.2169650342858e-04, 4.8696752516586e-04,
258  5.6234132519035e-04, 6.4938163157621e-04,
259  7.4989420933246e-04, 8.6596432336006e-04,
260  1.0000000000000e-03, 1.1547819846895e-03,
261  1.3335214321633e-03, 1.5399265260595e-03,
262  1.7782794100389e-03, 2.0535250264571e-03,
263  2.3713737056617e-03, 2.7384196342644e-03,
264  3.1622776601684e-03, 3.6517412725484e-03,
265  4.2169650342858e-03, 4.8696752516586e-03,
266  5.6234132519035e-03, 6.4938163157621e-03,
267  7.4989420933246e-03, 8.6596432336006e-03,
268  1.0000000000000e-02, 1.1547819846895e-02,
269  1.3335214321633e-02, 1.5399265260595e-02,
270  1.7782794100389e-02, 2.0535250264571e-02,
271  2.3713737056617e-02, 2.7384196342644e-02,
272  3.1622776601684e-02, 3.6517412725484e-02,
273  4.2169650342858e-02, 4.8696752516586e-02,
274  5.6234132519035e-02, 6.4938163157621e-02,
275  7.4989420933246e-02, 8.6596432336007e-02,
276  1.0000000000000e-01, 1.1547819846895e-01,
277  1.3335214321633e-01, 1.5399265260595e-01,
278  1.7782794100389e-01, 2.0535250264571e-01,
279  2.3713737056617e-01, 2.7384196342644e-01,
280  3.1622776601684e-01, 3.6517412725484e-01,
281  4.2169650342858e-01, 4.8696752516586e-01,
282  5.6234132519035e-01, 6.4938163157621e-01,
283  7.4989420933246e-01, 8.6596432336007e-01,
284  1.0000000000000e+00, 1.1547819846895e+00,
285  1.3335214321633e+00, 1.5399265260595e+00,
286  1.7782794100389e+00, 2.0535250264571e+00,
287  2.3713737056617e+00, 2.7384196342644e+00,
288  3.1622776601684e+00, 3.6517412725484e+00,
289  4.2169650342858e+00, 4.8696752516586e+00,
290  5.6234132519035e+00, 6.4938163157621e+00,
291  7.4989420933246e+00, 8.6596432336007e+00,
292  1.0000000000000e+01, 1.1547819846895e+01,
293  1.3335214321633e+01, 1.5399265260595e+01,
294  1.7782794100389e+01, 2.0535250264571e+01,
295  2.3713737056617e+01, 2.7384196342644e+01,
296  3.1622776601684e+01, 3.6517412725484e+01,
297  4.2169650342858e+01, 4.8696752516586e+01,
298  5.6234132519035e+01, 6.4938163157621e+01,
299  7.4989420933246e+01, 8.6596432336007e+01,
300  1.0000000000000e+02, 1.1547819846895e+02,
301  1.3335214321633e+02, 1.5399265260595e+02,
302  1.7782794100389e+02, 2.0535250264571e+02,
303  2.3713737056617e+02, 2.7384196342644e+02,
304  3.1622776601684e+02, 3.6517412725484e+02,
305  4.2169650342858e+02, 4.8696752516586e+02,
306  5.6234132519035e+02, 6.4938163157621e+02,
307  7.4989420933246e+02, 8.6596432336007e+02,
308  1.0000000000000e+03, 1.1547819846895e+03,
309  1.3335214321633e+03, 1.5399265260595e+03,
310  1.7782794100389e+03, 2.0535250264571e+03,
311  2.3713737056617e+03, 2.7384196342644e+03,
312  3.1622776601684e+03, 3.6517412725484e+03,
313  4.2169650342858e+03, 4.8696752516586e+03,
314  5.6234132519035e+03, 6.4938163157621e+03,
315  7.4989420933246e+03, 8.6596432336007e+03,
316  1.0000000000000e+04, 1.1547819846895e+04,
317  1.3335214321633e+04, 1.5399265260595e+04,
318  1.7782794100389e+04, 2.0535250264571e+04,
319  2.3713737056617e+04, 2.7384196342644e+04,
320  3.1622776601684e+04, 3.6517412725484e+04,
321  4.2169650342858e+04, 4.8696752516586e+04,
322  5.6234132519035e+04, 6.4938163157621e+04,
323  7.4989420933246e+04, 8.6596432336007e+04,
324  1.0000000000000e+05, 1.1547819846895e+05,
325  1.3335214321633e+05, 1.5399265260595e+05,
326  1.7782794100389e+05, 2.0535250264571e+05,
327  2.3713737056617e+05, 2.7384196342644e+05,
328  3.1622776601684e+05, 3.6517412725484e+05,
329  4.2169650342858e+05, 4.8696752516586e+05,
330  5.6234132519035e+05, 6.4938163157621e+05,
331  7.4989420933246e+05, 8.6596432336007e+05,
332 };
333 
334 /**
335  * decode exponents coded with VLC codes
336  */
337 static int decode_exp_vlc(WMACodecContext *s, int ch)
338 {
339  int last_exp, n, code;
340  const uint16_t *ptr;
341  float v, max_scale;
342  uint32_t *q, *q_end, iv;
343  const float *ptab = pow_tab + 60;
344  const uint32_t *iptab = (const uint32_t *) ptab;
345 
346  ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits];
347  q = (uint32_t *) s->exponents[ch];
348  q_end = q + s->block_len;
349  max_scale = 0;
350  if (s->version == 1) {
351  last_exp = get_bits(&s->gb, 5) + 10;
352  v = ptab[last_exp];
353  iv = iptab[last_exp];
354  max_scale = v;
355  n = *ptr++;
356  switch (n & 3) do {
357  case 0: *q++ = iv;
358  case 3: *q++ = iv;
359  case 2: *q++ = iv;
360  case 1: *q++ = iv;
361  } while ((n -= 4) > 0);
362  } else
363  last_exp = 36;
364 
365  while (q < q_end) {
366  code = get_vlc2(&s->gb, s->exp_vlc.table, EXPVLCBITS, EXPMAX);
367  /* NOTE: this offset is the same as MPEG-4 AAC! */
368  last_exp += code - 60;
369  if ((unsigned) last_exp + 60 >= FF_ARRAY_ELEMS(pow_tab)) {
370  av_log(s->avctx, AV_LOG_ERROR, "Exponent out of range: %d\n",
371  last_exp);
372  return AVERROR_INVALIDDATA;
373  }
374  v = ptab[last_exp];
375  iv = iptab[last_exp];
376  if (v > max_scale)
377  max_scale = v;
378  n = *ptr++;
379  switch (n & 3) do {
380  case 0: *q++ = iv;
381  case 3: *q++ = iv;
382  case 2: *q++ = iv;
383  case 1: *q++ = iv;
384  } while ((n -= 4) > 0);
385  }
386  s->max_exponent[ch] = max_scale;
387  return 0;
388 }
389 
390 /**
391  * Apply MDCT window and add into output.
392  *
393  * We ensure that when the windows overlap their squared sum
394  * is always 1 (MDCT reconstruction rule).
395  */
396 static void wma_window(WMACodecContext *s, float *out)
397 {
398  float *in = s->output;
399  int block_len, bsize, n;
400 
401  /* left part */
402  if (s->block_len_bits <= s->prev_block_len_bits) {
403  block_len = s->block_len;
404  bsize = s->frame_len_bits - s->block_len_bits;
405 
406  s->fdsp->vector_fmul_add(out, in, s->windows[bsize],
407  out, block_len);
408  } else {
409  block_len = 1 << s->prev_block_len_bits;
410  n = (s->block_len - block_len) / 2;
411  bsize = s->frame_len_bits - s->prev_block_len_bits;
412 
413  s->fdsp->vector_fmul_add(out + n, in + n, s->windows[bsize],
414  out + n, block_len);
415 
416  memcpy(out + n + block_len, in + n + block_len, n * sizeof(float));
417  }
418 
419  out += s->block_len;
420  in += s->block_len;
421 
422  /* right part */
423  if (s->block_len_bits <= s->next_block_len_bits) {
424  block_len = s->block_len;
425  bsize = s->frame_len_bits - s->block_len_bits;
426 
427  s->fdsp->vector_fmul_reverse(out, in, s->windows[bsize], block_len);
428  } else {
429  block_len = 1 << s->next_block_len_bits;
430  n = (s->block_len - block_len) / 2;
431  bsize = s->frame_len_bits - s->next_block_len_bits;
432 
433  memcpy(out, in, n * sizeof(float));
434 
435  s->fdsp->vector_fmul_reverse(out + n, in + n, s->windows[bsize],
436  block_len);
437 
438  memset(out + n + block_len, 0, n * sizeof(float));
439  }
440 }
441 
442 /**
443  * @return
444  * 0 if OK.
445  * 1 if last block of frame.
446  * AVERROR if unrecoverable error.
447  */
449 {
450  int channels = s->avctx->ch_layout.nb_channels;
451  int n, v, a, bsize;
452  int coef_nb_bits, total_gain;
453  int nb_coefs[MAX_CHANNELS];
454  float mdct_norm;
455  AVTXContext *mdct;
456  av_tx_fn mdct_fn;
457 
459 
460 #ifdef TRACE
461  ff_tlog(s->avctx, "***decode_block: %d:%d\n",
462  s->frame_count - 1, s->block_num);
463 #endif /* TRACE */
464 
465  /* compute current block length */
466  if (s->use_variable_block_len) {
467  n = av_log2(s->nb_block_sizes - 1) + 1;
468 
469  if (s->reset_block_lengths) {
470  s->reset_block_lengths = 0;
471  v = get_bits(&s->gb, n);
472  if (v >= s->nb_block_sizes) {
473  av_log(s->avctx, AV_LOG_ERROR,
474  "prev_block_len_bits %d out of range\n",
475  s->frame_len_bits - v);
476  return AVERROR_INVALIDDATA;
477  }
478  s->prev_block_len_bits = s->frame_len_bits - v;
479  v = get_bits(&s->gb, n);
480  if (v >= s->nb_block_sizes) {
481  av_log(s->avctx, AV_LOG_ERROR,
482  "block_len_bits %d out of range\n",
483  s->frame_len_bits - v);
484  return AVERROR_INVALIDDATA;
485  }
486  s->block_len_bits = s->frame_len_bits - v;
487  } else {
488  /* update block lengths */
489  s->prev_block_len_bits = s->block_len_bits;
490  s->block_len_bits = s->next_block_len_bits;
491  }
492  v = get_bits(&s->gb, n);
493  if (v >= s->nb_block_sizes) {
494  av_log(s->avctx, AV_LOG_ERROR,
495  "next_block_len_bits %d out of range\n",
496  s->frame_len_bits - v);
497  return AVERROR_INVALIDDATA;
498  }
499  s->next_block_len_bits = s->frame_len_bits - v;
500  } else {
501  /* fixed block len */
502  s->next_block_len_bits = s->frame_len_bits;
503  s->prev_block_len_bits = s->frame_len_bits;
504  s->block_len_bits = s->frame_len_bits;
505  }
506 
507  if (s->frame_len_bits - s->block_len_bits >= s->nb_block_sizes){
508  av_log(s->avctx, AV_LOG_ERROR, "block_len_bits not initialized to a valid value\n");
509  return AVERROR_INVALIDDATA;
510  }
511 
512  /* now check if the block length is coherent with the frame length */
513  s->block_len = 1 << s->block_len_bits;
514  if ((s->block_pos + s->block_len) > s->frame_len) {
515  av_log(s->avctx, AV_LOG_ERROR, "frame_len overflow\n");
516  return AVERROR_INVALIDDATA;
517  }
518 
519  if (channels == 2)
520  s->ms_stereo = get_bits1(&s->gb);
521  v = 0;
522  for (int ch = 0; ch < channels; ch++) {
523  a = get_bits1(&s->gb);
524  s->channel_coded[ch] = a;
525  v |= a;
526  }
527 
528  bsize = s->frame_len_bits - s->block_len_bits;
529 
530  /* if no channel coded, no need to go further */
531  /* XXX: fix potential framing problems */
532  if (!v)
533  goto next;
534 
535  /* read total gain and extract corresponding number of bits for
536  * coef escape coding */
537  total_gain = 1;
538  for (;;) {
539  if (get_bits_left(&s->gb) < 7) {
540  av_log(s->avctx, AV_LOG_ERROR, "total_gain overread\n");
541  return AVERROR_INVALIDDATA;
542  }
543  a = get_bits(&s->gb, 7);
544  total_gain += a;
545  if (a != 127)
546  break;
547  }
548 
549  coef_nb_bits = ff_wma_total_gain_to_bits(total_gain);
550 
551  /* compute number of coefficients */
552  n = s->coefs_end[bsize] - s->coefs_start;
553  for (int ch = 0; ch < channels; ch++)
554  nb_coefs[ch] = n;
555 
556  /* complex coding */
557  if (s->use_noise_coding) {
558  for (int ch = 0; ch < channels; ch++) {
559  if (s->channel_coded[ch]) {
560  int n;
561  n = s->exponent_high_sizes[bsize];
562  for (int i = 0; i < n; i++) {
563  const unsigned a = get_bits1(&s->gb);
564  s->high_band_coded[ch][i] = a;
565  /* if noise coding, the coefficients are not transmitted */
566  if (a)
567  nb_coefs[ch] -= s->exponent_high_bands[bsize][i];
568  }
569  }
570  }
571  for (int ch = 0; ch < channels; ch++) {
572  if (s->channel_coded[ch]) {
573  int n, val;
574 
575  n = s->exponent_high_sizes[bsize];
576  val = (int) 0x80000000;
577  for (int i = 0; i < n; i++) {
578  if (s->high_band_coded[ch][i]) {
579  if (val == (int) 0x80000000) {
580  val = get_bits(&s->gb, 7) - 19;
581  } else {
582  val += get_vlc2(&s->gb, s->hgain_vlc.table,
584  }
585  s->high_band_values[ch][i] = val;
586  }
587  }
588  }
589  }
590  }
591 
592  /* exponents can be reused in short blocks. */
593  if ((s->block_len_bits == s->frame_len_bits) || get_bits1(&s->gb)) {
594  for (int ch = 0; ch < channels; ch++) {
595  if (s->channel_coded[ch]) {
596  if (s->use_exp_vlc) {
597  if (decode_exp_vlc(s, ch) < 0)
598  return AVERROR_INVALIDDATA;
599  } else {
600  decode_exp_lsp(s, ch);
601  }
602  s->exponents_bsize[ch] = bsize;
603  s->exponents_initialized[ch] = 1;
604  }
605  }
606  }
607 
608  for (int ch = 0; ch < channels; ch++) {
609  if (s->channel_coded[ch] && !s->exponents_initialized[ch])
610  return AVERROR_INVALIDDATA;
611  }
612 
613  /* parse spectral coefficients : just RLE encoding */
614  for (int ch = 0; ch < channels; ch++) {
615  if (s->channel_coded[ch]) {
616  int tindex;
617  WMACoef *ptr = &s->coefs1[ch][0];
618  int ret;
619 
620  /* special VLC tables are used for ms stereo because
621  * there is potentially less energy there */
622  tindex = (ch == 1 && s->ms_stereo);
623  memset(ptr, 0, s->block_len * sizeof(WMACoef));
624  ret = ff_wma_run_level_decode(s->avctx, &s->gb, s->coef_vlc[tindex].table,
625  s->level_table[tindex], s->run_table[tindex],
626  0, ptr, 0, nb_coefs[ch],
627  s->block_len, s->frame_len_bits, coef_nb_bits);
628  if (ret < 0)
629  return ret;
630  }
631  if (s->version == 1 && channels >= 2)
632  align_get_bits(&s->gb);
633  }
634 
635  /* normalize */
636  {
637  int n4 = s->block_len / 2;
638  mdct_norm = 1.0 / (float) n4;
639  if (s->version == 1)
640  mdct_norm *= sqrt(n4);
641  }
642 
643  /* finally compute the MDCT coefficients */
644  for (int ch = 0; ch < channels; ch++) {
645  if (s->channel_coded[ch]) {
646  WMACoef *coefs1;
647  float *coefs, *exponents, mult, mult1, noise;
648  int n, n1, last_high_band, esize;
649  float exp_power[HIGH_BAND_MAX_SIZE];
650 
651  coefs1 = s->coefs1[ch];
652  exponents = s->exponents[ch];
653  esize = s->exponents_bsize[ch];
654  mult = ff_exp10(total_gain * 0.05) / s->max_exponent[ch];
655  mult *= mdct_norm;
656  coefs = s->coefs[ch];
657  if (s->use_noise_coding) {
658  mult1 = mult;
659  /* very low freqs : noise */
660  for (int i = 0; i < s->coefs_start; i++) {
661  *coefs++ = s->noise_table[s->noise_index] *
662  exponents[i << bsize >> esize] * mult1;
663  s->noise_index = (s->noise_index + 1) &
664  (NOISE_TAB_SIZE - 1);
665  }
666 
667  n1 = s->exponent_high_sizes[bsize];
668 
669  /* compute power of high bands */
670  exponents = s->exponents[ch] +
671  (s->high_band_start[bsize] << bsize >> esize);
672  last_high_band = 0; /* avoid warning */
673  for (int j = 0; j < n1; j++) {
674  n = s->exponent_high_bands[s->frame_len_bits -
675  s->block_len_bits][j];
676  if (s->high_band_coded[ch][j]) {
677  float e2, v;
678  e2 = 0;
679  for (int i = 0; i < n; i++) {
680  v = exponents[i << bsize >> esize];
681  e2 += v * v;
682  }
683  exp_power[j] = e2 / n;
684  last_high_band = j;
685  ff_tlog(s->avctx, "%d: power=%f (%d)\n", j, exp_power[j], n);
686  }
687  exponents += n << bsize >> esize;
688  }
689 
690  /* main freqs and high freqs */
691  exponents = s->exponents[ch] + (s->coefs_start << bsize >> esize);
692  for (int j = -1; j < n1; j++) {
693  if (j < 0)
694  n = s->high_band_start[bsize] - s->coefs_start;
695  else
696  n = s->exponent_high_bands[s->frame_len_bits -
697  s->block_len_bits][j];
698  if (j >= 0 && s->high_band_coded[ch][j]) {
699  /* use noise with specified power */
700  mult1 = sqrt(exp_power[j] / exp_power[last_high_band]);
701  /* XXX: use a table */
702  mult1 = mult1 * ff_exp10(s->high_band_values[ch][j] * 0.05);
703  mult1 = mult1 / (s->max_exponent[ch] * s->noise_mult);
704  mult1 *= mdct_norm;
705  for (int i = 0; i < n; i++) {
706  noise = s->noise_table[s->noise_index];
707  s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
708  *coefs++ = noise * exponents[i << bsize >> esize] * mult1;
709  }
710  exponents += n << bsize >> esize;
711  } else {
712  /* coded values + small noise */
713  for (int i = 0; i < n; i++) {
714  noise = s->noise_table[s->noise_index];
715  s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
716  *coefs++ = ((*coefs1++) + noise) *
717  exponents[i << bsize >> esize] * mult;
718  }
719  exponents += n << bsize >> esize;
720  }
721  }
722 
723  /* very high freqs : noise */
724  n = s->block_len - s->coefs_end[bsize];
725  mult1 = mult * exponents[(-(1 << bsize)) >> esize];
726  for (int i = 0; i < n; i++) {
727  *coefs++ = s->noise_table[s->noise_index] * mult1;
728  s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
729  }
730  } else {
731  /* XXX: optimize more */
732  for (int i = 0; i < s->coefs_start; i++)
733  *coefs++ = 0.0;
734  n = nb_coefs[ch];
735  for (int i = 0; i < n; i++)
736  *coefs++ = coefs1[i] * exponents[i << bsize >> esize] * mult;
737  n = s->block_len - s->coefs_end[bsize];
738  for (int i = 0; i < n; i++)
739  *coefs++ = 0.0;
740  }
741  }
742  }
743 
744 #ifdef TRACE
745  for (int ch = 0; ch < channels; ch++) {
746  if (s->channel_coded[ch]) {
747  dump_floats(s, "exponents", 3, s->exponents[ch], s->block_len);
748  dump_floats(s, "coefs", 1, s->coefs[ch], s->block_len);
749  }
750  }
751 #endif /* TRACE */
752 
753  if (s->ms_stereo && s->channel_coded[1]) {
754  /* nominal case for ms stereo: we do it before mdct */
755  /* no need to optimize this case because it should almost
756  * never happen */
757  if (!s->channel_coded[0]) {
758  ff_tlog(s->avctx, "rare ms-stereo case happened\n");
759  memset(s->coefs[0], 0, sizeof(float) * s->block_len);
760  s->channel_coded[0] = 1;
761  }
762 
763  s->fdsp->butterflies_float(s->coefs[0], s->coefs[1], s->block_len);
764  }
765 
766 next:
767  mdct = s->mdct_ctx[bsize];
768  mdct_fn = s->mdct_fn[bsize];
769 
770  for (int ch = 0; ch < channels; ch++) {
771  int n4, index;
772 
773  n4 = s->block_len / 2;
774  if (s->channel_coded[ch])
775  mdct_fn(mdct, s->output, s->coefs[ch], sizeof(float));
776  else if (!(s->ms_stereo && ch == 1))
777  memset(s->output, 0, sizeof(s->output));
778 
779  /* multiply by the window and add in the frame */
780  index = (s->frame_len / 2) + s->block_pos - n4;
781  wma_window(s, &s->frame_out[ch][index]);
782  }
783 
784  /* update block number */
785  s->block_num++;
786  s->block_pos += s->block_len;
787  if (s->block_pos >= s->frame_len)
788  return 1;
789  else
790  return 0;
791 }
792 
793 /* decode a frame of frame_len samples */
795  int samples_offset)
796 {
797 #ifdef TRACE
798  ff_tlog(s->avctx, "***decode_frame: %d size=%d\n",
799  s->frame_count++, s->frame_len);
800 #endif /* TRACE */
801 
802  /* read each block */
803  s->block_num = 0;
804  s->block_pos = 0;
805  for (;;) {
806  int ret = wma_decode_block(s);
807  if (ret < 0)
808  return ret;
809  if (ret)
810  break;
811  }
812 
813  for (int ch = 0; ch < s->avctx->ch_layout.nb_channels; ch++) {
814  /* copy current block to output */
815  memcpy(samples[ch] + samples_offset, s->frame_out[ch],
816  s->frame_len * sizeof(*s->frame_out[ch]));
817  /* prepare for next block */
818  memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len],
819  s->frame_len * sizeof(*s->frame_out[ch]));
820 
821 #ifdef TRACE
822  dump_floats(s, "samples", 6, samples[ch] + samples_offset,
823  s->frame_len);
824 #endif /* TRACE */
825  }
826 
827  return 0;
828 }
829 
831  int *got_frame_ptr, AVPacket *avpkt)
832 {
833  const uint8_t *buf = avpkt->data;
834  int buf_size = avpkt->size;
835  WMACodecContext *s = avctx->priv_data;
836  int nb_frames, bit_offset, pos, len, ret;
837  uint8_t *q;
838  float **samples;
839  int samples_offset;
840 
841  ff_tlog(avctx, "***decode_superframe:\n");
842 
843  if (buf_size == 0) {
844  if (s->eof_done)
845  return 0;
846 
847  frame->nb_samples = s->frame_len;
848  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
849  return ret;
850 
851  frame->pts = AV_NOPTS_VALUE;
852  for (int i = 0; i < s->avctx->ch_layout.nb_channels; i++)
853  memcpy(frame->extended_data[i], &s->frame_out[i][0],
854  frame->nb_samples * sizeof(s->frame_out[i][0]));
855 
856  s->last_superframe_len = 0;
857  s->eof_done = 1;
858  *got_frame_ptr = 1;
859  return 0;
860  }
861  if (buf_size < avctx->block_align) {
862  av_log(avctx, AV_LOG_ERROR,
863  "Input packet size too small (%d < %d)\n",
864  buf_size, avctx->block_align);
865  return AVERROR_INVALIDDATA;
866  }
867  if (avctx->block_align)
868  buf_size = avctx->block_align;
869 
870  init_get_bits(&s->gb, buf, buf_size * 8);
871 
872  if (s->use_bit_reservoir) {
873  /* read super frame header */
874  skip_bits(&s->gb, 4); /* super frame index */
875  nb_frames = get_bits(&s->gb, 4) - (s->last_superframe_len <= 0);
876  if (nb_frames <= 0) {
877  int is_error = nb_frames < 0 || get_bits_left(&s->gb) <= 8;
878  av_log(avctx, is_error ? AV_LOG_ERROR : AV_LOG_WARNING,
879  "nb_frames is %d bits left %d\n",
880  nb_frames, get_bits_left(&s->gb));
881  if (is_error)
882  return AVERROR_INVALIDDATA;
883 
884  if ((s->last_superframe_len + buf_size - 1) >
887  goto fail;
888  }
889 
890  q = s->last_superframe + s->last_superframe_len;
891  len = buf_size - 1;
892  while (len > 0) {
893  *q++ = get_bits (&s->gb, 8);
894  len --;
895  }
896  memset(q, 0, AV_INPUT_BUFFER_PADDING_SIZE);
897 
898  s->last_superframe_len += 8*buf_size - 8;
899 // s->reset_block_lengths = 1; //XXX is this needed ?
900  *got_frame_ptr = 0;
901  return buf_size;
902  }
903  } else
904  nb_frames = 1;
905 
906  /* get output buffer */
907  frame->nb_samples = nb_frames * s->frame_len;
908  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
909  return ret;
910  samples = (float **) frame->extended_data;
911  samples_offset = 0;
912 
913  if (s->use_bit_reservoir) {
914  bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3);
915  if (bit_offset > get_bits_left(&s->gb)) {
916  av_log(avctx, AV_LOG_ERROR,
917  "Invalid last frame bit offset %d > buf size %d (%d)\n",
918  bit_offset, get_bits_left(&s->gb), buf_size);
920  goto fail;
921  }
922 
923  if (s->last_superframe_len > 0) {
924  /* add bit_offset bits to last frame */
925  if ((s->last_superframe_len + ((bit_offset + 7) >> 3)) >
928  goto fail;
929  }
930  q = s->last_superframe + s->last_superframe_len;
931  len = bit_offset;
932  while (len > 7) {
933  *q++ = get_bits(&s->gb, 8);
934  len -= 8;
935  }
936  if (len > 0)
937  *q++ = get_bits(&s->gb, len) << (8 - len);
938  memset(q, 0, AV_INPUT_BUFFER_PADDING_SIZE);
939 
940  /* XXX: bit_offset bits into last frame */
941  init_get_bits(&s->gb, s->last_superframe,
942  s->last_superframe_len * 8 + bit_offset);
943  /* skip unused bits */
944  if (s->last_bitoffset > 0)
945  skip_bits(&s->gb, s->last_bitoffset);
946  /* this frame is stored in the last superframe and in the
947  * current one */
948  if ((ret = wma_decode_frame(s, samples, samples_offset)) < 0)
949  goto fail;
950  samples_offset += s->frame_len;
951  nb_frames--;
952  }
953 
954  /* read each frame starting from bit_offset */
955  pos = bit_offset + 4 + 4 + s->byte_offset_bits + 3;
956  if (pos >= MAX_CODED_SUPERFRAME_SIZE * 8 || pos > buf_size * 8)
957  return AVERROR_INVALIDDATA;
958  init_get_bits(&s->gb, buf + (pos >> 3), (buf_size - (pos >> 3)) * 8);
959  len = pos & 7;
960  if (len > 0)
961  skip_bits(&s->gb, len);
962 
963  s->reset_block_lengths = 1;
964  for (int i = 0; i < nb_frames; i++) {
965  if ((ret = wma_decode_frame(s, samples, samples_offset)) < 0)
966  goto fail;
967  samples_offset += s->frame_len;
968  }
969 
970  /* we copy the end of the frame in the last frame buffer */
971  pos = get_bits_count(&s->gb) +
972  ((bit_offset + 4 + 4 + s->byte_offset_bits + 3) & ~7);
973  s->last_bitoffset = pos & 7;
974  pos >>= 3;
975  len = buf_size - pos;
976  if (len > MAX_CODED_SUPERFRAME_SIZE || len < 0) {
977  av_log(s->avctx, AV_LOG_ERROR, "len %d invalid\n", len);
979  goto fail;
980  }
981  s->last_superframe_len = len;
982  memcpy(s->last_superframe, buf + pos, len);
983  } else {
984  /* single frame decode */
985  if ((ret = wma_decode_frame(s, samples, samples_offset)) < 0)
986  goto fail;
987  samples_offset += s->frame_len;
988  }
989 
990  ff_dlog(s->avctx, "%d %d %d %d eaten:%d\n",
991  s->frame_len_bits, s->block_len_bits, s->frame_len, s->block_len,
992  avctx->block_align);
993 
994  *got_frame_ptr = 1;
995 
996  return buf_size;
997 
998 fail:
999  /* when error, we reset the bit reservoir */
1000  s->last_superframe_len = 0;
1001  return ret;
1002 }
1003 
1004 static av_cold void flush(AVCodecContext *avctx)
1005 {
1006  WMACodecContext *s = avctx->priv_data;
1007 
1008  s->last_bitoffset =
1009  s->last_superframe_len = 0;
1010 
1011  s->eof_done = 0;
1012  avctx->internal->skip_samples = s->frame_len * 2;
1013 }
1014 
1015 #if CONFIG_WMAV1_DECODER
1016 const FFCodec ff_wmav1_decoder = {
1017  .p.name = "wmav1",
1018  CODEC_LONG_NAME("Windows Media Audio 1"),
1019  .p.type = AVMEDIA_TYPE_AUDIO,
1020  .p.id = AV_CODEC_ID_WMAV1,
1021  .priv_data_size = sizeof(WMACodecContext),
1022  .init = wma_decode_init,
1023  .close = ff_wma_end,
1025  .flush = flush,
1026  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
1027  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1028 };
1029 #endif
1030 #if CONFIG_WMAV2_DECODER
1031 const FFCodec ff_wmav2_decoder = {
1032  .p.name = "wmav2",
1033  CODEC_LONG_NAME("Windows Media Audio 2"),
1034  .p.type = AVMEDIA_TYPE_AUDIO,
1035  .p.id = AV_CODEC_ID_WMAV2,
1036  .priv_data_size = sizeof(WMACodecContext),
1037  .init = wma_decode_init,
1038  .close = ff_wma_end,
1040  .flush = flush,
1041  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
1042  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1043 };
1044 #endif
AV_SAMPLE_FMT_FLTP
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition: samplefmt.h:66
nb_coefs
static int nb_coefs(int length, int level, uint64_t sn)
Definition: af_afwtdn.c:515
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
name
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 minimum maximum flags name is the option name
Definition: writing_filters.txt:88
ff_vlc_init_from_lengths
int ff_vlc_init_from_lengths(VLC *vlc, int nb_bits, int nb_codes, const int8_t *lens, int lens_wrap, const void *symbols, int symbols_wrap, int symbols_size, int offset, int flags, void *logctx)
Build VLC decoding tables suitable for use with get_vlc2()
Definition: vlc.c:306
ff_exp10
static av_always_inline double ff_exp10(double x)
Compute 10^x for floating point values.
Definition: ffmath.h:42
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:42
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:694
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
out
static FILE * out
Definition: movenc.c:55
flush
static av_cold void flush(AVCodecContext *avctx)
Definition: wmadec.c:1004
AVTXContext
Definition: tx_priv.h:235
AVCodecInternal::skip_samples
int skip_samples
Number of audio samples to skip at the start of the next decoded frame.
Definition: internal.h:125
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:254
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:427
u
#define u(width, name, range_min, range_max)
Definition: cbs_apv.c:68
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:588
wma_lsp_to_curve_init
static void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len)
Definition: wmadec.c:174
b
#define b
Definition: input.c:42
FFCodec
Definition: codec_internal.h:127
ff_wma_run_level_decode
int ff_wma_run_level_decode(AVCodecContext *avctx, GetBitContext *gb, const VLCElem *vlc, const float *level_table, const uint16_t *run_table, int version, WMACoef *ptr, int offset, int num_coefs, int block_len, int frame_len_bits, int coef_nb_bits)
Decode run level compressed coefficients.
Definition: wma.c:427
AV_CODEC_ID_WMAV2
@ AV_CODEC_ID_WMAV2
Definition: codec_id.h:468
ff_wmav2_decoder
const FFCodec ff_wmav2_decoder
wma_decode_frame
static int wma_decode_frame(WMACodecContext *s, float **samples, int samples_offset)
Definition: wmadec.c:794
AVCodecContext::delay
int delay
Codec delay.
Definition: avcodec.h:583
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:517
av_tx_init
av_cold int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, int inv, int len, const void *scale, uint64_t flags)
Initialize a transform context with the given configuration (i)MDCTs with an odd length are currently...
Definition: tx.c:903
ff_wma_hgain_hufftab
const uint8_t ff_wma_hgain_hufftab[37][2]
Definition: wmadata.h:54
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:383
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:197
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:337
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
HIGH_BAND_MAX_SIZE
#define HIGH_BAND_MAX_SIZE
Definition: wma.h:41
decode_exp_lsp
static void decode_exp_lsp(WMACodecContext *s, int ch)
decode exponents coded with LSP coefficients (same idea as Vorbis)
Definition: wmadec.c:235
AVCodecContext::codec
const struct AVCodec * codec
Definition: avcodec.h:448
WMACoef
float WMACoef
type for decoded coefficients, int16_t would be enough for wma 1/2
Definition: wma.h:58
fail
#define fail()
Definition: checkasm.h:218
tab
static const struct twinvq_data tab
Definition: twinvq_data.h:10345
noise
static int noise(AVBSFContext *ctx, AVPacket *pkt)
Definition: noise.c:124
val
static double val(void *priv, double ch)
Definition: aeval.c:77
WMACodecContext
Definition: wma.h:68
mult
static int16_t mult(Float11 *f1, Float11 *f2)
Definition: g726.c:60
AV_CODEC_ID_WMAV1
@ AV_CODEC_ID_WMAV1
Definition: codec_id.h:467
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:106
av_tx_fn
void(* av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride)
Function pointer to a function to perform the transform.
Definition: tx.h:151
float
float
Definition: af_crystalizer.c:122
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:523
AV_TX_FLOAT_MDCT
@ AV_TX_FLOAT_MDCT
Standard MDCT with a sample data type of float, double or int32_t, respectively.
Definition: tx.h:68
EXPVLCBITS
#define EXPVLCBITS
Definition: wmadec.c:48
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:347
s
#define s(width, name)
Definition: cbs_vp9.c:198
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
vlc_init
#define vlc_init(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
Definition: vlc.h:70
exp2f
#define exp2f(x)
Definition: libm.h:295
channels
channels
Definition: aptx.h:31
decode.h
AV_RL16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
Definition: bytestream.h:94
wma.h
ff_wma_total_gain_to_bits
int ff_wma_total_gain_to_bits(int total_gain)
Definition: wma.c:353
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:332
if
if(ret)
Definition: filter_design.txt:179
AV_TX_FULL_IMDCT
@ AV_TX_FULL_IMDCT
Performs a full inverse MDCT rather than leaving out samples that can be derived through symmetry.
Definition: tx.h:175
HGAINMAX
#define HGAINMAX
Definition: wmadec.c:52
AVCodecContext::internal
struct AVCodecInternal * internal
Private context used for internal data.
Definition: avcodec.h:474
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:391
get_vlc2
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:651
index
int index
Definition: gxfenc.c:90
ff_wma_end
av_cold int ff_wma_end(AVCodecContext *avctx)
Definition: wma.c:367
MAX_CODED_SUPERFRAME_SIZE
#define MAX_CODED_SUPERFRAME_SIZE
Definition: wma.h:46
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
ff_aac_scalefactor_bits
const uint8_t ff_aac_scalefactor_bits[121]
Definition: aactab.c:200
f
f
Definition: af_crystalizer.c:122
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1729
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:550
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
AVPacket::size
int size
Definition: packet.h:589
ff_wmav1_decoder
const FFCodec ff_wmav1_decoder
codec_internal.h
wma_lsp_to_curve
static void wma_lsp_to_curve(WMACodecContext *s, float *out, float *val_max_ptr, int n, float *lsp)
NOTE: We use the same code as Vorbis here.
Definition: wmadec.c:206
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:1039
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
ff_wma_init
av_cold int ff_wma_init(AVCodecContext *avctx, int flags2)
Definition: wma.c:79
NOISE_TAB_SIZE
#define NOISE_TAB_SIZE
Definition: wma.h:50
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
attributes.h
MAX_CHANNELS
#define MAX_CHANNELS
Definition: aac.h:33
wma_decode_block
static int wma_decode_block(WMACodecContext *s)
Definition: wmadec.c:448
M_PI
#define M_PI
Definition: mathematics.h:67
pow_tab
static const float pow_tab[]
pow(10, i / 16.0) for i in -60..95
Definition: wmadec.c:253
AVCodec::id
enum AVCodecID id
Definition: codec.h:186
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:68
LSP_POW_BITS
#define LSP_POW_BITS
Definition: wma.h:52
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
code
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
Definition: filter_design.txt:178
AVCodecContext::extradata
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition: avcodec.h:522
wma_window
static void wma_window(WMACodecContext *s, float *out)
Apply MDCT window and add into output.
Definition: wmadec.c:396
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
len
int len
Definition: vorbis_enc_data.h:426
avcodec.h
ret
ret
Definition: filter_design.txt:187
AVCodecContext::block_align
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs.
Definition: avcodec.h:1065
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:265
wma_decode_superframe
static int wma_decode_superframe(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
Definition: wmadec.c:830
HGAINVLCBITS
#define HGAINVLCBITS
Definition: wmadec.c:51
align_get_bits
static const uint8_t * align_get_bits(GetBitContext *s)
Definition: get_bits.h:560
pos
unsigned int pos
Definition: spdifenc.c:414
EXPMAX
#define EXPMAX
Definition: wmadec.c:49
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
AVCodecContext
main external API structure.
Definition: avcodec.h:439
decode_exp_vlc
static int decode_exp_vlc(WMACodecContext *s, int ch)
decode exponents coded with VLC codes
Definition: wmadec.c:337
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: codec.h:76
samples
Filter the word “frame” indicates either a video frame or a group of audio samples
Definition: filter_design.txt:8
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
ffmath.h
ff_wma_lsp_codebook
const float ff_wma_lsp_codebook[NB_LSP_COEFS][16]
Definition: wmadata.h:64
w
uint8_t w
Definition: llvidencdsp.c:39
scale
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition: intra.c:278
ff_tlog
#define ff_tlog(a,...)
Definition: tableprint_vlc.h:29
AVPacket
This structure stores compressed data.
Definition: packet.h:565
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:466
NB_LSP_COEFS
#define NB_LSP_COEFS
Definition: wma.h:43
wma_decode_init
static av_cold int wma_decode_init(AVCodecContext *avctx)
Definition: wmadec.c:75
pow_m1_4
static float pow_m1_4(WMACodecContext *s, float x)
compute x^-0.25 with an exponent and mantissa table.
Definition: wmadec.c:155
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
ff_aac_scalefactor_code
const uint32_t ff_aac_scalefactor_code[121]
Definition: aactab.c:181