FFmpeg  4.3
twinvqdec.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 
22 #include <math.h>
23 #include <stdint.h>
24 
26 #include "avcodec.h"
27 #include "get_bits.h"
28 #include "internal.h"
29 #include "twinvq.h"
30 #include "twinvq_data.h"
31 
32 static const TwinVQModeTab mode_08_08 = {
33  {
34  { 8, bark_tab_s08_64, 10, tab.fcb08s, 1, 5, tab.cb0808s0, tab.cb0808s1, 18 },
35  { 2, bark_tab_m08_256, 20, tab.fcb08m, 2, 5, tab.cb0808m0, tab.cb0808m1, 16 },
36  { 1, bark_tab_l08_512, 30, tab.fcb08l, 3, 6, tab.cb0808l0, tab.cb0808l1, 17 }
37  },
38  512, 12, tab.lsp08, 1, 5, 3, 3, tab.shape08, 8, 28, 20, 6, 40
39 };
40 
41 static const TwinVQModeTab mode_11_08 = {
42  {
43  { 8, bark_tab_s11_64, 10, tab.fcb11s, 1, 5, tab.cb1108s0, tab.cb1108s1, 29 },
44  { 2, bark_tab_m11_256, 20, tab.fcb11m, 2, 5, tab.cb1108m0, tab.cb1108m1, 24 },
45  { 1, bark_tab_l11_512, 30, tab.fcb11l, 3, 6, tab.cb1108l0, tab.cb1108l1, 27 }
46  },
47  512, 16, tab.lsp11, 1, 6, 4, 3, tab.shape11, 9, 36, 30, 7, 90
48 };
49 
50 static const TwinVQModeTab mode_11_10 = {
51  {
52  { 8, bark_tab_s11_64, 10, tab.fcb11s, 1, 5, tab.cb1110s0, tab.cb1110s1, 21 },
53  { 2, bark_tab_m11_256, 20, tab.fcb11m, 2, 5, tab.cb1110m0, tab.cb1110m1, 18 },
54  { 1, bark_tab_l11_512, 30, tab.fcb11l, 3, 6, tab.cb1110l0, tab.cb1110l1, 20 }
55  },
56  512, 16, tab.lsp11, 1, 6, 4, 3, tab.shape11, 9, 36, 30, 7, 90
57 };
58 
59 static const TwinVQModeTab mode_16_16 = {
60  {
61  { 8, bark_tab_s16_128, 10, tab.fcb16s, 1, 5, tab.cb1616s0, tab.cb1616s1, 16 },
62  { 2, bark_tab_m16_512, 20, tab.fcb16m, 2, 5, tab.cb1616m0, tab.cb1616m1, 15 },
63  { 1, bark_tab_l16_1024, 30, tab.fcb16l, 3, 6, tab.cb1616l0, tab.cb1616l1, 16 }
64  },
65  1024, 16, tab.lsp16, 1, 6, 4, 3, tab.shape16, 9, 56, 60, 7, 180
66 };
67 
68 static const TwinVQModeTab mode_22_20 = {
69  {
70  { 8, bark_tab_s22_128, 10, tab.fcb22s_1, 1, 6, tab.cb2220s0, tab.cb2220s1, 18 },
71  { 2, bark_tab_m22_512, 20, tab.fcb22m_1, 2, 6, tab.cb2220m0, tab.cb2220m1, 17 },
72  { 1, bark_tab_l22_1024, 32, tab.fcb22l_1, 4, 6, tab.cb2220l0, tab.cb2220l1, 18 }
73  },
74  1024, 16, tab.lsp22_1, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144
75 };
76 
77 static const TwinVQModeTab mode_22_24 = {
78  {
79  { 8, bark_tab_s22_128, 10, tab.fcb22s_1, 1, 6, tab.cb2224s0, tab.cb2224s1, 15 },
80  { 2, bark_tab_m22_512, 20, tab.fcb22m_1, 2, 6, tab.cb2224m0, tab.cb2224m1, 14 },
81  { 1, bark_tab_l22_1024, 32, tab.fcb22l_1, 4, 6, tab.cb2224l0, tab.cb2224l1, 15 }
82  },
83  1024, 16, tab.lsp22_1, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144
84 };
85 
86 static const TwinVQModeTab mode_22_32 = {
87  {
88  { 4, bark_tab_s22_128, 10, tab.fcb22s_2, 1, 6, tab.cb2232s0, tab.cb2232s1, 11 },
89  { 2, bark_tab_m22_256, 20, tab.fcb22m_2, 2, 6, tab.cb2232m0, tab.cb2232m1, 11 },
90  { 1, bark_tab_l22_512, 32, tab.fcb22l_2, 4, 6, tab.cb2232l0, tab.cb2232l1, 12 }
91  },
92  512, 16, tab.lsp22_2, 1, 6, 4, 4, tab.shape22_2, 9, 56, 36, 7, 72
93 };
94 
95 static const TwinVQModeTab mode_44_40 = {
96  {
97  { 16, bark_tab_s44_128, 10, tab.fcb44s, 1, 6, tab.cb4440s0, tab.cb4440s1, 18 },
98  { 4, bark_tab_m44_512, 20, tab.fcb44m, 2, 6, tab.cb4440m0, tab.cb4440m1, 17 },
99  { 1, bark_tab_l44_2048, 40, tab.fcb44l, 4, 6, tab.cb4440l0, tab.cb4440l1, 17 }
100  },
101  2048, 20, tab.lsp44, 1, 6, 4, 4, tab.shape44, 9, 84, 54, 7, 432
102 };
103 
104 static const TwinVQModeTab mode_44_48 = {
105  {
106  { 16, bark_tab_s44_128, 10, tab.fcb44s, 1, 6, tab.cb4448s0, tab.cb4448s1, 15 },
107  { 4, bark_tab_m44_512, 20, tab.fcb44m, 2, 6, tab.cb4448m0, tab.cb4448m1, 14 },
108  { 1, bark_tab_l44_2048, 40, tab.fcb44l, 4, 6, tab.cb4448l0, tab.cb4448l1, 14 }
109  },
110  2048, 20, tab.lsp44, 1, 6, 4, 4, tab.shape44, 9, 84, 54, 7, 432
111 };
112 
113 /**
114  * Evaluate a * b / 400 rounded to the nearest integer. When, for example,
115  * a * b == 200 and the nearest integer is ill-defined, use a table to emulate
116  * the following broken float-based implementation used by the binary decoder:
117  *
118  * @code
119  * static int very_broken_op(int a, int b)
120  * {
121  * static float test; // Ugh, force gcc to do the division first...
122  *
123  * test = a / 400.0;
124  * return b * test + 0.5;
125  * }
126  * @endcode
127  *
128  * @note if this function is replaced by just ROUNDED_DIV(a * b, 400.0), the
129  * stddev between the original file (before encoding with Yamaha encoder) and
130  * the decoded output increases, which leads one to believe that the encoder
131  * expects exactly this broken calculation.
132  */
133 static int very_broken_op(int a, int b)
134 {
135  int x = a * b + 200;
136  int size;
137  const uint8_t *rtab;
138 
139  if (x % 400 || b % 5)
140  return x / 400;
141 
142  x /= 400;
143 
144  size = tabs[b / 5].size;
145  rtab = tabs[b / 5].tab;
146  return x - rtab[size * av_log2(2 * (x - 1) / size) + (x - 1) % size];
147 }
148 
149 /**
150  * Sum to data a periodic peak of a given period, width and shape.
151  *
152  * @param period the period of the peak divided by 400.0
153  */
154 static void add_peak(int period, int width, const float *shape,
155  float ppc_gain, float *speech, int len)
156 {
157  int i, j;
158 
159  const float *shape_end = shape + len;
160  int center;
161 
162  // First peak centered around zero
163  for (i = 0; i < width / 2; i++)
164  speech[i] += ppc_gain * *shape++;
165 
166  for (i = 1; i < ROUNDED_DIV(len, width); i++) {
167  center = very_broken_op(period, i);
168  for (j = -width / 2; j < (width + 1) / 2; j++)
169  speech[j + center] += ppc_gain * *shape++;
170  }
171 
172  // For the last block, be careful not to go beyond the end of the buffer
173  center = very_broken_op(period, i);
174  for (j = -width / 2; j < (width + 1) / 2 && shape < shape_end; j++)
175  speech[j + center] += ppc_gain * *shape++;
176 }
177 
178 static void decode_ppc(TwinVQContext *tctx, int period_coef, int g_coef,
179  const float *shape, float *speech)
180 {
181  const TwinVQModeTab *mtab = tctx->mtab;
182  int isampf = tctx->avctx->sample_rate / 1000;
183  int ibps = tctx->avctx->bit_rate / (1000 * tctx->avctx->channels);
184  int min_period = ROUNDED_DIV(40 * 2 * mtab->size, isampf);
185  int max_period = ROUNDED_DIV(40 * 2 * mtab->size * 6, isampf);
186  int period_range = max_period - min_period;
187  float pgain_step = 25000.0 / ((1 << mtab->pgain_bit) - 1);
188  float ppc_gain = 1.0 / 8192 *
189  twinvq_mulawinv(pgain_step * g_coef +
190  pgain_step / 2,
191  25000.0, TWINVQ_PGAIN_MU);
192 
193  // This is actually the period multiplied by 400. It is just linearly coded
194  // between its maximum and minimum value.
195  int period = min_period +
196  ROUNDED_DIV(period_coef * period_range,
197  (1 << mtab->ppc_period_bit) - 1);
198  int width;
199 
200  if (isampf == 22 && ibps == 32) {
201  // For some unknown reason, NTT decided to code this case differently...
202  width = ROUNDED_DIV((period + 800) * mtab->peak_per2wid,
203  400 * mtab->size);
204  } else
205  width = period * mtab->peak_per2wid / (400 * mtab->size);
206 
207  add_peak(period, width, shape, ppc_gain, speech, mtab->ppc_shape_len);
208 }
209 
210 static void dec_bark_env(TwinVQContext *tctx, const uint8_t *in, int use_hist,
211  int ch, float *out, float gain,
212  enum TwinVQFrameType ftype)
213 {
214  const TwinVQModeTab *mtab = tctx->mtab;
215  int i, j;
216  float *hist = tctx->bark_hist[ftype][ch];
217  float val = ((const float []) { 0.4, 0.35, 0.28 })[ftype];
218  int bark_n_coef = mtab->fmode[ftype].bark_n_coef;
219  int fw_cb_len = mtab->fmode[ftype].bark_env_size / bark_n_coef;
220  int idx = 0;
221 
222  for (i = 0; i < fw_cb_len; i++)
223  for (j = 0; j < bark_n_coef; j++, idx++) {
224  float tmp2 = mtab->fmode[ftype].bark_cb[fw_cb_len * in[j] + i] *
225  (1.0 / 4096);
226  float st = use_hist ? (1.0 - val) * tmp2 + val * hist[idx] + 1.0
227  : tmp2 + 1.0;
228 
229  hist[idx] = tmp2;
230  if (st < -1.0)
231  st = 1.0;
232 
233  twinvq_memset_float(out, st * gain, mtab->fmode[ftype].bark_tab[idx]);
234  out += mtab->fmode[ftype].bark_tab[idx];
235  }
236 }
237 
238 static void read_cb_data(TwinVQContext *tctx, GetBitContext *gb,
239  uint8_t *dst, enum TwinVQFrameType ftype)
240 {
241  int i;
242 
243  for (i = 0; i < tctx->n_div[ftype]; i++) {
244  int bs_second_part = (i >= tctx->bits_main_spec_change[ftype]);
245 
246  *dst++ = get_bits(gb, tctx->bits_main_spec[0][ftype][bs_second_part]);
247  *dst++ = get_bits(gb, tctx->bits_main_spec[1][ftype][bs_second_part]);
248  }
249 }
250 
252  const uint8_t *buf, int buf_size)
253 {
254  TwinVQFrameData *bits = &tctx->bits[0];
255  const TwinVQModeTab *mtab = tctx->mtab;
256  int channels = tctx->avctx->channels;
257  int sub;
258  GetBitContext gb;
259  int i, j, k, ret;
260 
261  if ((ret = init_get_bits8(&gb, buf, buf_size)) < 0)
262  return ret;
263  skip_bits(&gb, get_bits(&gb, 8));
264 
265  bits->window_type = get_bits(&gb, TWINVQ_WINDOW_TYPE_BITS);
266 
267  if (bits->window_type > 8) {
268  av_log(avctx, AV_LOG_ERROR, "Invalid window type, broken sample?\n");
269  return AVERROR_INVALIDDATA;
270  }
271 
273 
274  sub = mtab->fmode[bits->ftype].sub;
275 
276  read_cb_data(tctx, &gb, bits->main_coeffs, bits->ftype);
277 
278  for (i = 0; i < channels; i++)
279  for (j = 0; j < sub; j++)
280  for (k = 0; k < mtab->fmode[bits->ftype].bark_n_coef; k++)
281  bits->bark1[i][j][k] =
282  get_bits(&gb, mtab->fmode[bits->ftype].bark_n_bit);
283 
284  for (i = 0; i < channels; i++)
285  for (j = 0; j < sub; j++)
286  bits->bark_use_hist[i][j] = get_bits1(&gb);
287 
288  if (bits->ftype == TWINVQ_FT_LONG) {
289  for (i = 0; i < channels; i++)
290  bits->gain_bits[i] = get_bits(&gb, TWINVQ_GAIN_BITS);
291  } else {
292  for (i = 0; i < channels; i++) {
293  bits->gain_bits[i] = get_bits(&gb, TWINVQ_GAIN_BITS);
294  for (j = 0; j < sub; j++)
295  bits->sub_gain_bits[i * sub + j] = get_bits(&gb,
297  }
298  }
299 
300  for (i = 0; i < channels; i++) {
301  bits->lpc_hist_idx[i] = get_bits(&gb, mtab->lsp_bit0);
302  bits->lpc_idx1[i] = get_bits(&gb, mtab->lsp_bit1);
303 
304  for (j = 0; j < mtab->lsp_split; j++)
305  bits->lpc_idx2[i][j] = get_bits(&gb, mtab->lsp_bit2);
306  }
307 
308  if (bits->ftype == TWINVQ_FT_LONG) {
309  read_cb_data(tctx, &gb, bits->ppc_coeffs, 3);
310  for (i = 0; i < channels; i++) {
311  bits->p_coef[i] = get_bits(&gb, mtab->ppc_period_bit);
312  bits->g_coef[i] = get_bits(&gb, mtab->pgain_bit);
313  }
314  }
315 
316  return (get_bits_count(&gb) + 7) / 8;
317 }
318 
320 {
321  int isampf, ibps;
322  TwinVQContext *tctx = avctx->priv_data;
323 
324  if (!avctx->extradata || avctx->extradata_size < 12) {
325  av_log(avctx, AV_LOG_ERROR, "Missing or incomplete extradata\n");
326  return AVERROR_INVALIDDATA;
327  }
328  avctx->channels = AV_RB32(avctx->extradata) + 1;
329  avctx->bit_rate = AV_RB32(avctx->extradata + 4) * 1000;
330  isampf = AV_RB32(avctx->extradata + 8);
331 
332  if (isampf < 8 || isampf > 44) {
333  av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate\n");
334  return AVERROR_INVALIDDATA;
335  }
336  switch (isampf) {
337  case 44:
338  avctx->sample_rate = 44100;
339  break;
340  case 22:
341  avctx->sample_rate = 22050;
342  break;
343  case 11:
344  avctx->sample_rate = 11025;
345  break;
346  default:
347  avctx->sample_rate = isampf * 1000;
348  break;
349  }
350 
351  if (avctx->channels <= 0 || avctx->channels > TWINVQ_CHANNELS_MAX) {
352  av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %i\n",
353  avctx->channels);
354  return -1;
355  }
356  avctx->channel_layout = avctx->channels == 1 ? AV_CH_LAYOUT_MONO
358 
359  ibps = avctx->bit_rate / (1000 * avctx->channels);
360  if (ibps < 8 || ibps > 48) {
361  av_log(avctx, AV_LOG_ERROR, "Bad bitrate per channel value %d\n", ibps);
362  return AVERROR_INVALIDDATA;
363  }
364 
365  switch ((isampf << 8) + ibps) {
366  case (8 << 8) + 8:
367  tctx->mtab = &mode_08_08;
368  break;
369  case (11 << 8) + 8:
370  tctx->mtab = &mode_11_08;
371  break;
372  case (11 << 8) + 10:
373  tctx->mtab = &mode_11_10;
374  break;
375  case (16 << 8) + 16:
376  tctx->mtab = &mode_16_16;
377  break;
378  case (22 << 8) + 20:
379  tctx->mtab = &mode_22_20;
380  break;
381  case (22 << 8) + 24:
382  tctx->mtab = &mode_22_24;
383  break;
384  case (22 << 8) + 32:
385  tctx->mtab = &mode_22_32;
386  break;
387  case (44 << 8) + 40:
388  tctx->mtab = &mode_44_40;
389  break;
390  case (44 << 8) + 48:
391  tctx->mtab = &mode_44_48;
392  break;
393  default:
394  av_log(avctx, AV_LOG_ERROR,
395  "This version does not support %d kHz - %d kbit/s/ch mode.\n",
396  isampf, isampf);
397  return -1;
398  }
399 
400  tctx->codec = TWINVQ_CODEC_VQF;
402  tctx->dec_bark_env = dec_bark_env;
403  tctx->decode_ppc = decode_ppc;
404  tctx->frame_size = avctx->bit_rate * tctx->mtab->size
405  / avctx->sample_rate + 8;
406  tctx->is_6kbps = 0;
407  if (avctx->block_align && avctx->block_align * 8LL / tctx->frame_size > 1) {
408  av_log(avctx, AV_LOG_ERROR,
409  "VQF TwinVQ should have only one frame per packet\n");
410  return AVERROR_INVALIDDATA;
411  }
412 
413  return ff_twinvq_decode_init(avctx);
414 }
415 
417  .name = "twinvq",
418  .long_name = NULL_IF_CONFIG_SMALL("VQF TwinVQ"),
419  .type = AVMEDIA_TYPE_AUDIO,
420  .id = AV_CODEC_ID_TWINVQ,
421  .priv_data_size = sizeof(TwinVQContext),
423  .close = ff_twinvq_decode_close,
425  .capabilities = AV_CODEC_CAP_DR1,
426  .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
428 };
bark_tab_l16_1024
static const uint16_t bark_tab_l16_1024[]
Definition: metasound_data.c:14935
twinvq_read_bitstream
static int twinvq_read_bitstream(AVCodecContext *avctx, TwinVQContext *tctx, const uint8_t *buf, int buf_size)
Definition: twinvqdec.c:251
AVCodec
AVCodec.
Definition: codec.h:190
twinvq_data::cb0808s1
int16_t cb0808s1[1152]
Definition: twinvq_data.h:147
AV_SAMPLE_FMT_FLTP
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition: samplefmt.h:69
bark_tab_s44_128
static const uint16_t bark_tab_s44_128[]
Definition: metasound_data.c:15014
init
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
bark_tab_m44_512
static const uint16_t bark_tab_m44_512[]
Definition: metasound_data.c:15009
TwinVQContext::mtab
const TwinVQModeTab * mtab
Definition: twinvq.h:142
twinvq_data::fcb08m
int16_t fcb08m[320]
Definition: twinvq_data.h:140
twinvq_data::fcb22s_2
int16_t fcb22s_2[640]
Definition: twinvq_data.h:206
AVCodecContext::channel_layout
uint64_t channel_layout
Audio channel layout.
Definition: avcodec.h:1237
twinvq_data::cb1616l0
int16_t cb1616l0[1024]
Definition: twinvq_data.h:177
twinvq_data::cb1108s0
int16_t cb1108s0[1856]
Definition: twinvq_data.h:155
TwinVQFrameMode::sub
uint8_t sub
Number subblocks in each frame.
Definition: twinvq.h:67
twinvq_data::cb2220m1
int16_t cb2220m1[1088]
Definition: twinvq_data.h:187
out
FILE * out
Definition: movenc.c:54
bark_tab_m22_256
static const uint16_t bark_tab_m22_256[]
Definition: twinvq_data.h:95
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:1186
TwinVQContext::bits_main_spec
uint8_t bits_main_spec[2][4][2]
bits for the main codebook
Definition: twinvq.h:154
twinvq_data::cb4440s1
int16_t cb4440s1[1152]
Definition: twinvq_data.h:222
sample_fmts
static enum AVSampleFormat sample_fmts[]
Definition: adpcmenc.c:716
twinvq_decode_init
static av_cold int twinvq_decode_init(AVCodecContext *avctx)
Definition: twinvqdec.c:319
AV_CH_LAYOUT_MONO
#define AV_CH_LAYOUT_MONO
Definition: channel_layout.h:85
bark_tab_m11_256
static const uint16_t bark_tab_m11_256[]
Definition: metasound_data.c:14912
twinvq_data::cb0808l0
int16_t cb0808l0[1088]
Definition: twinvq_data.h:144
twinvq_data::cb2232l1
int16_t cb2232l1[768]
Definition: twinvq_data.h:211
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:219
twinvq_data::cb4448s1
int16_t cb4448s1[960]
Definition: twinvq_data.h:235
TWINVQ_GAIN_BITS
#define TWINVQ_GAIN_BITS
Definition: twinvq.h:50
TwinVQContext::bits
TwinVQFrameData bits[TWINVQ_MAX_FRAMES_PER_PACKET]
Definition: twinvq.h:170
twinvq_data::fcb11l
int16_t fcb11l[640]
Definition: twinvq_data.h:158
internal.h
b
#define b
Definition: input.c:41
TwinVQModeTab::ppc_shape_len
uint8_t ppc_shape_len
size of PPC shape CB
Definition: twinvq.h:130
twinvq_data::cb4440m0
int16_t cb4440m0[1088]
Definition: twinvq_data.h:219
TwinVQModeTab::lsp_bit1
uint8_t lsp_bit1
Definition: twinvq.h:120
twinvq_data::cb2232s0
int16_t cb2232s0[704]
Definition: twinvq_data.h:214
ff_twinvq_decode_init
av_cold int ff_twinvq_decode_init(AVCodecContext *avctx)
Definition: twinvq.c:770
twinvq_data::lsp22_2
float lsp22_2[1312]
Definition: twinvq_data.h:208
bark_tab_s22_128
static const uint16_t bark_tab_s22_128[]
Definition: metasound_data.c:14974
TwinVQModeTab::pgain_bit
uint8_t pgain_bit
bits for PPC gain
Definition: twinvq.h:131
twinvq_data::cb1616s1
int16_t cb1616s1[1024]
Definition: twinvq_data.h:182
TWINVQ_CODEC_VQF
@ TWINVQ_CODEC_VQF
Definition: twinvq.h:35
twinvq_data::cb1110s1
int16_t cb1110s1[1344]
Definition: twinvq_data.h:169
bark_tab_l22_1024
static const uint16_t bark_tab_l22_1024[]
Definition: metasound_data.c:14967
twinvq_data::lsp08
float lsp08[504]
Definition: twinvq_data.h:138
twinvq_data::cb2224s1
int16_t cb2224s1[960]
Definition: twinvq_data.h:202
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:467
twinvq_data::fcb22s_1
int16_t fcb22s_1[640]
Definition: twinvq_data.h:193
twinvq_data::fcb44s
int16_t fcb44s[640]
Definition: twinvq_data.h:226
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
add_peak
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: twinvqdec.c:154
twinvq_data::cb0808m0
int16_t cb0808m0[1024]
Definition: twinvq_data.h:148
TWINVQ_WINDOW_TYPE_BITS
#define TWINVQ_WINDOW_TYPE_BITS
Definition: twinvq.h:53
twinvq_data::cb1108l1
int16_t cb1108l1[1728]
Definition: twinvq_data.h:152
TwinVQFrameMode::bark_n_coef
uint8_t bark_n_coef
number of BSE CB coefficients to read
Definition: twinvq.h:74
mode_16_16
static const TwinVQModeTab mode_16_16
Definition: twinvqdec.c:59
mode_11_08
static const TwinVQModeTab mode_11_08
Definition: twinvqdec.c:41
TwinVQFrameType
TwinVQFrameType
Definition: twinvq.h:39
GetBitContext
Definition: get_bits.h:61
twinvq_data::cb2224s0
int16_t cb2224s0[960]
Definition: twinvq_data.h:201
x
FFmpeg Automated Testing Environment ************************************Introduction Using FATE from your FFmpeg source directory Submitting the results to the FFmpeg result aggregation server Uploading new samples to the fate suite FATE makefile targets and variables Makefile targets Makefile variables Examples Introduction **************FATE is an extended regression suite on the client side and a means for results aggregation and presentation on the server side The first part of this document explains how you can use FATE from your FFmpeg source directory to test your ffmpeg binary The second part describes how you can run FATE to submit the results to FFmpeg’s FATE server In any way you can have a look at the publicly viewable FATE results by visiting this as it can be seen if some test on some platform broke with their recent contribution This usually happens on the platforms the developers could not test on The second part of this document describes how you can run FATE to submit your results to FFmpeg’s FATE server If you want to submit your results be sure to check that your combination of OS and compiler is not already listed on the above mentioned website In the third part you can find a comprehensive listing of FATE makefile targets and variables Using FATE from your FFmpeg source directory **********************************************If you want to run FATE on your machine you need to have the samples in place You can get the samples via the build target fate rsync Use this command from the top level source this will cause FATE to fail NOTE To use a custom wrapper to run the pass ‘ target exec’ to ‘configure’ or set the TARGET_EXEC Make variable Submitting the results to the FFmpeg result aggregation server ****************************************************************To submit your results to the server you should run fate through the shell script ‘tests fate sh’ from the FFmpeg sources This script needs to be invoked with a configuration file as its first argument tests fate sh path to fate_config A configuration file template with comments describing the individual configuration variables can be found at ‘doc fate_config sh template’ Create a configuration that suits your based on the configuration template The ‘slot’ configuration variable can be any string that is not yet but it is suggested that you name it adhering to the following pattern ‘ARCH OS COMPILER COMPILER VERSION’ The configuration file itself will be sourced in a shell therefore all shell features may be used This enables you to setup the environment as you need it for your build For your first test runs the ‘fate_recv’ variable should be empty or commented out This will run everything as normal except that it will omit the submission of the results to the server The following files should be present in $workdir as specified in the configuration it may help to try out the ‘ssh’ command with one or more ‘ v’ options You should get detailed output concerning your SSH configuration and the authentication process The only thing left is to automate the execution of the fate sh script and the synchronisation of the samples directory Uploading new samples to the fate suite *****************************************If you need a sample uploaded send a mail to samples request This is for developers who have an account on the fate suite server If you upload new please make sure they are as small as space on each network bandwidth and so on benefit from smaller test cases Also keep in mind older checkouts use existing sample that means in practice generally do not remove or overwrite files as it likely would break older checkouts or releases Also all needed samples for a commit should be ideally before the push If you need an account for frequently uploading samples or you wish to help others by doing that send a mail to ffmpeg devel rsync vauL Duo x
Definition: fate.txt:150
tab
static const struct twinvq_data tab
Definition: twinvq_data.h:11135
mode_08_08
static const TwinVQModeTab mode_08_08
Definition: twinvqdec.c:32
mode_22_24
static const TwinVQModeTab mode_22_24
Definition: twinvqdec.c:77
TWINVQ_PGAIN_MU
#define TWINVQ_PGAIN_MU
Definition: twinvq.h:54
val
static double val(void *priv, double ch)
Definition: aeval.c:76
twinvq_data::cb0808s0
int16_t cb0808s0[1152]
Definition: twinvq_data.h:146
twinvq_data::cb2232l0
int16_t cb2232l0[768]
Definition: twinvq_data.h:210
bark_tab_l08_512
static const uint16_t bark_tab_l08_512[]
Definition: twinvq_data.h:41
very_broken_op
static int very_broken_op(int a, int b)
Evaluate a * b / 400 rounded to the nearest integer.
Definition: twinvqdec.c:133
TwinVQModeTab::size
uint16_t size
frame size in samples
Definition: twinvq.h:114
twinvq_mulawinv
static float twinvq_mulawinv(float y, float clip, float mu)
Definition: twinvq.h:192
AV_CH_LAYOUT_STEREO
#define AV_CH_LAYOUT_STEREO
Definition: channel_layout.h:86
TwinVQContext::dec_bark_env
void(* dec_bark_env)(struct TwinVQContext *tctx, const uint8_t *in, int use_hist, int ch, float *out, float gain, enum TwinVQFrameType ftype)
Definition: twinvq.h:176
ff_twinvq_decode_frame
int ff_twinvq_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
Definition: twinvq.c:476
twinvq_data::fcb08l
int16_t fcb08l[640]
Definition: twinvq_data.h:139
TwinVQContext::n_div
int n_div[4]
Definition: twinvq.h:156
TwinVQContext::decode_ppc
void(* decode_ppc)(struct TwinVQContext *tctx, int period_coef, int g_coef, const float *shape, float *speech)
Definition: twinvq.h:179
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
twinvq_data::fcb08s
int16_t fcb08s[320]
Definition: twinvq_data.h:141
twinvq_data::cb1108m1
int16_t cb1108m1[1536]
Definition: twinvq_data.h:154
av_cold
#define av_cold
Definition: attributes.h:90
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:677
tabs
static const struct @97 tabs[]
twinvq_data::fcb11s
int16_t fcb11s[320]
Definition: twinvq_data.h:160
twinvq_data::fcb16m
int16_t fcb16m[320]
Definition: twinvq_data.h:172
decode
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:71
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:628
width
#define width
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
TwinVQContext::codec
enum TwinVQCodec codec
Definition: twinvq.h:172
twinvq_data::cb1616m1
int16_t cb1616m1[960]
Definition: twinvq_data.h:180
twinvq_data::cb4448l1
int16_t cb4448l1[896]
Definition: twinvq_data.h:231
bits
uint8_t bits
Definition: vp3data.h:202
TwinVQModeTab
Parameters and tables that are different for every combination of bitrate/sample rate.
Definition: twinvq.h:111
channels
channels
Definition: aptx.h:33
get_bits.h
twinvq_data::cb4448m1
int16_t cb4448m1[896]
Definition: twinvq_data.h:233
TwinVQModeTab::lsp_bit2
uint8_t lsp_bit2
Definition: twinvq.h:121
twinvq_data::lsp16
float lsp16[1400]
Definition: twinvq_data.h:175
bark_tab_m22_512
static const uint16_t bark_tab_m22_512[]
Definition: metasound_data.c:14979
twinvq_data::cb4440m1
int16_t cb4440m1[1088]
Definition: twinvq_data.h:220
twinvq_data::cb1108l0
int16_t cb1108l0[1728]
Definition: twinvq_data.h:151
TwinVQFrameMode::bark_tab
const uint16_t * bark_tab
Definition: twinvq.h:68
twinvq_memset_float
static void twinvq_memset_float(float *buf, float val, int size)
Definition: twinvq.h:186
twinvq_data::cb2220l0
int16_t cb2220l0[1152]
Definition: twinvq_data.h:184
TwinVQFrameMode::bark_cb
const int16_t * bark_cb
codebook for the bark scale envelope (BSE)
Definition: twinvq.h:73
ff_twinvq_decode_close
av_cold int ff_twinvq_decode_close(AVCodecContext *avctx)
Definition: twinvq.c:751
ch
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(const uint8_t *) pi - 0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(const int16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(const int16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(const int32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(const int32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(const int64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0f/(UINT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0/(UINT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float *) pi *(UINT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double *) pi *(UINT64_C(1)<< 63))) #define FMT_PAIR_FUNC(out, in) static conv_func_type *const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={ FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64), };static void cpy1(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, len);} static void cpy2(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 2 *len);} static void cpy4(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 4 *len);} static void cpy8(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 8 *len);} AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, const int *ch_map, int flags) { AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) return NULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) return NULL;if(channels==1){ in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);} ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map) { switch(av_get_bytes_per_sample(in_fmt)){ case 1:ctx->simd_f=cpy1;break;case 2:ctx->simd_f=cpy2;break;case 4:ctx->simd_f=cpy4;break;case 8:ctx->simd_f=cpy8;break;} } if(HAVE_X86ASM &&HAVE_MMX) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels);if(ARCH_ARM) swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels);if(ARCH_AARCH64) swri_audio_convert_init_aarch64(ctx, out_fmt, in_fmt, channels);return ctx;} void swri_audio_convert_free(AudioConvert **ctx) { av_freep(ctx);} int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len) { int ch;int off=0;const int os=(out->planar ? 1 :out->ch_count) *out->bps;unsigned misaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask) { int planes=in->planar ? in->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;} if(ctx->out_simd_align_mask) { int planes=out->planar ? out->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;} if(ctx->simd_f &&!ctx->ch_map &&!misaligned){ off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){ if(out->planar==in->planar){ int planes=out->planar ? out->ch_count :1;for(ch=0;ch< planes;ch++){ ctx->simd_f(out-> ch ch
Definition: audioconvert.c:56
twinvq_data::cb1110m1
int16_t cb1110m1[1152]
Definition: twinvq_data.h:167
twinvq_data::lsp44
float lsp44[1640]
Definition: twinvq_data.h:228
twinvq_data::cb4440l1
int16_t cb4440l1[1088]
Definition: twinvq_data.h:218
twinvq_data.h
twinvq_data::cb2224l0
int16_t cb2224l0[960]
Definition: twinvq_data.h:197
period
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 keep it simple and lowercase description are in without period
Definition: writing_filters.txt:89
AVCodecContext::bit_rate
int64_t bit_rate
the average bitrate
Definition: avcodec.h:576
ROUNDED_DIV
#define ROUNDED_DIV(a, b)
Definition: common.h:56
twinvq_data::fcb11m
int16_t fcb11m[320]
Definition: twinvq_data.h:159
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
twinvq_data::shape22_1
int16_t shape22_1[1152]
Definition: twinvq_data.h:194
twinvq_data::shape22_2
int16_t shape22_2[1152]
Definition: twinvq_data.h:207
mode_44_48
static const TwinVQModeTab mode_44_48
Definition: twinvqdec.c:104
twinvq_data::fcb44l
int16_t fcb44l[640]
Definition: twinvq_data.h:224
twinvq_data::cb4440s0
int16_t cb4440s0[1152]
Definition: twinvq_data.h:221
TwinVQContext::is_6kbps
int is_6kbps
Definition: twinvq.h:144
twinvq_data::fcb44m
int16_t fcb44m[640]
Definition: twinvq_data.h:225
AV_RB32
#define AV_RB32
Definition: intreadwrite.h:130
twinvq_data::cb1616s0
int16_t cb1616s0[1024]
Definition: twinvq_data.h:181
twinvq_data::cb1110l1
int16_t cb1110l1[1280]
Definition: twinvq_data.h:165
twinvq_data::fcb22m_1
int16_t fcb22m_1[640]
Definition: twinvq_data.h:192
TwinVQContext::avctx
AVCodecContext * avctx
Definition: twinvq.h:138
TwinVQModeTab::lsp_bit0
uint8_t lsp_bit0
Definition: twinvq.h:119
bark_tab_s16_128
static const uint16_t bark_tab_s16_128[]
Definition: metasound_data.c:14945
mode_11_10
static const TwinVQModeTab mode_11_10
Definition: twinvqdec.c:50
TWINVQ_FT_LONG
@ TWINVQ_FT_LONG
Long frame (single sub-block + PPC)
Definition: twinvq.h:42
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:50
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:186
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:59
TwinVQFrameMode::bark_n_bit
uint8_t bark_n_bit
number of bits of the BSE coefs
Definition: twinvq.h:75
size
int size
Definition: twinvq_data.h:11134
TwinVQModeTab::ppc_period_bit
uint8_t ppc_period_bit
number of the bits for the PPC period value
Definition: twinvq.h:127
decode_ppc
static void decode_ppc(TwinVQContext *tctx, int period_coef, int g_coef, const float *shape, float *speech)
Definition: twinvqdec.c:178
TwinVQContext::bits_main_spec_change
int bits_main_spec_change[4]
Definition: twinvq.h:155
twinvq_data::shape11
int16_t shape11[1280]
Definition: twinvq_data.h:161
TWINVQ_CHANNELS_MAX
#define TWINVQ_CHANNELS_MAX
Definition: twinvq.h:57
bark_tab_l44_2048
static const uint16_t bark_tab_l44_2048[]
Definition: metasound_data.c:15003
twinvq_data::cb1616m0
int16_t cb1616m0[960]
Definition: twinvq_data.h:179
twinvq_data::cb2224m1
int16_t cb2224m1[896]
Definition: twinvq_data.h:200
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
bark_tab_m16_512
static const uint16_t bark_tab_m16_512[]
Definition: metasound_data.c:14940
twinvq_data::cb1616l1
int16_t cb1616l1[1024]
Definition: twinvq_data.h:178
TwinVQModeTab::peak_per2wid
uint16_t peak_per2wid
constant for peak period to peak width conversion
Definition: twinvq.h:134
twinvq_data::cb4440l0
int16_t cb4440l0[1088]
Definition: twinvq_data.h:217
av_log2
#define av_log2
Definition: intmath.h:83
twinvq_data::cb1108s1
int16_t cb1108s1[1856]
Definition: twinvq_data.h:156
TwinVQContext::read_bitstream
int(* read_bitstream)(AVCodecContext *avctx, struct TwinVQContext *tctx, const uint8_t *buf, int buf_size)
Definition: twinvq.h:174
AVCodecContext::channels
int channels
number of audio channels
Definition: avcodec.h:1187
TWINVQ_SUB_GAIN_BITS
#define TWINVQ_SUB_GAIN_BITS
Definition: twinvq.h:52
in
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=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);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_AARCH64) ff_audio_convert_init_aarch64(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_log(ac->avr, AV_LOG_TRACE, "%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-> in
Definition: audio_convert.c:326
twinvq_data::shape16
int16_t shape16[1920]
Definition: twinvq_data.h:174
bark_tab_m08_256
static const uint16_t bark_tab_m08_256[]
Definition: twinvq_data.h:80
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
twinvq_data::cb2224m0
int16_t cb2224m0[896]
Definition: twinvq_data.h:199
twinvq_data::cb4448s0
int16_t cb4448s0[960]
Definition: twinvq_data.h:234
TwinVQContext::frame_size
int frame_size
Definition: twinvq.h:169
AVCodecContext::extradata
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:627
twinvq_data::fcb16l
int16_t fcb16l[640]
Definition: twinvq_data.h:171
TwinVQContext::bark_hist
float bark_hist[3][2][40]
BSE coefficients of last frame.
Definition: twinvq.h:148
twinvq_data::cb1110l0
int16_t cb1110l0[1280]
Definition: twinvq_data.h:164
TwinVQFrameData
Definition: twinvq.h:86
AVSampleFormat
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:58
twinvq_data::cb4448l0
int16_t cb4448l0[896]
Definition: twinvq_data.h:230
uint8_t
uint8_t
Definition: audio_convert.c:194
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:197
mode_22_32
static const TwinVQModeTab mode_22_32
Definition: twinvqdec.c:86
len
int len
Definition: vorbis_enc_data.h:452
twinvq_data::cb2220m0
int16_t cb2220m0[1088]
Definition: twinvq_data.h:186
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:1223
twinvq_data::cb2232s1
int16_t cb2232s1[704]
Definition: twinvq_data.h:215
twinvq.h
twinvq_data::fcb22l_2
int16_t fcb22l_2[512]
Definition: twinvq_data.h:204
AVCodecContext
main external API structure.
Definition: avcodec.h:526
bark_tab_l22_512
static const uint16_t bark_tab_l22_512[]
Definition: twinvq_data.h:66
twinvq_data::shape08
int16_t shape08[1280]
Definition: twinvq_data.h:142
channel_layout.h
twinvq_data::cb1108m0
int16_t cb1108m0[1536]
Definition: twinvq_data.h:153
twinvq_data::cb2220l1
int16_t cb2220l1[1152]
Definition: twinvq_data.h:185
mode_22_20
static const TwinVQModeTab mode_22_20
Definition: twinvqdec.c:68
mode_44_40
static const TwinVQModeTab mode_44_40
Definition: twinvqdec.c:95
twinvq_data::cb0808m1
int16_t cb0808m1[1024]
Definition: twinvq_data.h:149
twinvq_data::cb2224l1
int16_t cb2224l1[960]
Definition: twinvq_data.h:198
twinvq_data::cb4448m0
int16_t cb4448m0[896]
Definition: twinvq_data.h:232
dec_bark_env
static void dec_bark_env(TwinVQContext *tctx, const uint8_t *in, int use_hist, int ch, float *out, float gain, enum TwinVQFrameType ftype)
Definition: twinvqdec.c:210
twinvq_data::lsp22_1
float lsp22_1[1312]
Definition: twinvq_data.h:195
twinvq_data::fcb22m_2
int16_t fcb22m_2[640]
Definition: twinvq_data.h:205
twinvq_data::fcb16s
int16_t fcb16s[320]
Definition: twinvq_data.h:173
twinvq_data::cb2232m0
int16_t cb2232m0[704]
Definition: twinvq_data.h:212
twinvq_data::cb0808l1
int16_t cb0808l1[1088]
Definition: twinvq_data.h:145
twinvq_data::fcb22l_1
int16_t fcb22l_1[512]
Definition: twinvq_data.h:191
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:553
bark_tab_l11_512
static const uint16_t bark_tab_l11_512[]
Definition: metasound_data.c:14902
ff_twinvq_decoder
AVCodec ff_twinvq_decoder
Definition: twinvqdec.c:416
TwinVQFrameData::window_type
int window_type
Definition: twinvq.h:87
twinvq_data::cb2232m1
int16_t cb2232m1[704]
Definition: twinvq_data.h:213
twinvq_data::cb2220s0
int16_t cb2220s0[1152]
Definition: twinvq_data.h:188
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
TwinVQContext
Definition: twinvq.h:137
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
twinvq_data::cb1110m0
int16_t cb1110m0[1152]
Definition: twinvq_data.h:166
bark_tab_s11_64
static const uint16_t bark_tab_s11_64[]
Definition: metasound_data.c:14908
read_cb_data
static void read_cb_data(TwinVQContext *tctx, GetBitContext *gb, uint8_t *dst, enum TwinVQFrameType ftype)
Definition: twinvqdec.c:238
twinvq_data::lsp11
float lsp11[1312]
Definition: twinvq_data.h:162
twinvq_data::shape44
int16_t shape44[1152]
Definition: twinvq_data.h:227
AV_CODEC_ID_TWINVQ
@ AV_CODEC_ID_TWINVQ
Definition: codec_id.h:453
TwinVQModeTab::lsp_split
uint8_t lsp_split
number of CB entries for the LSP decoding
Definition: twinvq.h:123
ff_twinvq_wtype_to_ftype_table
enum TwinVQFrameType ff_twinvq_wtype_to_ftype_table[]
Definition: twinvq.c:470
bark_tab_s08_64
static const uint16_t bark_tab_s08_64[]
Definition: twinvq_data.h:110
twinvq_data::cb2220s1
int16_t cb2220s1[1152]
Definition: twinvq_data.h:189
TwinVQModeTab::fmode
struct TwinVQFrameMode fmode[3]
frame type-dependent parameters
Definition: twinvq.h:112
twinvq_data::cb1110s0
int16_t cb1110s0[1344]
Definition: twinvq_data.h:168
TwinVQFrameMode::bark_env_size
uint8_t bark_env_size
number of distinct bark scale envelope values
Definition: twinvq.h:71