FFmpeg
metasound.c
Go to the documentation of this file.
1 /*
2  * Voxware MetaSound decoder
3  * Copyright (c) 2013 Konstantin Shishkov
4  * based on TwinVQ decoder
5  * Copyright (c) 2009 Vitor Sessak
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #include <inttypes.h>
25 #include <math.h>
26 #include <stdint.h>
27 
29 #include "libavutil/float_dsp.h"
30 
31 #define BITSTREAM_READER_LE
32 #include "avcodec.h"
33 #include "codec_internal.h"
34 #include "fft.h"
35 #include "get_bits.h"
36 #include "lsp.h"
37 #include "sinewin.h"
38 
39 #include "twinvq.h"
40 #include "metasound_data.h"
41 
42 static void add_peak(float period, int width, const float *shape,
43  float ppc_gain, float *speech, int len)
44 {
45  int i, j, center;
46  const float *shape_end = shape + len;
47 
48  // First peak centered around zero
49  for (i = 0; i < width / 2; i++)
50  speech[i] += ppc_gain * *shape++;
51 
52  for (i = 1; i < ROUNDED_DIV(len, width); i++) {
53  center = (int)(i * period + 0.5);
54  for (j = -width / 2; j < (width + 1) / 2; j++)
55  speech[j + center] += ppc_gain * *shape++;
56  }
57 
58  // For the last block, be careful not to go beyond the end of the buffer
59  center = (int)(i * period + 0.5);
60  for (j = -width / 2; j < (width + 1) / 2 && shape < shape_end; j++)
61  speech[j + center] += ppc_gain * *shape++;
62 }
63 
64 static void decode_ppc(TwinVQContext *tctx, int period_coef, int g_coef,
65  const float *shape, float *speech)
66 {
67  const TwinVQModeTab *mtab = tctx->mtab;
68  int channels = tctx->avctx->ch_layout.nb_channels;
69  int isampf = tctx->avctx->sample_rate / 1000;
70  int ibps = tctx->avctx->bit_rate / (1000 * channels);
71  int width;
72 
73  float ratio = (float)mtab->size / isampf;
74  float min_period, max_period, period_range, period;
75  float some_mult;
76 
77  float pgain_base, pgain_step, ppc_gain;
78 
79  if (channels == 1) {
80  min_period = log2(ratio * 0.2);
81  max_period = min_period + log2(6);
82  } else {
83  min_period = (int)(ratio * 0.2 * 400 + 0.5) / 400.0;
84  max_period = (int)(ratio * 0.2 * 400 * 6 + 0.5) / 400.0;
85  }
86  period_range = max_period - min_period;
87  period = min_period + period_coef * period_range /
88  ((1 << mtab->ppc_period_bit) - 1);
89  if (channels == 1)
90  period = powf(2.0, period);
91  else
92  period = (int)(period * 400 + 0.5) / 400.0;
93 
94  switch (isampf) {
95  case 8: some_mult = 2.0; break;
96  case 11: some_mult = 3.0; break;
97  case 16: some_mult = 3.0; break;
98  case 22: some_mult = ibps == 32 ? 2.0 : 4.0; break;
99  case 44: some_mult = 8.0; break;
100  default: some_mult = 4.0;
101  }
102 
103  width = (int)(some_mult / (mtab->size / period) * mtab->ppc_shape_len);
104  if (isampf == 22 && ibps == 32)
105  width = (int)((2.0 / period + 1) * width + 0.5);
106 
107  pgain_base = channels == 2 ? 25000.0 : 20000.0;
108  pgain_step = pgain_base / ((1 << mtab->pgain_bit) - 1);
109  ppc_gain = 1.0 / 8192 *
110  twinvq_mulawinv(pgain_step * g_coef + pgain_step / 2,
111  pgain_base, TWINVQ_PGAIN_MU);
112 
113  add_peak(period, width, shape, ppc_gain, speech, mtab->ppc_shape_len);
114 }
115 
116 static void dec_bark_env(TwinVQContext *tctx, const uint8_t *in, int use_hist,
117  int ch, float *out, float gain,
118  enum TwinVQFrameType ftype)
119 {
120  const TwinVQModeTab *mtab = tctx->mtab;
121  int i, j;
122  float *hist = tctx->bark_hist[ftype][ch];
123  float val = ((const float []) { 0.4, 0.35, 0.28 })[ftype];
124  int bark_n_coef = mtab->fmode[ftype].bark_n_coef;
125  int fw_cb_len = mtab->fmode[ftype].bark_env_size / bark_n_coef;
126  int idx = 0;
127  int channels = tctx->avctx->ch_layout.nb_channels;
128 
129  if (channels == 1)
130  val = 0.5;
131  for (i = 0; i < fw_cb_len; i++)
132  for (j = 0; j < bark_n_coef; j++, idx++) {
133  float tmp2 = mtab->fmode[ftype].bark_cb[fw_cb_len * in[j] + i] *
134  (1.0 / 2048);
135  float st;
136 
137  if (channels == 1)
138  st = use_hist ?
139  tmp2 + val * hist[idx] + 1.0 : tmp2 + 1.0;
140  else
141  st = use_hist ? (1.0 - val) * tmp2 + val * hist[idx] + 1.0
142  : tmp2 + 1.0;
143 
144  hist[idx] = tmp2;
145  if (st < 0.1)
146  st = 0.1;
147 
148  twinvq_memset_float(out, st * gain,
149  mtab->fmode[ftype].bark_tab[idx]);
150  out += mtab->fmode[ftype].bark_tab[idx];
151  }
152 }
153 
154 static void read_cb_data(TwinVQContext *tctx, GetBitContext *gb,
155  uint8_t *dst, enum TwinVQFrameType ftype)
156 {
157  int i;
158 
159  for (i = 0; i < tctx->n_div[ftype]; i++) {
160  int bs_second_part = (i >= tctx->bits_main_spec_change[ftype]);
161 
162  *dst++ = get_bits(gb, tctx->bits_main_spec[0][ftype][bs_second_part]);
163  *dst++ = get_bits(gb, tctx->bits_main_spec[1][ftype][bs_second_part]);
164  }
165 }
166 
168  const uint8_t *buf, int buf_size)
169 {
171  const TwinVQModeTab *mtab = tctx->mtab;
172  int channels = tctx->avctx->ch_layout.nb_channels;
173  int sub;
174  GetBitContext gb;
175  int i, j, k, ret;
176 
177  if ((ret = init_get_bits8(&gb, buf, buf_size)) < 0)
178  return ret;
179 
180  for (tctx->cur_frame = 0; tctx->cur_frame < tctx->frames_per_packet;
181  tctx->cur_frame++) {
182  bits = tctx->bits + tctx->cur_frame;
183 
184  bits->window_type = get_bits(&gb, TWINVQ_WINDOW_TYPE_BITS);
185 
186  if (bits->window_type > 8) {
187  av_log(avctx, AV_LOG_ERROR, "Invalid window type, broken sample?\n");
188  return AVERROR_INVALIDDATA;
189  }
190 
192 
193  sub = mtab->fmode[bits->ftype].sub;
194 
195  if (bits->ftype != TWINVQ_FT_SHORT && !tctx->is_6kbps)
196  get_bits(&gb, 2);
197 
198  read_cb_data(tctx, &gb, bits->main_coeffs, bits->ftype);
199 
200  for (i = 0; i < channels; i++)
201  for (j = 0; j < sub; j++)
202  for (k = 0; k < mtab->fmode[bits->ftype].bark_n_coef; k++)
203  bits->bark1[i][j][k] =
204  get_bits(&gb, mtab->fmode[bits->ftype].bark_n_bit);
205 
206  for (i = 0; i < channels; i++)
207  for (j = 0; j < sub; j++)
208  bits->bark_use_hist[i][j] = get_bits1(&gb);
209 
210  if (bits->ftype == TWINVQ_FT_LONG) {
211  for (i = 0; i < channels; i++)
212  bits->gain_bits[i] = get_bits(&gb, TWINVQ_GAIN_BITS);
213  } else {
214  for (i = 0; i < channels; i++) {
215  bits->gain_bits[i] = get_bits(&gb, TWINVQ_GAIN_BITS);
216  for (j = 0; j < sub; j++)
217  bits->sub_gain_bits[i * sub + j] =
219  }
220  }
221 
222  for (i = 0; i < channels; i++) {
223  bits->lpc_hist_idx[i] = get_bits(&gb, mtab->lsp_bit0);
224  bits->lpc_idx1[i] = get_bits(&gb, mtab->lsp_bit1);
225 
226  for (j = 0; j < mtab->lsp_split; j++)
227  bits->lpc_idx2[i][j] = get_bits(&gb, mtab->lsp_bit2);
228  }
229 
230  if (bits->ftype == TWINVQ_FT_LONG) {
231  read_cb_data(tctx, &gb, bits->ppc_coeffs, 3);
232  for (i = 0; i < channels; i++) {
233  bits->p_coef[i] = get_bits(&gb, mtab->ppc_period_bit);
234  bits->g_coef[i] = get_bits(&gb, mtab->pgain_bit);
235  }
236  }
237 
238  // subframes are aligned to nibbles
239  if (get_bits_count(&gb) & 3)
240  skip_bits(&gb, 4 - (get_bits_count(&gb) & 3));
241  }
242 
243  return (get_bits_count(&gb) + 7) / 8;
244 }
245 
246 typedef struct MetasoundProps {
247  uint32_t tag;
248  int bit_rate;
249  int channels;
252 
253 static const MetasoundProps codec_props[] = {
254  { MKTAG('V','X','0','3'), 6, 1, 8000 },
255  { MKTAG('V','X','0','4'), 12, 2, 8000 },
256 
257  { MKTAG('V','O','X','i'), 8, 1, 8000 },
258  { MKTAG('V','O','X','j'), 10, 1, 11025 },
259  { MKTAG('V','O','X','k'), 16, 1, 16000 },
260  { MKTAG('V','O','X','L'), 24, 1, 22050 },
261  { MKTAG('V','O','X','q'), 32, 1, 44100 },
262  { MKTAG('V','O','X','r'), 40, 1, 44100 },
263  { MKTAG('V','O','X','s'), 48, 1, 44100 },
264  { MKTAG('V','O','X','t'), 16, 2, 8000 },
265  { MKTAG('V','O','X','u'), 20, 2, 11025 },
266  { MKTAG('V','O','X','v'), 32, 2, 16000 },
267  { MKTAG('V','O','X','w'), 48, 2, 22050 },
268  { MKTAG('V','O','X','x'), 64, 2, 44100 },
269  { MKTAG('V','O','X','y'), 80, 2, 44100 },
270  { MKTAG('V','O','X','z'), 96, 2, 44100 },
271 
272  { 0, 0, 0, 0 }
273 };
274 
276 {
277  int isampf, ibps;
278  TwinVQContext *tctx = avctx->priv_data;
279  uint32_t tag;
280  const MetasoundProps *props = codec_props;
281  int channels;
282 
283  if (!avctx->extradata || avctx->extradata_size < 16) {
284  av_log(avctx, AV_LOG_ERROR, "Missing or incomplete extradata\n");
285  return AVERROR_INVALIDDATA;
286  }
287 
288  tag = AV_RL32(avctx->extradata + 12);
289 
290  for (;;) {
291  if (!props->tag) {
292  av_log(avctx, AV_LOG_ERROR, "Could not find tag %08"PRIX32"\n", tag);
293  return AVERROR_INVALIDDATA;
294  }
295  if (props->tag == tag) {
296  avctx->sample_rate = props->sample_rate;
297  channels = props->channels;
298  avctx->bit_rate = props->bit_rate * 1000;
299  isampf = avctx->sample_rate / 1000;
300  break;
301  }
302  props++;
303  }
304 
306  av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %i\n",
307  channels);
308  return AVERROR_INVALIDDATA;
309  }
312 
313  ibps = avctx->bit_rate / (1000 * channels);
314 
315  switch ((channels << 16) + (isampf << 8) + ibps) {
316  case (1 << 16) + ( 8 << 8) + 6:
317  tctx->mtab = &ff_metasound_mode0806;
318  break;
319  case (2 << 16) + ( 8 << 8) + 6:
320  tctx->mtab = &ff_metasound_mode0806s;
321  break;
322  case (1 << 16) + ( 8 << 8) + 8:
323  tctx->mtab = &ff_metasound_mode0808;
324  break;
325  case (2 << 16) + ( 8 << 8) + 8:
326  tctx->mtab = &ff_metasound_mode0808s;
327  break;
328  case (1 << 16) + (11 << 8) + 10:
329  tctx->mtab = &ff_metasound_mode1110;
330  break;
331  case (2 << 16) + (11 << 8) + 10:
332  tctx->mtab = &ff_metasound_mode1110s;
333  break;
334  case (1 << 16) + (16 << 8) + 16:
335  tctx->mtab = &ff_metasound_mode1616;
336  break;
337  case (2 << 16) + (16 << 8) + 16:
338  tctx->mtab = &ff_metasound_mode1616s;
339  break;
340  case (1 << 16) + (22 << 8) + 24:
341  tctx->mtab = &ff_metasound_mode2224;
342  break;
343  case (2 << 16) + (22 << 8) + 24:
344  tctx->mtab = &ff_metasound_mode2224s;
345  break;
346  case (1 << 16) + (44 << 8) + 32:
347  case (2 << 16) + (44 << 8) + 32:
348  tctx->mtab = &ff_metasound_mode4432;
349  break;
350  case (1 << 16) + (44 << 8) + 40:
351  case (2 << 16) + (44 << 8) + 40:
352  tctx->mtab = &ff_metasound_mode4440;
353  break;
354  case (1 << 16) + (44 << 8) + 48:
355  case (2 << 16) + (44 << 8) + 48:
356  tctx->mtab = &ff_metasound_mode4448;
357  break;
358  default:
359  av_log(avctx, AV_LOG_ERROR,
360  "This version does not support %d kHz - %d kbit/s/ch mode.\n",
361  isampf, ibps);
362  return AVERROR(ENOSYS);
363  }
364 
367  tctx->dec_bark_env = dec_bark_env;
368  tctx->decode_ppc = decode_ppc;
369  tctx->frame_size = avctx->bit_rate * tctx->mtab->size
370  / avctx->sample_rate;
371  tctx->is_6kbps = ibps == 6;
372 
373  return ff_twinvq_decode_init(avctx);
374 }
375 
377  .p.name = "metasound",
378  .p.long_name = NULL_IF_CONFIG_SMALL("Voxware MetaSound"),
379  .p.type = AVMEDIA_TYPE_AUDIO,
380  .p.id = AV_CODEC_ID_METASOUND,
381  .priv_data_size = sizeof(TwinVQContext),
383  .close = ff_twinvq_decode_close,
385  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
386  .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
388  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
389 };
ff_metasound_mode0806s
const TwinVQModeTab ff_metasound_mode0806s
AV_SAMPLE_FMT_FLTP
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition: samplefmt.h:66
MetasoundProps::channels
int channels
Definition: metasound.c:249
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:41
TwinVQContext::mtab
const TwinVQModeTab * mtab
Definition: twinvq.h:141
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
TwinVQFrameMode::sub
uint8_t sub
Number subblocks in each frame.
Definition: twinvq.h:66
out
FILE * out
Definition: movenc.c:54
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:1007
TwinVQContext::bits_main_spec
uint8_t bits_main_spec[2][4][2]
bits for the main codebook
Definition: twinvq.h:153
codec_props
static const MetasoundProps codec_props[]
Definition: metasound.c:253
sub
static float sub(float src0, float src1)
Definition: dnn_backend_native_layer_mathbinary.c:31
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:219
MetasoundProps::tag
uint32_t tag
Definition: metasound.c:247
TWINVQ_GAIN_BITS
#define TWINVQ_GAIN_BITS
Definition: twinvq.h:49
TwinVQContext::bits
TwinVQFrameData bits[TWINVQ_MAX_FRAMES_PER_PACKET]
Definition: twinvq.h:169
TwinVQModeTab::ppc_shape_len
uint8_t ppc_shape_len
size of PPC shape CB
Definition: twinvq.h:129
TwinVQModeTab::lsp_bit1
uint8_t lsp_bit1
Definition: twinvq.h:119
FFCodec
Definition: codec_internal.h:118
ff_twinvq_decode_init
av_cold int ff_twinvq_decode_init(AVCodecContext *avctx)
Requires the caller to call ff_twinvq_decode_close() upon failure.
Definition: twinvq.c:761
TwinVQModeTab::pgain_bit
uint8_t pgain_bit
bits for PPC gain
Definition: twinvq.h:130
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:300
ff_metasound_mode4440
const TwinVQModeTab ff_metasound_mode4440
ff_metasound_mode1616
const TwinVQModeTab ff_metasound_mode1616
init
static int init
Definition: av_tx.c:47
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:467
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
TWINVQ_WINDOW_TYPE_BITS
#define TWINVQ_WINDOW_TYPE_BITS
Definition: twinvq.h:52
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:122
AVCodecContext::ch_layout
AVChannelLayout ch_layout
Audio channel layout.
Definition: avcodec.h:2065
TwinVQFrameMode::bark_n_coef
uint8_t bark_n_coef
number of BSE CB coefficients to read
Definition: twinvq.h:73
TwinVQFrameType
TwinVQFrameType
Definition: twinvq.h:38
read_cb_data
static void read_cb_data(TwinVQContext *tctx, GetBitContext *gb, uint8_t *dst, enum TwinVQFrameType ftype)
Definition: metasound.c:154
GetBitContext
Definition: get_bits.h:61
ff_metasound_mode2224s
const TwinVQModeTab ff_metasound_mode2224s
TWINVQ_PGAIN_MU
#define TWINVQ_PGAIN_MU
Definition: twinvq.h:53
val
static double val(void *priv, double ch)
Definition: aeval.c:77
TwinVQModeTab::size
uint16_t size
frame size in samples
Definition: twinvq.h:113
twinvq_mulawinv
static float twinvq_mulawinv(float y, float clip, float mu)
Definition: twinvq.h:191
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:175
TwinVQContext::n_div
int n_div[4]
Definition: twinvq.h:155
TwinVQContext::decode_ppc
void(* decode_ppc)(struct TwinVQContext *tctx, int period_coef, int g_coef, const float *shape, float *speech)
Definition: twinvq.h:178
ftype
#define ftype
Definition: afir_template.c:39
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
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:667
float
float
Definition: af_crystalizer.c:122
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:500
width
#define width
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:260
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
TwinVQContext::codec
enum TwinVQCodec codec
Definition: twinvq.h:171
bits
uint8_t bits
Definition: vp3data.h:141
TwinVQModeTab
Parameters and tables that are different for every combination of bitrate/sample rate.
Definition: twinvq.h:110
add_peak
static void add_peak(float period, int width, const float *shape, float ppc_gain, float *speech, int len)
Definition: metasound.c:42
channels
channels
Definition: aptx.h:32
get_bits.h
TwinVQModeTab::lsp_bit2
uint8_t lsp_bit2
Definition: twinvq.h:120
TwinVQFrameMode::bark_tab
const uint16_t * bark_tab
Definition: twinvq.h:67
ff_metasound_mode0806
const TwinVQModeTab ff_metasound_mode0806
twinvq_memset_float
static void twinvq_memset_float(float *buf, float val, int size)
Definition: twinvq.h:185
if
if(ret)
Definition: filter_design.txt:179
TwinVQFrameMode::bark_cb
const int16_t * bark_cb
codebook for the bark scale envelope (BSE)
Definition: twinvq.h:72
ff_twinvq_decode_close
av_cold int ff_twinvq_decode_close(AVCodecContext *avctx)
Definition: twinvq.c:742
ff_metasound_mode1110
const TwinVQModeTab ff_metasound_mode1110
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:448
ROUNDED_DIV
#define ROUNDED_DIV(a, b)
Definition: common.h:48
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
MetasoundProps::sample_rate
int sample_rate
Definition: metasound.c:250
ff_metasound_mode1110s
const TwinVQModeTab ff_metasound_mode1110s
av_channel_layout_default
void av_channel_layout_default(AVChannelLayout *ch_layout, int nb_channels)
Get the default channel layout for a given number of channels.
Definition: channel_layout.c:960
MetasoundProps
Definition: metasound.c:246
ff_metasound_mode0808
const TwinVQModeTab ff_metasound_mode0808
ff_twinvq_decode_frame
int ff_twinvq_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
Definition: twinvq.c:478
TwinVQContext::is_6kbps
int is_6kbps
Definition: twinvq.h:143
float_dsp.h
av_channel_layout_uninit
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
Definition: channel_layout.c:630
AV_CODEC_CAP_CHANNEL_CONF
#define AV_CODEC_CAP_CHANNEL_CONF
Codec should fill in channel configuration and samplerate instead of container.
Definition: codec.h:109
TwinVQContext::avctx
AVCodecContext * avctx
Definition: twinvq.h:137
ff_metasound_mode1616s
const TwinVQModeTab ff_metasound_mode1616s
TwinVQModeTab::lsp_bit0
uint8_t lsp_bit0
Definition: twinvq.h:118
TWINVQ_FT_LONG
@ TWINVQ_FT_LONG
Long frame (single sub-block + PPC)
Definition: twinvq.h:41
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
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:117
powf
#define powf(x, y)
Definition: libm.h:50
codec_internal.h
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:56
TwinVQFrameMode::bark_n_bit
uint8_t bark_n_bit
number of bits of the BSE coefs
Definition: twinvq.h:74
TwinVQModeTab::ppc_period_bit
uint8_t ppc_period_bit
number of the bits for the PPC period value
Definition: twinvq.h:126
TwinVQContext::bits_main_spec_change
int bits_main_spec_change[4]
Definition: twinvq.h:154
TWINVQ_CHANNELS_MAX
#define TWINVQ_CHANNELS_MAX
Definition: twinvq.h:56
ff_metasound_mode4432
const TwinVQModeTab ff_metasound_mode4432
sinewin.h
TwinVQContext::read_bitstream
int(* read_bitstream)(AVCodecContext *avctx, struct TwinVQContext *tctx, const uint8_t *buf, int buf_size)
Definition: twinvq.h:173
TWINVQ_SUB_GAIN_BITS
#define TWINVQ_SUB_GAIN_BITS
Definition: twinvq.h:51
metasound_data.h
TWINVQ_CODEC_METASOUND
@ TWINVQ_CODEC_METASOUND
Definition: twinvq.h:35
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
TwinVQContext::frame_size
int frame_size
Definition: twinvq.h:168
AVCodecContext::extradata
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:499
TwinVQContext::bark_hist
float bark_hist[3][2][40]
BSE coefficients of last frame.
Definition: twinvq.h:147
TwinVQFrameData
Definition: twinvq.h:85
AVSampleFormat
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:55
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:211
ff_metasound_decoder
const FFCodec ff_metasound_decoder
Definition: metasound.c:376
metasound_decode_init
static av_cold int metasound_decode_init(AVCodecContext *avctx)
Definition: metasound.c:275
len
int len
Definition: vorbis_enc_data.h:426
AV_CODEC_ID_METASOUND
@ AV_CODEC_ID_METASOUND
Definition: codec_id.h:492
ff_metasound_mode4448
const TwinVQModeTab ff_metasound_mode4448
log2
#define log2(x)
Definition: libm.h:404
avcodec.h
tag
uint32_t tag
Definition: movenc.c:1646
ret
ret
Definition: filter_design.txt:187
TwinVQContext::cur_frame
int cur_frame
Definition: twinvq.h:168
lsp.h
ff_metasound_mode2224
const TwinVQModeTab ff_metasound_mode2224
decode_ppc
static void decode_ppc(TwinVQContext *tctx, int period_coef, int g_coef, const float *shape, float *speech)
Definition: metasound.c:64
TWINVQ_FT_SHORT
@ TWINVQ_FT_SHORT
Short frame (divided in n sub-blocks)
Definition: twinvq.h:39
twinvq.h
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
fft.h
AVCodecContext
main external API structure.
Definition: avcodec.h:398
channel_layout.h
TwinVQContext::frames_per_packet
int frames_per_packet
Definition: twinvq.h:168
metasound_read_bitstream
static int metasound_read_bitstream(AVCodecContext *avctx, TwinVQContext *tctx, const uint8_t *buf, int buf_size)
Definition: metasound.c:167
MetasoundProps::bit_rate
int bit_rate
Definition: metasound.c:248
ff_metasound_mode0808s
const TwinVQModeTab ff_metasound_mode0808s
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:425
TwinVQFrameData::window_type
int window_type
Definition: twinvq.h:86
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
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: metasound.c:116
TwinVQContext
Definition: twinvq.h:136
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
int
int
Definition: ffmpeg_filter.c:155
TwinVQModeTab::lsp_split
uint8_t lsp_split
number of CB entries for the LSP decoding
Definition: twinvq.h:122
ff_twinvq_wtype_to_ftype_table
enum TwinVQFrameType ff_twinvq_wtype_to_ftype_table[]
Definition: twinvq.c:472
TwinVQModeTab::fmode
struct TwinVQFrameMode fmode[3]
frame type-dependent parameters
Definition: twinvq.h:111
TwinVQFrameMode::bark_env_size
uint8_t bark_env_size
number of distinct bark scale envelope values
Definition: twinvq.h:70