twinvq.c
Go to the documentation of this file.
1 /*
2  * TwinVQ decoder
3  * Copyright (c) 2009 Vitor Sessak
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 
23 #include "libavutil/float_dsp.h"
24 #include "avcodec.h"
25 #include "get_bits.h"
26 #include "fft.h"
27 #include "internal.h"
28 #include "lsp.h"
29 #include "sinewin.h"
30 
31 #include <math.h>
32 #include <stdint.h>
33 
34 #include "twinvq_data.h"
35 
36 enum FrameType {
37  FT_SHORT = 0, ///< Short frame (divided in n sub-blocks)
38  FT_MEDIUM, ///< Medium frame (divided in m<n sub-blocks)
39  FT_LONG, ///< Long frame (single sub-block + PPC)
40  FT_PPC, ///< Periodic Peak Component (part of the long frame)
41 };
42 
43 /**
44  * Parameters and tables that are different for each frame type
45  */
46 struct FrameMode {
47  uint8_t sub; ///< Number subblocks in each frame
48  const uint16_t *bark_tab;
49 
50  /** number of distinct bark scale envelope values */
52 
53  const int16_t *bark_cb; ///< codebook for the bark scale envelope (BSE)
54  uint8_t bark_n_coef;///< number of BSE CB coefficients to read
55  uint8_t bark_n_bit; ///< number of bits of the BSE coefs
56 
57  //@{
58  /** main codebooks for spectrum data */
59  const int16_t *cb0;
60  const int16_t *cb1;
61  //@}
62 
63  uint8_t cb_len_read; ///< number of spectrum coefficients to read
64 };
65 
66 /**
67  * Parameters and tables that are different for every combination of
68  * bitrate/sample rate
69  */
70 typedef struct {
71  struct FrameMode fmode[3]; ///< frame type-dependant parameters
72 
73  uint16_t size; ///< frame size in samples
74  uint8_t n_lsp; ///< number of lsp coefficients
75  const float *lspcodebook;
76 
77  /* number of bits of the different LSP CB coefficients */
81 
82  uint8_t lsp_split; ///< number of CB entries for the LSP decoding
83  const int16_t *ppc_shape_cb; ///< PPC shape CB
84 
85  /** number of the bits for the PPC period value */
87 
88  uint8_t ppc_shape_bit; ///< number of bits of the PPC shape CB coeffs
89  uint8_t ppc_shape_len; ///< size of PPC shape CB
90  uint8_t pgain_bit; ///< bits for PPC gain
91 
92  /** constant for peak period to peak width conversion */
93  uint16_t peak_per2wid;
94 } ModeTab;
95 
96 static const ModeTab mode_08_08 = {
97  {
98  { 8, bark_tab_s08_64, 10, tab.fcb08s , 1, 5, tab.cb0808s0, tab.cb0808s1, 18},
99  { 2, bark_tab_m08_256, 20, tab.fcb08m , 2, 5, tab.cb0808m0, tab.cb0808m1, 16},
100  { 1, bark_tab_l08_512, 30, tab.fcb08l , 3, 6, tab.cb0808l0, tab.cb0808l1, 17}
101  },
102  512 , 12, tab.lsp08, 1, 5, 3, 3, tab.shape08 , 8, 28, 20, 6, 40
103 };
104 
105 static const ModeTab mode_11_08 = {
106  {
107  { 8, bark_tab_s11_64, 10, tab.fcb11s , 1, 5, tab.cb1108s0, tab.cb1108s1, 29},
108  { 2, bark_tab_m11_256, 20, tab.fcb11m , 2, 5, tab.cb1108m0, tab.cb1108m1, 24},
109  { 1, bark_tab_l11_512, 30, tab.fcb11l , 3, 6, tab.cb1108l0, tab.cb1108l1, 27}
110  },
111  512 , 16, tab.lsp11, 1, 6, 4, 3, tab.shape11 , 9, 36, 30, 7, 90
112 };
113 
114 static const ModeTab mode_11_10 = {
115  {
116  { 8, bark_tab_s11_64, 10, tab.fcb11s , 1, 5, tab.cb1110s0, tab.cb1110s1, 21},
117  { 2, bark_tab_m11_256, 20, tab.fcb11m , 2, 5, tab.cb1110m0, tab.cb1110m1, 18},
118  { 1, bark_tab_l11_512, 30, tab.fcb11l , 3, 6, tab.cb1110l0, tab.cb1110l1, 20}
119  },
120  512 , 16, tab.lsp11, 1, 6, 4, 3, tab.shape11 , 9, 36, 30, 7, 90
121 };
122 
123 static const ModeTab mode_16_16 = {
124  {
125  { 8, bark_tab_s16_128, 10, tab.fcb16s , 1, 5, tab.cb1616s0, tab.cb1616s1, 16},
126  { 2, bark_tab_m16_512, 20, tab.fcb16m , 2, 5, tab.cb1616m0, tab.cb1616m1, 15},
127  { 1, bark_tab_l16_1024,30, tab.fcb16l , 3, 6, tab.cb1616l0, tab.cb1616l1, 16}
128  },
129  1024, 16, tab.lsp16, 1, 6, 4, 3, tab.shape16 , 9, 56, 60, 7, 180
130 };
131 
132 static const ModeTab mode_22_20 = {
133  {
134  { 8, bark_tab_s22_128, 10, tab.fcb22s_1, 1, 6, tab.cb2220s0, tab.cb2220s1, 18},
135  { 2, bark_tab_m22_512, 20, tab.fcb22m_1, 2, 6, tab.cb2220m0, tab.cb2220m1, 17},
136  { 1, bark_tab_l22_1024,32, tab.fcb22l_1, 4, 6, tab.cb2220l0, tab.cb2220l1, 18}
137  },
138  1024, 16, tab.lsp22_1, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144
139 };
140 
141 static const ModeTab mode_22_24 = {
142  {
143  { 8, bark_tab_s22_128, 10, tab.fcb22s_1, 1, 6, tab.cb2224s0, tab.cb2224s1, 15},
144  { 2, bark_tab_m22_512, 20, tab.fcb22m_1, 2, 6, tab.cb2224m0, tab.cb2224m1, 14},
145  { 1, bark_tab_l22_1024,32, tab.fcb22l_1, 4, 6, tab.cb2224l0, tab.cb2224l1, 15}
146  },
147  1024, 16, tab.lsp22_1, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144
148 };
149 
150 static const ModeTab mode_22_32 = {
151  {
152  { 4, bark_tab_s22_128, 10, tab.fcb22s_2, 1, 6, tab.cb2232s0, tab.cb2232s1, 11},
153  { 2, bark_tab_m22_256, 20, tab.fcb22m_2, 2, 6, tab.cb2232m0, tab.cb2232m1, 11},
154  { 1, bark_tab_l22_512, 32, tab.fcb22l_2, 4, 6, tab.cb2232l0, tab.cb2232l1, 12}
155  },
156  512 , 16, tab.lsp22_2, 1, 6, 4, 4, tab.shape22_2, 9, 56, 36, 7, 72
157 };
158 
159 static const ModeTab mode_44_40 = {
160  {
161  {16, bark_tab_s44_128, 10, tab.fcb44s , 1, 6, tab.cb4440s0, tab.cb4440s1, 18},
162  { 4, bark_tab_m44_512, 20, tab.fcb44m , 2, 6, tab.cb4440m0, tab.cb4440m1, 17},
163  { 1, bark_tab_l44_2048,40, tab.fcb44l , 4, 6, tab.cb4440l0, tab.cb4440l1, 17}
164  },
165  2048, 20, tab.lsp44, 1, 6, 4, 4, tab.shape44 , 9, 84, 54, 7, 432
166 };
167 
168 static const ModeTab mode_44_48 = {
169  {
170  {16, bark_tab_s44_128, 10, tab.fcb44s , 1, 6, tab.cb4448s0, tab.cb4448s1, 15},
171  { 4, bark_tab_m44_512, 20, tab.fcb44m , 2, 6, tab.cb4448m0, tab.cb4448m1, 14},
172  { 1, bark_tab_l44_2048,40, tab.fcb44l , 4, 6, tab.cb4448l0, tab.cb4448l1, 14}
173  },
174  2048, 20, tab.lsp44, 1, 6, 4, 4, tab.shape44 , 9, 84, 54, 7, 432
175 };
176 
177 typedef struct TwinContext {
180  FFTContext mdct_ctx[3];
181 
182  const ModeTab *mtab;
183 
184  // history
185  float lsp_hist[2][20]; ///< LSP coefficients of the last frame
186  float bark_hist[3][2][40]; ///< BSE coefficients of last frame
187 
188  // bitstream parameters
189  int16_t permut[4][4096];
190  uint8_t length[4][2]; ///< main codebook stride
191  uint8_t length_change[4];
192  uint8_t bits_main_spec[2][4][2]; ///< bits for the main codebook
193  int bits_main_spec_change[4];
194  int n_div[4];
195 
196  float *spectrum;
197  float *curr_frame; ///< non-interleaved output
198  float *prev_frame; ///< non-interleaved previous frame
199  int last_block_pos[2];
201 
202  float *cos_tabs[3];
203 
204  // scratch buffers
205  float *tmp_buf;
206 } TwinContext;
207 
208 #define PPC_SHAPE_CB_SIZE 64
209 #define PPC_SHAPE_LEN_MAX 60
210 #define SUB_AMP_MAX 4500.0
211 #define MULAW_MU 100.0
212 #define GAIN_BITS 8
213 #define AMP_MAX 13000.0
214 #define SUB_GAIN_BITS 5
215 #define WINDOW_TYPE_BITS 4
216 #define PGAIN_MU 200
217 #define LSP_COEFS_MAX 20
218 #define LSP_SPLIT_MAX 4
219 #define CHANNELS_MAX 2
220 #define SUBBLOCKS_MAX 16
221 #define BARK_N_COEF_MAX 4
222 
223 /** @note not speed critical, hence not optimized */
224 static void memset_float(float *buf, float val, int size)
225 {
226  while (size--)
227  *buf++ = val;
228 }
229 
230 /**
231  * Evaluate a single LPC amplitude spectrum envelope coefficient from the line
232  * spectrum pairs.
233  *
234  * @param lsp a vector of the cosinus of the LSP values
235  * @param cos_val cos(PI*i/N) where i is the index of the LPC amplitude
236  * @param order the order of the LSP (and the size of the *lsp buffer). Must
237  * be a multiple of four.
238  * @return the LPC value
239  *
240  * @todo reuse code from Vorbis decoder: vorbis_floor0_decode
241  */
242 static float eval_lpc_spectrum(const float *lsp, float cos_val, int order)
243 {
244  int j;
245  float p = 0.5f;
246  float q = 0.5f;
247  float two_cos_w = 2.0f*cos_val;
248 
249  for (j = 0; j + 1 < order; j += 2*2) {
250  // Unroll the loop once since order is a multiple of four
251  q *= lsp[j ] - two_cos_w;
252  p *= lsp[j+1] - two_cos_w;
253 
254  q *= lsp[j+2] - two_cos_w;
255  p *= lsp[j+3] - two_cos_w;
256  }
257 
258  p *= p * (2.0f - two_cos_w);
259  q *= q * (2.0f + two_cos_w);
260 
261  return 0.5 / (p + q);
262 }
263 
264 /**
265  * Evaluate the LPC amplitude spectrum envelope from the line spectrum pairs.
266  */
267 static void eval_lpcenv(TwinContext *tctx, const float *cos_vals, float *lpc)
268 {
269  int i;
270  const ModeTab *mtab = tctx->mtab;
271  int size_s = mtab->size / mtab->fmode[FT_SHORT].sub;
272 
273  for (i = 0; i < size_s/2; i++) {
274  float cos_i = tctx->cos_tabs[0][i];
275  lpc[i] = eval_lpc_spectrum(cos_vals, cos_i, mtab->n_lsp);
276  lpc[size_s-i-1] = eval_lpc_spectrum(cos_vals, -cos_i, mtab->n_lsp);
277  }
278 }
279 
280 static void interpolate(float *out, float v1, float v2, int size)
281 {
282  int i;
283  float step = (v1 - v2)/(size + 1);
284 
285  for (i = 0; i < size; i++) {
286  v2 += step;
287  out[i] = v2;
288  }
289 }
290 
291 static inline float get_cos(int idx, int part, const float *cos_tab, int size)
292 {
293  return part ? -cos_tab[size - idx - 1] :
294  cos_tab[ idx ];
295 }
296 
297 /**
298  * Evaluate the LPC amplitude spectrum envelope from the line spectrum pairs.
299  * Probably for speed reasons, the coefficients are evaluated as
300  * siiiibiiiisiiiibiiiisiiiibiiiisiiiibiiiis ...
301  * where s is an evaluated value, i is a value interpolated from the others
302  * and b might be either calculated or interpolated, depending on an
303  * unexplained condition.
304  *
305  * @param step the size of a block "siiiibiiii"
306  * @param in the cosinus of the LSP data
307  * @param part is 0 for 0...PI (positive cossinus values) and 1 for PI...2PI
308  (negative cossinus values)
309  * @param size the size of the whole output
310  */
311 static inline void eval_lpcenv_or_interp(TwinContext *tctx,
312  enum FrameType ftype,
313  float *out, const float *in,
314  int size, int step, int part)
315 {
316  int i;
317  const ModeTab *mtab = tctx->mtab;
318  const float *cos_tab = tctx->cos_tabs[ftype];
319 
320  // Fill the 's'
321  for (i = 0; i < size; i += step)
322  out[i] =
324  get_cos(i, part, cos_tab, size),
325  mtab->n_lsp);
326 
327  // Fill the 'iiiibiiii'
328  for (i = step; i <= size - 2*step; i += step) {
329  if (out[i + step] + out[i - step] > 1.95*out[i] ||
330  out[i + step] >= out[i - step]) {
331  interpolate(out + i - step + 1, out[i], out[i-step], step - 1);
332  } else {
333  out[i - step/2] =
335  get_cos(i-step/2, part, cos_tab, size),
336  mtab->n_lsp);
337  interpolate(out + i - step + 1, out[i-step/2], out[i-step ], step/2 - 1);
338  interpolate(out + i - step/2 + 1, out[i ], out[i-step/2], step/2 - 1);
339  }
340  }
341 
342  interpolate(out + size - 2*step + 1, out[size-step], out[size - 2*step], step - 1);
343 }
344 
345 static void eval_lpcenv_2parts(TwinContext *tctx, enum FrameType ftype,
346  const float *buf, float *lpc,
347  int size, int step)
348 {
349  eval_lpcenv_or_interp(tctx, ftype, lpc , buf, size/2, step, 0);
350  eval_lpcenv_or_interp(tctx, ftype, lpc + size/2, buf, size/2, 2*step, 1);
351 
352  interpolate(lpc+size/2-step+1, lpc[size/2], lpc[size/2-step], step);
353 
354  memset_float(lpc + size - 2*step + 1, lpc[size - 2*step], 2*step - 1);
355 }
356 
357 /**
358  * Inverse quantization. Read CB coefficients for cb1 and cb2 from the
359  * bitstream, sum the corresponding vectors and write the result to *out
360  * after permutation.
361  */
362 static void dequant(TwinContext *tctx, GetBitContext *gb, float *out,
363  enum FrameType ftype,
364  const int16_t *cb0, const int16_t *cb1, int cb_len)
365 {
366  int pos = 0;
367  int i, j;
368 
369  for (i = 0; i < tctx->n_div[ftype]; i++) {
370  int tmp0, tmp1;
371  int sign0 = 1;
372  int sign1 = 1;
373  const int16_t *tab0, *tab1;
374  int length = tctx->length[ftype][i >= tctx->length_change[ftype]];
375  int bitstream_second_part = (i >= tctx->bits_main_spec_change[ftype]);
376 
377  int bits = tctx->bits_main_spec[0][ftype][bitstream_second_part];
378  if (bits == 7) {
379  if (get_bits1(gb))
380  sign0 = -1;
381  bits = 6;
382  }
383  tmp0 = get_bits(gb, bits);
384 
385  bits = tctx->bits_main_spec[1][ftype][bitstream_second_part];
386 
387  if (bits == 7) {
388  if (get_bits1(gb))
389  sign1 = -1;
390 
391  bits = 6;
392  }
393  tmp1 = get_bits(gb, bits);
394 
395  tab0 = cb0 + tmp0*cb_len;
396  tab1 = cb1 + tmp1*cb_len;
397 
398  for (j = 0; j < length; j++)
399  out[tctx->permut[ftype][pos+j]] = sign0*tab0[j] + sign1*tab1[j];
400 
401  pos += length;
402  }
403 
404 }
405 
406 static inline float mulawinv(float y, float clip, float mu)
407 {
408  y = av_clipf(y/clip, -1, 1);
409  return clip * FFSIGN(y) * (exp(log(1+mu) * fabs(y)) - 1) / mu;
410 }
411 
412 /**
413  * Evaluate a*b/400 rounded to the nearest integer. When, for example,
414  * a*b == 200 and the nearest integer is ill-defined, use a table to emulate
415  * the following broken float-based implementation used by the binary decoder:
416  *
417  * @code
418  * static int very_broken_op(int a, int b)
419  * {
420  * static float test; // Ugh, force gcc to do the division first...
421  *
422  * test = a/400.;
423  * return b * test + 0.5;
424  * }
425  * @endcode
426  *
427  * @note if this function is replaced by just ROUNDED_DIV(a*b,400.), the stddev
428  * between the original file (before encoding with Yamaha encoder) and the
429  * decoded output increases, which leads one to believe that the encoder expects
430  * exactly this broken calculation.
431  */
432 static int very_broken_op(int a, int b)
433 {
434  int x = a*b + 200;
435  int size;
436  const uint8_t *rtab;
437 
438  if (x%400 || b%5)
439  return x/400;
440 
441  x /= 400;
442 
443  size = tabs[b/5].size;
444  rtab = tabs[b/5].tab;
445  return x - rtab[size*av_log2(2*(x - 1)/size)+(x - 1)%size];
446 }
447 
448 /**
449  * Sum to data a periodic peak of a given period, width and shape.
450  *
451  * @param period the period of the peak divised by 400.0
452  */
453 static void add_peak(int period, int width, const float *shape,
454  float ppc_gain, float *speech, int len)
455 {
456  int i, j;
457 
458  const float *shape_end = shape + len;
459  int center;
460 
461  // First peak centered around zero
462  for (i = 0; i < width/2; i++)
463  speech[i] += ppc_gain * *shape++;
464 
465  for (i = 1; i < ROUNDED_DIV(len,width) ; i++) {
466  center = very_broken_op(period, i);
467  for (j = -width/2; j < (width+1)/2; j++)
468  speech[j+center] += ppc_gain * *shape++;
469  }
470 
471  // For the last block, be careful not to go beyond the end of the buffer
472  center = very_broken_op(period, i);
473  for (j = -width/2; j < (width + 1)/2 && shape < shape_end; j++)
474  speech[j+center] += ppc_gain * *shape++;
475 }
476 
477 static void decode_ppc(TwinContext *tctx, int period_coef, const float *shape,
478  float ppc_gain, float *speech)
479 {
480  const ModeTab *mtab = tctx->mtab;
481  int isampf = tctx->avctx->sample_rate/1000;
482  int ibps = tctx->avctx->bit_rate/(1000 * tctx->avctx->channels);
483  int min_period = ROUNDED_DIV( 40*2*mtab->size, isampf);
484  int max_period = ROUNDED_DIV(6*40*2*mtab->size, isampf);
485  int period_range = max_period - min_period;
486 
487  // This is actually the period multiplied by 400. It is just linearly coded
488  // between its maximum and minimum value.
489  int period = min_period +
490  ROUNDED_DIV(period_coef*period_range, (1 << mtab->ppc_period_bit) - 1);
491  int width;
492 
493  if (isampf == 22 && ibps == 32) {
494  // For some unknown reason, NTT decided to code this case differently...
495  width = ROUNDED_DIV((period + 800)* mtab->peak_per2wid, 400*mtab->size);
496  } else
497  width = (period )* mtab->peak_per2wid/(400*mtab->size);
498 
499  add_peak(period, width, shape, ppc_gain, speech, mtab->ppc_shape_len);
500 }
501 
502 static void dec_gain(TwinContext *tctx, GetBitContext *gb, enum FrameType ftype,
503  float *out)
504 {
505  const ModeTab *mtab = tctx->mtab;
506  int i, j;
507  int sub = mtab->fmode[ftype].sub;
508  float step = AMP_MAX / ((1 << GAIN_BITS) - 1);
509  float sub_step = SUB_AMP_MAX / ((1 << SUB_GAIN_BITS) - 1);
510 
511  if (ftype == FT_LONG) {
512  for (i = 0; i < tctx->avctx->channels; i++)
513  out[i] = (1./(1<<13)) *
514  mulawinv(step * 0.5 + step * get_bits(gb, GAIN_BITS),
515  AMP_MAX, MULAW_MU);
516  } else {
517  for (i = 0; i < tctx->avctx->channels; i++) {
518  float val = (1./(1<<23)) *
519  mulawinv(step * 0.5 + step * get_bits(gb, GAIN_BITS),
520  AMP_MAX, MULAW_MU);
521 
522  for (j = 0; j < sub; j++) {
523  out[i*sub + j] =
524  val*mulawinv(sub_step* 0.5 +
525  sub_step* get_bits(gb, SUB_GAIN_BITS),
527  }
528  }
529  }
530 }
531 
532 /**
533  * Rearrange the LSP coefficients so that they have a minimum distance of
534  * min_dist. This function does it exactly as described in section of 3.2.4
535  * of the G.729 specification (but interestingly is different from what the
536  * reference decoder actually does).
537  */
538 static void rearrange_lsp(int order, float *lsp, float min_dist)
539 {
540  int i;
541  float min_dist2 = min_dist * 0.5;
542  for (i = 1; i < order; i++)
543  if (lsp[i] - lsp[i-1] < min_dist) {
544  float avg = (lsp[i] + lsp[i-1]) * 0.5;
545 
546  lsp[i-1] = avg - min_dist2;
547  lsp[i ] = avg + min_dist2;
548  }
549 }
550 
551 static void decode_lsp(TwinContext *tctx, int lpc_idx1, uint8_t *lpc_idx2,
552  int lpc_hist_idx, float *lsp, float *hist)
553 {
554  const ModeTab *mtab = tctx->mtab;
555  int i, j;
556 
557  const float *cb = mtab->lspcodebook;
558  const float *cb2 = cb + (1 << mtab->lsp_bit1)*mtab->n_lsp;
559  const float *cb3 = cb2 + (1 << mtab->lsp_bit2)*mtab->n_lsp;
560 
561  const int8_t funny_rounding[4] = {
562  -2,
563  mtab->lsp_split == 4 ? -2 : 1,
564  mtab->lsp_split == 4 ? -2 : 1,
565  0
566  };
567 
568  j = 0;
569  for (i = 0; i < mtab->lsp_split; i++) {
570  int chunk_end = ((i + 1)*mtab->n_lsp + funny_rounding[i])/mtab->lsp_split;
571  for (; j < chunk_end; j++)
572  lsp[j] = cb [lpc_idx1 * mtab->n_lsp + j] +
573  cb2[lpc_idx2[i] * mtab->n_lsp + j];
574  }
575 
576  rearrange_lsp(mtab->n_lsp, lsp, 0.0001);
577 
578  for (i = 0; i < mtab->n_lsp; i++) {
579  float tmp1 = 1. - cb3[lpc_hist_idx*mtab->n_lsp + i];
580  float tmp2 = hist[i] * cb3[lpc_hist_idx*mtab->n_lsp + i];
581  hist[i] = lsp[i];
582  lsp[i] = lsp[i] * tmp1 + tmp2;
583  }
584 
585  rearrange_lsp(mtab->n_lsp, lsp, 0.0001);
586  rearrange_lsp(mtab->n_lsp, lsp, 0.000095);
588 }
589 
590 static void dec_lpc_spectrum_inv(TwinContext *tctx, float *lsp,
591  enum FrameType ftype, float *lpc)
592 {
593  int i;
594  int size = tctx->mtab->size / tctx->mtab->fmode[ftype].sub;
595 
596  for (i = 0; i < tctx->mtab->n_lsp; i++)
597  lsp[i] = 2*cos(lsp[i]);
598 
599  switch (ftype) {
600  case FT_LONG:
601  eval_lpcenv_2parts(tctx, ftype, lsp, lpc, size, 8);
602  break;
603  case FT_MEDIUM:
604  eval_lpcenv_2parts(tctx, ftype, lsp, lpc, size, 2);
605  break;
606  case FT_SHORT:
607  eval_lpcenv(tctx, lsp, lpc);
608  break;
609  }
610 }
611 
612 static void imdct_and_window(TwinContext *tctx, enum FrameType ftype, int wtype,
613  float *in, float *prev, int ch)
614 {
615  FFTContext *mdct = &tctx->mdct_ctx[ftype];
616  const ModeTab *mtab = tctx->mtab;
617  int bsize = mtab->size / mtab->fmode[ftype].sub;
618  int size = mtab->size;
619  float *buf1 = tctx->tmp_buf;
620  int j;
621  int wsize; // Window size
622  float *out = tctx->curr_frame + 2*ch*mtab->size;
623  float *out2 = out;
624  float *prev_buf;
625  int first_wsize;
626 
627  static const uint8_t wtype_to_wsize[] = {0, 0, 2, 2, 2, 1, 0, 1, 1};
628  int types_sizes[] = {
629  mtab->size / mtab->fmode[FT_LONG ].sub,
630  mtab->size / mtab->fmode[FT_MEDIUM].sub,
631  mtab->size / (2*mtab->fmode[FT_SHORT ].sub),
632  };
633 
634  wsize = types_sizes[wtype_to_wsize[wtype]];
635  first_wsize = wsize;
636  prev_buf = prev + (size - bsize)/2;
637 
638  for (j = 0; j < mtab->fmode[ftype].sub; j++) {
639  int sub_wtype = ftype == FT_MEDIUM ? 8 : wtype;
640 
641  if (!j && wtype == 4)
642  sub_wtype = 4;
643  else if (j == mtab->fmode[ftype].sub-1 && wtype == 7)
644  sub_wtype = 7;
645 
646  wsize = types_sizes[wtype_to_wsize[sub_wtype]];
647 
648  mdct->imdct_half(mdct, buf1 + bsize*j, in + bsize*j);
649 
650  tctx->fdsp.vector_fmul_window(out2, prev_buf + (bsize-wsize) / 2,
651  buf1 + bsize * j,
652  ff_sine_windows[av_log2(wsize)],
653  wsize / 2);
654  out2 += wsize;
655 
656  memcpy(out2, buf1 + bsize*j + wsize/2, (bsize - wsize/2)*sizeof(float));
657 
658  out2 += ftype == FT_MEDIUM ? (bsize-wsize)/2 : bsize - wsize;
659 
660  prev_buf = buf1 + bsize*j + bsize/2;
661  }
662 
663  tctx->last_block_pos[ch] = (size + first_wsize)/2;
664 }
665 
666 static void imdct_output(TwinContext *tctx, enum FrameType ftype, int wtype,
667  float **out)
668 {
669  const ModeTab *mtab = tctx->mtab;
670  int size1, size2;
671  float *prev_buf = tctx->prev_frame + tctx->last_block_pos[0];
672  int i;
673 
674  for (i = 0; i < tctx->avctx->channels; i++) {
675  imdct_and_window(tctx, ftype, wtype,
676  tctx->spectrum + i*mtab->size,
677  prev_buf + 2*i*mtab->size,
678  i);
679  }
680 
681  if (!out)
682  return;
683 
684  size2 = tctx->last_block_pos[0];
685  size1 = mtab->size - size2;
686 
687  memcpy(&out[0][0 ], prev_buf, size1 * sizeof(out[0][0]));
688  memcpy(&out[0][size1], tctx->curr_frame, size2 * sizeof(out[0][0]));
689 
690  if (tctx->avctx->channels == 2) {
691  memcpy(&out[1][0], &prev_buf[2*mtab->size], size1 * sizeof(out[1][0]));
692  memcpy(&out[1][size1], &tctx->curr_frame[2*mtab->size], size2 * sizeof(out[1][0]));
693  tctx->fdsp.butterflies_float(out[0], out[1], mtab->size);
694  }
695 }
696 
697 static void dec_bark_env(TwinContext *tctx, const uint8_t *in, int use_hist,
698  int ch, float *out, float gain, enum FrameType ftype)
699 {
700  const ModeTab *mtab = tctx->mtab;
701  int i,j;
702  float *hist = tctx->bark_hist[ftype][ch];
703  float val = ((const float []) {0.4, 0.35, 0.28})[ftype];
704  int bark_n_coef = mtab->fmode[ftype].bark_n_coef;
705  int fw_cb_len = mtab->fmode[ftype].bark_env_size / bark_n_coef;
706  int idx = 0;
707 
708  for (i = 0; i < fw_cb_len; i++)
709  for (j = 0; j < bark_n_coef; j++, idx++) {
710  float tmp2 =
711  mtab->fmode[ftype].bark_cb[fw_cb_len*in[j] + i] * (1./4096);
712  float st = use_hist ?
713  (1. - val) * tmp2 + val*hist[idx] + 1. : tmp2 + 1.;
714 
715  hist[idx] = tmp2;
716  if (st < -1.) st = 1.;
717 
718  memset_float(out, st * gain, mtab->fmode[ftype].bark_tab[idx]);
719  out += mtab->fmode[ftype].bark_tab[idx];
720  }
721 
722 }
723 
725  float *out, enum FrameType ftype)
726 {
727  const ModeTab *mtab = tctx->mtab;
728  int channels = tctx->avctx->channels;
729  int sub = mtab->fmode[ftype].sub;
730  int block_size = mtab->size / sub;
731  float gain[CHANNELS_MAX*SUBBLOCKS_MAX];
732  float ppc_shape[PPC_SHAPE_LEN_MAX * CHANNELS_MAX * 4];
734  uint8_t bark_use_hist[CHANNELS_MAX][SUBBLOCKS_MAX];
735 
736  uint8_t lpc_idx1[CHANNELS_MAX];
738  uint8_t lpc_hist_idx[CHANNELS_MAX];
739 
740  int i, j, k;
741 
742  dequant(tctx, gb, out, ftype,
743  mtab->fmode[ftype].cb0, mtab->fmode[ftype].cb1,
744  mtab->fmode[ftype].cb_len_read);
745 
746  for (i = 0; i < channels; i++)
747  for (j = 0; j < sub; j++)
748  for (k = 0; k < mtab->fmode[ftype].bark_n_coef; k++)
749  bark1[i][j][k] =
750  get_bits(gb, mtab->fmode[ftype].bark_n_bit);
751 
752  for (i = 0; i < channels; i++)
753  for (j = 0; j < sub; j++)
754  bark_use_hist[i][j] = get_bits1(gb);
755 
756  dec_gain(tctx, gb, ftype, gain);
757 
758  for (i = 0; i < channels; i++) {
759  lpc_hist_idx[i] = get_bits(gb, tctx->mtab->lsp_bit0);
760  lpc_idx1 [i] = get_bits(gb, tctx->mtab->lsp_bit1);
761 
762  for (j = 0; j < tctx->mtab->lsp_split; j++)
763  lpc_idx2[i][j] = get_bits(gb, tctx->mtab->lsp_bit2);
764  }
765 
766  if (ftype == FT_LONG) {
767  int cb_len_p = (tctx->n_div[3] + mtab->ppc_shape_len*channels - 1)/
768  tctx->n_div[3];
769  dequant(tctx, gb, ppc_shape, FT_PPC, mtab->ppc_shape_cb,
770  mtab->ppc_shape_cb + cb_len_p*PPC_SHAPE_CB_SIZE, cb_len_p);
771  }
772 
773  for (i = 0; i < channels; i++) {
774  float *chunk = out + mtab->size * i;
775  float lsp[LSP_COEFS_MAX];
776 
777  for (j = 0; j < sub; j++) {
778  dec_bark_env(tctx, bark1[i][j], bark_use_hist[i][j], i,
779  tctx->tmp_buf, gain[sub*i+j], ftype);
780 
781  tctx->fdsp.vector_fmul(chunk + block_size*j, chunk + block_size*j,
782  tctx->tmp_buf, block_size);
783 
784  }
785 
786  if (ftype == FT_LONG) {
787  float pgain_step = 25000. / ((1 << mtab->pgain_bit) - 1);
788  int p_coef = get_bits(gb, tctx->mtab->ppc_period_bit);
789  int g_coef = get_bits(gb, tctx->mtab->pgain_bit);
790  float v = 1./8192*
791  mulawinv(pgain_step*g_coef+ pgain_step/2, 25000., PGAIN_MU);
792 
793  decode_ppc(tctx, p_coef, ppc_shape + i*mtab->ppc_shape_len, v,
794  chunk);
795  }
796 
797  decode_lsp(tctx, lpc_idx1[i], lpc_idx2[i], lpc_hist_idx[i], lsp,
798  tctx->lsp_hist[i]);
799 
800  dec_lpc_spectrum_inv(tctx, lsp, ftype, tctx->tmp_buf);
801 
802  for (j = 0; j < mtab->fmode[ftype].sub; j++) {
803  tctx->fdsp.vector_fmul(chunk, chunk, tctx->tmp_buf, block_size);
804  chunk += block_size;
805  }
806  }
807 }
808 
809 static int twin_decode_frame(AVCodecContext * avctx, void *data,
810  int *got_frame_ptr, AVPacket *avpkt)
811 {
812  AVFrame *frame = data;
813  const uint8_t *buf = avpkt->data;
814  int buf_size = avpkt->size;
815  TwinContext *tctx = avctx->priv_data;
816  GetBitContext gb;
817  const ModeTab *mtab = tctx->mtab;
818  float **out = NULL;
819  enum FrameType ftype;
820  int window_type, ret;
821  static const enum FrameType wtype_to_ftype_table[] = {
823  FT_MEDIUM, FT_LONG, FT_LONG, FT_MEDIUM, FT_MEDIUM
824  };
825 
826  if (buf_size*8 < avctx->bit_rate*mtab->size/avctx->sample_rate + 8) {
827  av_log(avctx, AV_LOG_ERROR,
828  "Frame too small (%d bytes). Truncated file?\n", buf_size);
829  return AVERROR(EINVAL);
830  }
831 
832  /* get output buffer */
833  if (tctx->discarded_packets >= 2) {
834  frame->nb_samples = mtab->size;
835  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
836  return ret;
837  out = (float **)frame->extended_data;
838  }
839 
840  init_get_bits(&gb, buf, buf_size * 8);
841  skip_bits(&gb, get_bits(&gb, 8));
842  window_type = get_bits(&gb, WINDOW_TYPE_BITS);
843 
844  if (window_type > 8) {
845  av_log(avctx, AV_LOG_ERROR, "Invalid window type, broken sample?\n");
846  return -1;
847  }
848 
849  ftype = wtype_to_ftype_table[window_type];
850 
851  read_and_decode_spectrum(tctx, &gb, tctx->spectrum, ftype);
852 
853  imdct_output(tctx, ftype, window_type, out);
854 
855  FFSWAP(float*, tctx->curr_frame, tctx->prev_frame);
856 
857  if (tctx->discarded_packets < 2) {
858  tctx->discarded_packets++;
859  *got_frame_ptr = 0;
860  return buf_size;
861  }
862 
863  *got_frame_ptr = 1;
864 
865  return buf_size;
866 }
867 
868 /**
869  * Init IMDCT and windowing tables
870  */
872 {
873  int i, j, ret;
874  const ModeTab *mtab = tctx->mtab;
875  int size_s = mtab->size / mtab->fmode[FT_SHORT].sub;
876  int size_m = mtab->size / mtab->fmode[FT_MEDIUM].sub;
877  int channels = tctx->avctx->channels;
878  float norm = channels == 1 ? 2. : 1.;
879 
880  for (i = 0; i < 3; i++) {
881  int bsize = tctx->mtab->size/tctx->mtab->fmode[i].sub;
882  if ((ret = ff_mdct_init(&tctx->mdct_ctx[i], av_log2(bsize) + 1, 1,
883  -sqrt(norm/bsize) / (1<<15))))
884  return ret;
885  }
886 
887  FF_ALLOC_OR_GOTO(tctx->avctx, tctx->tmp_buf,
888  mtab->size * sizeof(*tctx->tmp_buf), alloc_fail);
889 
890  FF_ALLOC_OR_GOTO(tctx->avctx, tctx->spectrum,
891  2 * mtab->size * channels * sizeof(*tctx->spectrum),
892  alloc_fail);
893  FF_ALLOC_OR_GOTO(tctx->avctx, tctx->curr_frame,
894  2 * mtab->size * channels * sizeof(*tctx->curr_frame),
895  alloc_fail);
896  FF_ALLOC_OR_GOTO(tctx->avctx, tctx->prev_frame,
897  2 * mtab->size * channels * sizeof(*tctx->prev_frame),
898  alloc_fail);
899 
900  for (i = 0; i < 3; i++) {
901  int m = 4*mtab->size/mtab->fmode[i].sub;
902  double freq = 2*M_PI/m;
903  FF_ALLOC_OR_GOTO(tctx->avctx, tctx->cos_tabs[i],
904  (m / 4) * sizeof(*tctx->cos_tabs[i]), alloc_fail);
905 
906  for (j = 0; j <= m/8; j++)
907  tctx->cos_tabs[i][j] = cos((2*j + 1)*freq);
908  for (j = 1; j < m/8; j++)
909  tctx->cos_tabs[i][m/4-j] = tctx->cos_tabs[i][j];
910  }
911 
912 
914  ff_init_ff_sine_windows(av_log2(size_s/2));
916 
917  return 0;
918 alloc_fail:
919  return AVERROR(ENOMEM);
920 }
921 
922 /**
923  * Interpret the data as if it were a num_blocks x line_len[0] matrix and for
924  * each line do a cyclic permutation, i.e.
925  * abcdefghijklm -> defghijklmabc
926  * where the amount to be shifted is evaluated depending on the column.
927  */
928 static void permutate_in_line(int16_t *tab, int num_vect, int num_blocks,
929  int block_size,
930  const uint8_t line_len[2], int length_div,
931  enum FrameType ftype)
932 
933 {
934  int i,j;
935 
936  for (i = 0; i < line_len[0]; i++) {
937  int shift;
938 
939  if (num_blocks == 1 ||
940  (ftype == FT_LONG && num_vect % num_blocks) ||
941  (ftype != FT_LONG && num_vect & 1 ) ||
942  i == line_len[1]) {
943  shift = 0;
944  } else if (ftype == FT_LONG) {
945  shift = i;
946  } else
947  shift = i*i;
948 
949  for (j = 0; j < num_vect && (j+num_vect*i < block_size*num_blocks); j++)
950  tab[i*num_vect+j] = i*num_vect + (j + shift) % num_vect;
951  }
952 }
953 
954 /**
955  * Interpret the input data as in the following table:
956  *
957  * @verbatim
958  *
959  * abcdefgh
960  * ijklmnop
961  * qrstuvw
962  * x123456
963  *
964  * @endverbatim
965  *
966  * and transpose it, giving the output
967  * aiqxbjr1cks2dlt3emu4fvn5gow6hp
968  */
969 static void transpose_perm(int16_t *out, int16_t *in, int num_vect,
970  const uint8_t line_len[2], int length_div)
971 {
972  int i,j;
973  int cont= 0;
974  for (i = 0; i < num_vect; i++)
975  for (j = 0; j < line_len[i >= length_div]; j++)
976  out[cont++] = in[j*num_vect + i];
977 }
978 
979 static void linear_perm(int16_t *out, int16_t *in, int n_blocks, int size)
980 {
981  int block_size = size/n_blocks;
982  int i;
983 
984  for (i = 0; i < size; i++)
985  out[i] = block_size * (in[i] % n_blocks) + in[i] / n_blocks;
986 }
987 
988 static av_cold void construct_perm_table(TwinContext *tctx,enum FrameType ftype)
989 {
990  int block_size;
991  const ModeTab *mtab = tctx->mtab;
992  int size;
993  int16_t *tmp_perm = (int16_t *) tctx->tmp_buf;
994 
995  if (ftype == FT_PPC) {
996  size = tctx->avctx->channels;
997  block_size = mtab->ppc_shape_len;
998  } else {
999  size = tctx->avctx->channels * mtab->fmode[ftype].sub;
1000  block_size = mtab->size / mtab->fmode[ftype].sub;
1001  }
1002 
1003  permutate_in_line(tmp_perm, tctx->n_div[ftype], size,
1004  block_size, tctx->length[ftype],
1005  tctx->length_change[ftype], ftype);
1006 
1007  transpose_perm(tctx->permut[ftype], tmp_perm, tctx->n_div[ftype],
1008  tctx->length[ftype], tctx->length_change[ftype]);
1009 
1010  linear_perm(tctx->permut[ftype], tctx->permut[ftype], size,
1011  size*block_size);
1012 }
1013 
1015 {
1016  const ModeTab *mtab = tctx->mtab;
1017  int n_ch = tctx->avctx->channels;
1018  int total_fr_bits = tctx->avctx->bit_rate*mtab->size/
1019  tctx->avctx->sample_rate;
1020 
1021  int lsp_bits_per_block = n_ch*(mtab->lsp_bit0 + mtab->lsp_bit1 +
1022  mtab->lsp_split*mtab->lsp_bit2);
1023 
1024  int ppc_bits = n_ch*(mtab->pgain_bit + mtab->ppc_shape_bit +
1025  mtab->ppc_period_bit);
1026 
1027  int bsize_no_main_cb[3];
1028  int bse_bits[3];
1029  int i;
1030  enum FrameType frametype;
1031 
1032  for (i = 0; i < 3; i++)
1033  // +1 for history usage switch
1034  bse_bits[i] = n_ch *
1035  (mtab->fmode[i].bark_n_coef * mtab->fmode[i].bark_n_bit + 1);
1036 
1037  bsize_no_main_cb[2] = bse_bits[2] + lsp_bits_per_block + ppc_bits +
1038  WINDOW_TYPE_BITS + n_ch*GAIN_BITS;
1039 
1040  for (i = 0; i < 2; i++)
1041  bsize_no_main_cb[i] =
1042  lsp_bits_per_block + n_ch*GAIN_BITS + WINDOW_TYPE_BITS +
1043  mtab->fmode[i].sub*(bse_bits[i] + n_ch*SUB_GAIN_BITS);
1044 
1045  // The remaining bits are all used for the main spectrum coefficients
1046  for (i = 0; i < 4; i++) {
1047  int bit_size;
1048  int vect_size;
1049  int rounded_up, rounded_down, num_rounded_down, num_rounded_up;
1050  if (i == 3) {
1051  bit_size = n_ch * mtab->ppc_shape_bit;
1052  vect_size = n_ch * mtab->ppc_shape_len;
1053  } else {
1054  bit_size = total_fr_bits - bsize_no_main_cb[i];
1055  vect_size = n_ch * mtab->size;
1056  }
1057 
1058  tctx->n_div[i] = (bit_size + 13) / 14;
1059 
1060  rounded_up = (bit_size + tctx->n_div[i] - 1)/tctx->n_div[i];
1061  rounded_down = (bit_size )/tctx->n_div[i];
1062  num_rounded_down = rounded_up * tctx->n_div[i] - bit_size;
1063  num_rounded_up = tctx->n_div[i] - num_rounded_down;
1064  tctx->bits_main_spec[0][i][0] = (rounded_up + 1)/2;
1065  tctx->bits_main_spec[1][i][0] = (rounded_up )/2;
1066  tctx->bits_main_spec[0][i][1] = (rounded_down + 1)/2;
1067  tctx->bits_main_spec[1][i][1] = (rounded_down )/2;
1068  tctx->bits_main_spec_change[i] = num_rounded_up;
1069 
1070  rounded_up = (vect_size + tctx->n_div[i] - 1)/tctx->n_div[i];
1071  rounded_down = (vect_size )/tctx->n_div[i];
1072  num_rounded_down = rounded_up * tctx->n_div[i] - vect_size;
1073  num_rounded_up = tctx->n_div[i] - num_rounded_down;
1074  tctx->length[i][0] = rounded_up;
1075  tctx->length[i][1] = rounded_down;
1076  tctx->length_change[i] = num_rounded_up;
1077  }
1078 
1079  for (frametype = FT_SHORT; frametype <= FT_PPC; frametype++)
1080  construct_perm_table(tctx, frametype);
1081 }
1082 
1084 {
1085  TwinContext *tctx = avctx->priv_data;
1086  int i;
1087 
1088  for (i = 0; i < 3; i++) {
1089  ff_mdct_end(&tctx->mdct_ctx[i]);
1090  av_free(tctx->cos_tabs[i]);
1091  }
1092 
1093 
1094  av_free(tctx->curr_frame);
1095  av_free(tctx->spectrum);
1096  av_free(tctx->prev_frame);
1097  av_free(tctx->tmp_buf);
1098 
1099  return 0;
1100 }
1101 
1103 {
1104  int ret;
1105  TwinContext *tctx = avctx->priv_data;
1106  int isampf, ibps;
1107 
1108  tctx->avctx = avctx;
1109  avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
1110 
1111  if (!avctx->extradata || avctx->extradata_size < 12) {
1112  av_log(avctx, AV_LOG_ERROR, "Missing or incomplete extradata\n");
1113  return AVERROR_INVALIDDATA;
1114  }
1115  avctx->channels = AV_RB32(avctx->extradata ) + 1;
1116  avctx->bit_rate = AV_RB32(avctx->extradata + 4) * 1000;
1117  isampf = AV_RB32(avctx->extradata + 8);
1118 
1119  if (isampf < 8 || isampf > 44) {
1120  av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate\n");
1121  return AVERROR_INVALIDDATA;
1122  }
1123  switch (isampf) {
1124  case 44: avctx->sample_rate = 44100; break;
1125  case 22: avctx->sample_rate = 22050; break;
1126  case 11: avctx->sample_rate = 11025; break;
1127  default: avctx->sample_rate = isampf * 1000; break;
1128  }
1129 
1130  if (avctx->channels <= 0 || avctx->channels > CHANNELS_MAX) {
1131  av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %i\n",
1132  avctx->channels);
1133  return -1;
1134  }
1135  avctx->channel_layout = avctx->channels == 1 ? AV_CH_LAYOUT_MONO :
1137 
1138  ibps = avctx->bit_rate / (1000 * avctx->channels);
1139 
1140  if (ibps > 255U) {
1141  av_log(avctx, AV_LOG_ERROR, "unsupported per channel bitrate %dkbps\n", ibps);
1142  return AVERROR_INVALIDDATA;
1143  }
1144 
1145  switch ((isampf << 8) + ibps) {
1146  case (8 <<8) + 8: tctx->mtab = &mode_08_08; break;
1147  case (11<<8) + 8: tctx->mtab = &mode_11_08; break;
1148  case (11<<8) + 10: tctx->mtab = &mode_11_10; break;
1149  case (16<<8) + 16: tctx->mtab = &mode_16_16; break;
1150  case (22<<8) + 20: tctx->mtab = &mode_22_20; break;
1151  case (22<<8) + 24: tctx->mtab = &mode_22_24; break;
1152  case (22<<8) + 32: tctx->mtab = &mode_22_32; break;
1153  case (44<<8) + 40: tctx->mtab = &mode_44_40; break;
1154  case (44<<8) + 48: tctx->mtab = &mode_44_48; break;
1155  default:
1156  av_log(avctx, AV_LOG_ERROR, "This version does not support %d kHz - %d kbit/s/ch mode.\n", isampf, isampf);
1157  return -1;
1158  }
1159 
1161  if ((ret = init_mdct_win(tctx))) {
1162  av_log(avctx, AV_LOG_ERROR, "Error initializing MDCT\n");
1163  twin_decode_close(avctx);
1164  return ret;
1165  }
1166  init_bitstream_params(tctx);
1167 
1168  memset_float(tctx->bark_hist[0][0], 0.1, FF_ARRAY_ELEMS(tctx->bark_hist));
1169 
1170  return 0;
1171 }
1172 
1174  .name = "twinvq",
1175  .type = AVMEDIA_TYPE_AUDIO,
1176  .id = AV_CODEC_ID_TWINVQ,
1177  .priv_data_size = sizeof(TwinContext),
1181  .capabilities = CODEC_CAP_DR1,
1182  .long_name = NULL_IF_CONFIG_SMALL("VQF TwinVQ"),
1183  .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
1185 };
FFTContext mdct_ctx[3]
Definition: twinvq.c:180
static const ModeTab mode_44_40
Definition: twinvq.c:159
static av_cold void init_bitstream_params(TwinContext *tctx)
Definition: twinvq.c:1014
int16_t cb1108l1[1728]
Definition: twinvq_data.h:153
static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb, float *out, enum FrameType ftype)
Definition: twinvq.c:724
float v
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
static av_cold int twin_decode_close(AVCodecContext *avctx)
Definition: twinvq.c:1083
int bits_main_spec_change[4]
Definition: twinvq.c:193
static const ModeTab mode_11_10
Definition: twinvq.c:114
static int shift(int a, int b)
Definition: sonic.c:86
uint8_t bits_main_spec[2][4][2]
bits for the main codebook
Definition: twinvq.c:192
#define PGAIN_MU
Definition: twinvq.c:216
static void linear_perm(int16_t *out, int16_t *in, int n_blocks, int size)
Definition: twinvq.c:979
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
int16_t cb1110s1[1344]
Definition: twinvq_data.h:170
static void dec_lpc_spectrum_inv(TwinContext *tctx, float *lsp, enum FrameType ftype, float *lpc)
Definition: twinvq.c:590
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:240
Parameters and tables that are different for every combination of bitrate/sample rate.
Definition: twinvq.c:70
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
const int16_t * ppc_shape_cb
PPC shape CB.
Definition: twinvq.c:83
static const uint16_t bark_tab_m44_512[]
Definition: twinvq_data.h:105
const ModeTab * mtab
Definition: twinvq.c:182
#define BARK_N_COEF_MAX
Definition: twinvq.c:221
float * prev_frame
non-interleaved previous frame
Definition: twinvq.c:198
int16_t cb2232m0[704]
Definition: twinvq_data.h:213
int16_t cb1108m1[1536]
Definition: twinvq_data.h:155
int16_t cb2232l0[768]
Definition: twinvq_data.h:211
uint8_t lsp_bit2
Definition: twinvq.c:80
int16_t fcb44l[640]
Definition: twinvq_data.h:225
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip in
Definition: git-howto.txt:5
int16_t cb1110l1[1280]
Definition: twinvq_data.h:166
static const ModeTab mode_22_32
Definition: twinvq.c:150
static const uint16_t bark_tab_m08_256[]
Definition: twinvq_data.h:80
int16_t permut[4][4096]
Definition: twinvq.c:189
#define FF_ARRAY_ELEMS(a)
uint8_t sub
Number subblocks in each frame.
Definition: twinvq.c:47
#define AV_CH_LAYOUT_STEREO
static const ModeTab mode_16_16
Definition: twinvq.c:123
uint8_t ppc_period_bit
number of the bits for the PPC period value
Definition: twinvq.c:86
int16_t cb1616l0[1024]
Definition: twinvq_data.h:178
struct TwinContext TwinContext
const int16_t * cb0
main codebooks for spectrum data
Definition: twinvq.c:59
uint16_t peak_per2wid
constant for peak period to peak width conversion
Definition: twinvq.c:93
const uint16_t * bark_tab
Definition: twinvq.c:48
int16_t cb1110s0[1344]
Definition: twinvq_data.h:169
initialize output if(nPeaks >3)%at least 3 peaks in spectrum for trying to find f0 nf0peaks
int16_t cb2224s0[960]
Definition: twinvq_data.h:202
int16_t cb2232s1[704]
Definition: twinvq_data.h:216
Short frame (divided in n sub-blocks)
Definition: twinvq.c:37
#define SUB_AMP_MAX
Definition: twinvq.c:210
int discarded_packets
Definition: twinvq.c:200
uint8_t ppc_shape_len
size of PPC shape CB
Definition: twinvq.c:89
int16_t fcb22l_2[512]
Definition: twinvq_data.h:205
int16_t cb4440s1[1152]
Definition: twinvq_data.h:223
int16_t cb4448l1[896]
Definition: twinvq_data.h:232
int16_t fcb11l[640]
Definition: twinvq_data.h:159
uint8_t bits
Definition: crc.c:216
enum AVSampleFormat sample_fmt
audio sample format
uint8_t
uint8_t bark_n_coef
number of BSE CB coefficients to read
Definition: twinvq.c:54
#define av_cold
Definition: attributes.h:78
float * tmp_buf
Definition: twinvq.c:205
static const uint16_t bark_tab_s11_64[]
Definition: twinvq_data.h:114
int16_t cb2232m1[704]
Definition: twinvq_data.h:214
window constants for m
int16_t cb4440m1[1088]
Definition: twinvq_data.h:221
static const struct @78 tabs[]
#define AV_RB32
void(* vector_fmul)(float *dst, const float *src0, const float *src1, int len)
Calculate the product of two vectors of floats and store the result in a vector of floats...
Definition: float_dsp.h:38
int16_t cb2220m1[1088]
Definition: twinvq_data.h:188
#define b
Definition: input.c:42
static const uint16_t bark_tab_s22_128[]
Definition: twinvq_data.h:122
static const uint16_t bark_tab_l11_512[]
Definition: twinvq_data.h:47
uint8_t lsp_bit0
Definition: twinvq.c:78
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
int16_t fcb44m[640]
Definition: twinvq_data.h:226
int16_t cb4448m0[896]
Definition: twinvq_data.h:233
int16_t cb1108l0[1728]
Definition: twinvq_data.h:152
const float * lspcodebook
Definition: twinvq.c:75
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
static void interpolate(float *out, float v1, float v2, int size)
Definition: twinvq.c:280
uint8_t length_change[4]
Definition: twinvq.c:191
uint8_t * data
static const uint16_t bark_tab_l22_1024[]
Definition: twinvq_data.h:59
int16_t cb0808l0[1088]
Definition: twinvq_data.h:145
bitstream reader API header.
static const uint16_t bark_tab_l44_2048[]
Definition: twinvq_data.h:73
integer sqrt
Definition: avutil.txt:2
#define CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
AVCodecContext * avctx
Definition: twinvq.c:178
int16_t cb1616s0[1024]
Definition: twinvq_data.h:182
static const uint16_t bark_tab_s08_64[]
Definition: twinvq_data.h:110
#define SUBBLOCKS_MAX
Definition: twinvq.c:220
uint8_t ppc_shape_bit
number of bits of the PPC shape CB coeffs
Definition: twinvq.c:88
int16_t fcb22m_1[640]
Definition: twinvq_data.h:193
int16_t cb2220l1[1152]
Definition: twinvq_data.h:186
float, planar
Definition: samplefmt.h:60
static const int16_t cos_tab[COS_TBL_SIZE+1]
Cosine table scaled by 2^14.
Definition: g723_1_data.h:131
int16_t cb2224l0[960]
Definition: twinvq_data.h:198
AVFloatDSPContext fdsp
Definition: twinvq.c:179
#define ROUNDED_DIV(a, b)
Definition: common.h:50
frame
Definition: stft.m:14
int16_t shape11[1280]
Definition: twinvq_data.h:162
uint8_t n_lsp
number of lsp coefficients
Definition: twinvq.c:74
Discrete Time axis x
int16_t shape22_2[1152]
Definition: twinvq_data.h:208
#define U(x)
int16_t fcb08m[320]
Definition: twinvq_data.h:141
void(* vector_fmul_window)(float *dst, const float *src0, const float *src1, const float *win, int len)
Overlap/add with window function.
Definition: float_dsp.h:103
static const ModeTab mode_08_08
Definition: twinvq.c:96
uint8_t bark_n_bit
number of bits of the BSE coefs
Definition: twinvq.c:55
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
int16_t fcb16m[320]
Definition: twinvq_data.h:173
int16_t cb0808m1[1024]
Definition: twinvq_data.h:150
static const uint16_t bark_tab_m11_256[]
Definition: twinvq_data.h:85
int16_t cb2220s0[1152]
Definition: twinvq_data.h:189
Long frame (single sub-block + PPC)
Definition: twinvq.c:39
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int16_t cb4440l0[1088]
Definition: twinvq_data.h:218
int16_t cb2232l1[768]
Definition: twinvq_data.h:212
static const ModeTab mode_11_08
Definition: twinvq.c:105
Spectrum Plot time data
static av_cold int init_mdct_win(TwinContext *tctx)
Init IMDCT and windowing tables.
Definition: twinvq.c:871
int n_div[4]
Definition: twinvq.c:194
static const uint16_t bark_tab_m22_256[]
Definition: twinvq_data.h:95
static const uint16_t bark_tab_m22_512[]
Definition: twinvq_data.h:100
int16_t cb2224s1[960]
Definition: twinvq_data.h:203
int16_t cb2220m0[1088]
Definition: twinvq_data.h:187
FrameType
G723.1 frame types.
Definition: g723_1_data.h:52
int flags
CODEC_FLAG_*.
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
int16_t fcb22s_1[640]
Definition: twinvq_data.h:194
const char * name
Name of the codec implementation.
int16_t cb1616l1[1024]
Definition: twinvq_data.h:179
static const uint16_t bark_tab_s44_128[]
Definition: twinvq_data.h:126
#define CHANNELS_MAX
Definition: twinvq.c:219
#define ff_mdct_init
Definition: fft.h:147
int16_t cb2224m0[896]
Definition: twinvq_data.h:200
int16_t cb2220l0[1152]
Definition: twinvq_data.h:185
int16_t fcb08l[640]
Definition: twinvq_data.h:140
static const uint16_t bark_tab_l22_512[]
Definition: twinvq_data.h:66
external API header
int16_t cb4448s0[960]
Definition: twinvq_data.h:235
static const ModeTab mode_22_24
Definition: twinvq.c:141
int size
int16_t fcb16l[640]
Definition: twinvq_data.h:172
int16_t cb1110l0[1280]
Definition: twinvq_data.h:165
uint64_t channel_layout
Audio channel layout.
static void dequant(TwinContext *tctx, GetBitContext *gb, float *out, enum FrameType ftype, const int16_t *cb0, const int16_t *cb1, int cb_len)
Inverse quantization.
Definition: twinvq.c:362
#define PPC_SHAPE_CB_SIZE
Definition: twinvq.c:208
Parameters and tables that are different for each frame type.
Definition: twinvq.c:46
int16_t cb1616m0[960]
Definition: twinvq_data.h:180
Definition: fft.h:62
int bit_rate
the average bitrate
audio channel layout utility functions
uint8_t lsp_bit1
Definition: twinvq.c:79
#define FFSIGN(a)
Definition: common.h:54
ret
Definition: avfilter.c:821
static void imdct_and_window(TwinContext *tctx, enum FrameType ftype, int wtype, float *in, float *prev, int ch)
Definition: twinvq.c:612
int16_t shape22_1[1152]
Definition: twinvq_data.h:195
static float mulawinv(float y, float clip, float mu)
Definition: twinvq.c:406
static int very_broken_op(int a, int b)
Evaluate a*b/400 rounded to the nearest integer.
Definition: twinvq.c:432
static void permutate_in_line(int16_t *tab, int num_vect, int num_blocks, int block_size, const uint8_t line_len[2], int length_div, enum FrameType ftype)
Interpret the data as if it were a num_blocks x line_len[0] matrix and for each line do a cyclic perm...
Definition: twinvq.c:928
static void rearrange_lsp(int order, float *lsp, float min_dist)
Rearrange the LSP coefficients so that they have a minimum distance of min_dist.
Definition: twinvq.c:538
static void add_peak(int period, int width, const float *shape, float ppc_gain, float *speech, int len)
Sum to data a periodic peak of a given period, width and shape.
Definition: twinvq.c:453
#define MULAW_MU
Definition: twinvq.c:211
#define LSP_COEFS_MAX
Definition: twinvq.c:217
float * curr_frame
non-interleaved output
Definition: twinvq.c:197
int16_t cb1110m0[1152]
Definition: twinvq_data.h:167
static const ModeTab mode_22_20
Definition: twinvq.c:132
const int16_t * cb1
Definition: twinvq.c:60
#define GAIN_BITS
Definition: twinvq.c:212
for k
float lsp22_1[1312]
Definition: twinvq_data.h:196
int16_t cb2224l1[960]
Definition: twinvq_data.h:199
1i.*Xphase exp()
NULL
Definition: eval.c:55
int16_t fcb22m_2[640]
Definition: twinvq_data.h:206
int16_t fcb44s[640]
Definition: twinvq_data.h:227
static int width
Definition: tests/utils.c:158
float bark_hist[3][2][40]
BSE coefficients of last frame.
Definition: twinvq.c:186
static const ModeTab mode_44_48
Definition: twinvq.c:168
float lsp44[1640]
Definition: twinvq_data.h:229
int sample_rate
samples per second
int16_t cb0808l1[1088]
Definition: twinvq_data.h:146
FIXME Range Coding of cb
Definition: snow.txt:367
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
int16_t fcb22l_1[512]
Definition: twinvq_data.h:192
int16_t shape08[1280]
Definition: twinvq_data.h:143
static const uint16_t bark_tab_m16_512[]
Definition: twinvq_data.h:90
static void decode_lsp(TwinContext *tctx, int lpc_idx1, uint8_t *lpc_idx2, int lpc_hist_idx, float *lsp, float *hist)
Definition: twinvq.c:551
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
static void dec_bark_env(TwinContext *tctx, const uint8_t *in, int use_hist, int ch, float *out, float gain, enum FrameType ftype)
Definition: twinvq.c:697
int16_t fcb16s[320]
Definition: twinvq_data.h:174
int16_t cb1616s1[1024]
Definition: twinvq_data.h:183
void(* butterflies_float)(float *av_restrict v1, float *av_restrict v2, int len)
Calculate the sum and difference of two vectors of floats.
Definition: float_dsp.h:150
void * buf
Definition: avisynth_c.h:594
#define AMP_MAX
Definition: twinvq.c:213
const int16_t * tab1
Definition: mace.c:144
uint8_t length[4][2]
main codebook stride
Definition: twinvq.c:190
AVCodec ff_twinvq_decoder
Definition: twinvq.c:1173
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
float * cos_tabs[3]
Definition: twinvq.c:202
float lsp16[1400]
Definition: twinvq_data.h:176
float lsp_hist[2][20]
LSP coefficients of the last frame.
Definition: twinvq.c:185
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:265
synthesis window for stochastic i
Periodic Peak Component (part of the long frame)
Definition: twinvq.c:40
float lsp11[1312]
Definition: twinvq_data.h:163
static const uint16_t bark_tab_l16_1024[]
Definition: twinvq_data.h:53
static int twin_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
Definition: twinvq.c:809
SINETABLE_CONST float *const ff_sine_windows[14]
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
static void imdct_output(TwinContext *tctx, enum FrameType ftype, int wtype, float **out)
Definition: twinvq.c:666
#define LSP_SPLIT_MAX
Definition: twinvq.c:218
int16_t cb4440s0[1152]
Definition: twinvq_data.h:222
#define PPC_SHAPE_LEN_MAX
Definition: twinvq.c:209
static void memset_float(float *buf, float val, int size)
Definition: twinvq.c:224
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer 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.Buffer references ownership and permissions
void(* imdct_half)(struct FFTContext *s, FFTSample *output, const FFTSample *input)
Definition: fft.h:82
int16_t cb2220s1[1152]
Definition: twinvq_data.h:190
float lsp22_2[1312]
Definition: twinvq_data.h:209
int16_t shape44[1152]
Definition: twinvq_data.h:228
static float eval_lpc_spectrum(const float *lsp, float cos_val, int order)
Evaluate a single LPC amplitude spectrum envelope coefficient from the line spectrum pairs...
Definition: twinvq.c:242
uint8_t bark_env_size
number of distinct bark scale envelope values
Definition: twinvq.c:51
#define SUB_GAIN_BITS
Definition: twinvq.c:214
int16_t cb0808s1[1152]
Definition: twinvq_data.h:148
int16_t cb1616m1[960]
Definition: twinvq_data.h:181
static void decode_ppc(TwinContext *tctx, int period_coef, const float *shape, float ppc_gain, float *speech)
Definition: twinvq.c:477
uint8_t pgain_bit
bits for PPC gain
Definition: twinvq.c:90
int last_block_pos[2]
Definition: twinvq.c:199
int16_t cb0808m0[1024]
Definition: twinvq_data.h:149
static void eval_lpcenv_or_interp(TwinContext *tctx, enum FrameType ftype, float *out, const float *in, int size, int step, int part)
Evaluate the LPC amplitude spectrum envelope from the line spectrum pairs.
Definition: twinvq.c:311
int16_t cb4448m1[896]
Definition: twinvq_data.h:234
#define WINDOW_TYPE_BITS
Definition: twinvq.c:215
common internal api header.
int16_t cb1108s1[1856]
Definition: twinvq_data.h:157
static const uint16_t bark_tab_s16_128[]
Definition: twinvq_data.h:118
static double clip(void *opaque, double val)
Clip value val in the minval - maxval range.
Definition: vf_lut.c:139
int16_t fcb11m[320]
Definition: twinvq_data.h:160
#define ff_mdct_end
Definition: fft.h:148
#define FF_ALLOC_OR_GOTO(ctx, p, size, label)
int16_t cb1110m1[1152]
Definition: twinvq_data.h:168
int16_t shape16[1920]
Definition: twinvq_data.h:175
int16_t fcb22s_2[640]
Definition: twinvq_data.h:207
AVSampleFormat
Audio Sample Formats.
Definition: samplefmt.h:49
int16_t cb1108m0[1536]
Definition: twinvq_data.h:154
int16_t cb4440m0[1088]
Definition: twinvq_data.h:220
void ff_sort_nearly_sorted_floats(float *vals, int len)
Sort values in ascending order.
Definition: lsp.c:228
int16_t cb2224m1[896]
Definition: twinvq_data.h:201
static av_cold int twin_decode_init(AVCodecContext *avctx)
Definition: twinvq.c:1102
function y
Definition: D.m:1
static void eval_lpcenv(TwinContext *tctx, const float *cos_vals, float *lpc)
Evaluate the LPC amplitude spectrum envelope from the line spectrum pairs.
Definition: twinvq.c:267
static void dec_gain(TwinContext *tctx, GetBitContext *gb, enum FrameType ftype, float *out)
Definition: twinvq.c:502
int len
int16_t cb4440l1[1088]
Definition: twinvq_data.h:219
int channels
number of audio channels
#define avg(d, s)
Definition: dsputil_align.c:52
#define av_log2
Definition: intmath.h:89
static void transpose_perm(int16_t *out, int16_t *in, int num_vect, const uint8_t line_len[2], int length_div)
Interpret the input data as in the following table:
Definition: twinvq.c:969
int16_t cb4448s1[960]
Definition: twinvq_data.h:236
static const struct twinvq_data tab
int16_t fcb11s[320]
Definition: twinvq_data.h:161
int16_t cb4448l0[896]
Definition: twinvq_data.h:231
static const uint16_t bark_tab_l08_512[]
Definition: twinvq_data.h:41
static float get_cos(int idx, int part, const float *cos_tab, int size)
Definition: twinvq.c:291
uint16_t size
frame size in samples
Definition: twinvq.c:73
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
#define M_PI
Definition: mathematics.h:46
int16_t cb0808s0[1152]
Definition: twinvq_data.h:147
int16_t cb1108s0[1856]
Definition: twinvq_data.h:156
int16_t cb2232s0[704]
Definition: twinvq_data.h:215
#define FFSWAP(type, a, b)
Definition: common.h:61
const char int length
Definition: avisynth_c.h:668
void avpriv_float_dsp_init(AVFloatDSPContext *fdsp, int bit_exact)
Initialize a float DSP context.
Definition: float_dsp.c:118
Medium frame (divided in m<n sub-blocks)
Definition: twinvq.c:38
static av_cold void construct_perm_table(TwinContext *tctx, enum FrameType ftype)
Definition: twinvq.c:988
uint8_t ** extended_data
pointers to the data planes/channels.
Definition: frame.h:117
#define AV_CH_LAYOUT_MONO
struct FrameMode fmode[3]
frame type-dependant parameters
Definition: twinvq.c:71
This structure stores compressed data.
const int16_t * bark_cb
codebook for the bark scale envelope (BSE)
Definition: twinvq.c:53
float * spectrum
Definition: twinvq.c:196
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:127
static void eval_lpcenv_2parts(TwinContext *tctx, enum FrameType ftype, const float *buf, float *lpc, int size, int step)
Definition: twinvq.c:345
void ff_init_ff_sine_windows(int index)
initialize the specified entry of ff_sine_windows
uint8_t lsp_split
number of CB entries for the LSP decoding
Definition: twinvq.c:82
uint8_t cb_len_read
number of spectrum coefficients to read
Definition: twinvq.c:63
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
int16_t fcb08s[320]
Definition: twinvq_data.h:142
float lsp08[504]
Definition: twinvq_data.h:139