FFmpeg
af_lv2.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Paul B Mahol
3  * Copyright (c) 2007-2016 David Robillard <http://drobilla.net>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * LV2 wrapper
25  */
26 
27 #include <lilv/lilv.h>
28 #include <lv2/lv2plug.in/ns/ext/atom/atom.h>
29 #include <lv2/lv2plug.in/ns/ext/buf-size/buf-size.h>
30 
31 #include "libavutil/avstring.h"
33 #include "libavutil/opt.h"
34 #include "audio.h"
35 #include "avfilter.h"
36 #include "internal.h"
37 
38 typedef struct URITable {
39  char **uris;
40  size_t n_uris;
41 } URITable;
42 
43 typedef struct LV2Context {
44  const AVClass *class;
45  char *plugin_uri;
46  char *options;
47 
48  unsigned nb_inputs;
49  unsigned nb_inputcontrols;
50  unsigned nb_outputs;
51 
54  int64_t pts;
55  int64_t duration;
56 
57  LilvWorld *world;
58  const LilvPlugin *plugin;
59  uint32_t nb_ports;
60  float *values;
62  LV2_URID_Map map;
63  LV2_Feature map_feature;
64  LV2_URID_Unmap unmap;
65  LV2_Feature unmap_feature;
66  LV2_Atom_Sequence seq_in[2];
67  LV2_Atom_Sequence *seq_out;
68  const LV2_Feature *features[5];
69 
70  float *mins;
71  float *maxes;
72  float *controls;
73 
74  LilvInstance *instance;
75 
76  LilvNode *atom_AtomPort;
77  LilvNode *atom_Sequence;
78  LilvNode *lv2_AudioPort;
79  LilvNode *lv2_CVPort;
80  LilvNode *lv2_ControlPort;
81  LilvNode *lv2_Optional;
82  LilvNode *lv2_InputPort;
83  LilvNode *lv2_OutputPort;
84  LilvNode *urid_map;
86  LilvNode *fixedBlockLength;
87  LilvNode *boundedBlockLength;
88 } LV2Context;
89 
90 #define OFFSET(x) offsetof(LV2Context, x)
91 #define FLAGS AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
92 
93 static const AVOption lv2_options[] = {
94  { "plugin", "set plugin uri", OFFSET(plugin_uri), AV_OPT_TYPE_STRING, .flags = FLAGS },
95  { "p", "set plugin uri", OFFSET(plugin_uri), AV_OPT_TYPE_STRING, .flags = FLAGS },
96  { "controls", "set plugin options", OFFSET(options), AV_OPT_TYPE_STRING, .flags = FLAGS },
97  { "c", "set plugin options", OFFSET(options), AV_OPT_TYPE_STRING, .flags = FLAGS },
98  { "sample_rate", "set sample rate", OFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64=44100}, 1, INT32_MAX, FLAGS },
99  { "s", "set sample rate", OFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64=44100}, 1, INT32_MAX, FLAGS },
100  { "nb_samples", "set the number of samples per requested frame", OFFSET(nb_samples), AV_OPT_TYPE_INT, {.i64=1024}, 1, INT_MAX, FLAGS },
101  { "n", "set the number of samples per requested frame", OFFSET(nb_samples), AV_OPT_TYPE_INT, {.i64=1024}, 1, INT_MAX, FLAGS },
102  { "duration", "set audio duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64=-1}, -1, INT64_MAX, FLAGS },
103  { "d", "set audio duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64=-1}, -1, INT64_MAX, FLAGS },
104  { NULL }
105 };
106 
108 
110 {
111  table->uris = NULL;
112  table->n_uris = 0;
113 }
114 
116 {
117  int i;
118 
119  for (i = 0; i < table->n_uris; i++) {
120  av_freep(&table->uris[i]);
121  }
122 
123  av_freep(&table->uris);
124 }
125 
126 static LV2_URID uri_table_map(LV2_URID_Map_Handle handle, const char *uri)
127 {
128  URITable *table = (URITable*)handle;
129  const size_t len = strlen(uri);
130  size_t i;
131  char **tmp;
132 
133  for (i = 0; i < table->n_uris; i++) {
134  if (!strcmp(table->uris[i], uri)) {
135  return i + 1;
136  }
137  }
138 
139  tmp = av_calloc(table->n_uris + 1, sizeof(char*));
140  if (!tmp)
141  return table->n_uris;
142  memcpy(tmp, table->uris, table->n_uris * sizeof(char**));
143 
144  av_free(table->uris);
145  table->uris = tmp;
146  table->uris[table->n_uris] = av_malloc(len + 1);
147  if (!table->uris[table->n_uris])
148  return table->n_uris;
149 
150  memcpy(table->uris[table->n_uris], uri, len + 1);
151  table->n_uris++;
152 
153  return table->n_uris;
154 }
155 
156 static const char *uri_table_unmap(LV2_URID_Map_Handle handle, LV2_URID urid)
157 {
158  URITable *table = (URITable*)handle;
159 
160  if (urid > 0 && urid <= table->n_uris) {
161  return table->uris[urid - 1];
162  }
163 
164  return NULL;
165 }
166 
168 {
169  int ich = 0, och = 0, i;
170 
171  for (i = 0; i < s->nb_ports; i++) {
172  const LilvPort *port = lilv_plugin_get_port_by_index(s->plugin, i);
173 
174  if (lilv_port_is_a(s->plugin, port, s->lv2_AudioPort) ||
175  lilv_port_is_a(s->plugin, port, s->lv2_CVPort)) {
176  if (lilv_port_is_a(s->plugin, port, s->lv2_InputPort)) {
177  lilv_instance_connect_port(s->instance, i, in->extended_data[ich++]);
178  } else if (lilv_port_is_a(s->plugin, port, s->lv2_OutputPort)) {
179  lilv_instance_connect_port(s->instance, i, out->extended_data[och++]);
180  } else {
181  av_log(s, AV_LOG_WARNING, "port %d neither input nor output, skipping\n", i);
182  }
183  } else if (lilv_port_is_a(s->plugin, port, s->atom_AtomPort)) {
184  if (lilv_port_is_a(s->plugin, port, s->lv2_InputPort)) {
185  lilv_instance_connect_port(s->instance, i, &s->seq_in);
186  } else {
187  lilv_instance_connect_port(s->instance, i, s->seq_out);
188  }
189  } else if (lilv_port_is_a(s->plugin, port, s->lv2_ControlPort)) {
190  lilv_instance_connect_port(s->instance, i, &s->controls[i]);
191  }
192  }
193 
194  s->seq_in[0].atom.size = sizeof(LV2_Atom_Sequence_Body);
195  s->seq_in[0].atom.type = uri_table_map(&s->uri_table, LV2_ATOM__Sequence);
196  s->seq_out->atom.size = 9624;
197  s->seq_out->atom.type = uri_table_map(&s->uri_table, LV2_ATOM__Chunk);
198 }
199 
201 {
202  AVFilterContext *ctx = inlink->dst;
203  LV2Context *s = ctx->priv;
204  AVFrame *out;
205 
206  if (!s->nb_outputs ||
207  (av_frame_is_writable(in) && s->nb_inputs == s->nb_outputs)) {
208  out = in;
209  } else {
210  out = ff_get_audio_buffer(ctx->outputs[0], in->nb_samples);
211  if (!out) {
212  av_frame_free(&in);
213  return AVERROR(ENOMEM);
214  }
216  }
217 
218  connect_ports(s, in, out);
219 
220  lilv_instance_run(s->instance, in->nb_samples);
221 
222  if (out != in)
223  av_frame_free(&in);
224 
225  return ff_filter_frame(ctx->outputs[0], out);
226 }
227 
228 static int request_frame(AVFilterLink *outlink)
229 {
230  AVFilterContext *ctx = outlink->src;
231  LV2Context *s = ctx->priv;
232  AVFrame *out;
233  int64_t t;
234 
235  if (ctx->nb_inputs)
236  return ff_request_frame(ctx->inputs[0]);
237 
238  t = av_rescale(s->pts, AV_TIME_BASE, s->sample_rate);
239  if (s->duration >= 0 && t >= s->duration)
240  return AVERROR_EOF;
241 
242  out = ff_get_audio_buffer(outlink, s->nb_samples);
243  if (!out)
244  return AVERROR(ENOMEM);
245 
246  connect_ports(s, out, out);
247 
248  lilv_instance_run(s->instance, out->nb_samples);
249 
250  out->sample_rate = s->sample_rate;
251  out->pts = s->pts;
252  s->pts += s->nb_samples;
253 
254  return ff_filter_frame(outlink, out);
255 }
256 
257 static const LV2_Feature buf_size_features[3] = {
258  { LV2_BUF_SIZE__powerOf2BlockLength, NULL },
259  { LV2_BUF_SIZE__fixedBlockLength, NULL },
260  { LV2_BUF_SIZE__boundedBlockLength, NULL },
261 };
262 
263 static int config_output(AVFilterLink *outlink)
264 {
265  AVFilterContext *ctx = outlink->src;
266  LV2Context *s = ctx->priv;
267  char *p, *arg, *saveptr = NULL;
268  int i, sample_rate;
269 
270  uri_table_init(&s->uri_table);
271  s->map.handle = &s->uri_table;
272  s->map.map = uri_table_map;
273  s->map_feature.URI = LV2_URID_MAP_URI;
274  s->map_feature.data = &s->map;
275  s->unmap.handle = &s->uri_table;
276  s->unmap.unmap = uri_table_unmap;
277  s->unmap_feature.URI = LV2_URID_UNMAP_URI;
278  s->unmap_feature.data = &s->unmap;
279  s->features[0] = &s->map_feature;
280  s->features[1] = &s->unmap_feature;
281  s->features[2] = &buf_size_features[0];
282  s->features[3] = &buf_size_features[1];
283  s->features[4] = &buf_size_features[2];
284 
285  if (ctx->nb_inputs) {
286  AVFilterLink *inlink = ctx->inputs[0];
287 
288  outlink->format = inlink->format;
289  outlink->sample_rate = sample_rate = inlink->sample_rate;
290  if (s->nb_inputs == s->nb_outputs) {
291  outlink->channel_layout = inlink->channel_layout;
292  outlink->channels = inlink->channels;
293  }
294 
295  } else {
296  outlink->sample_rate = sample_rate = s->sample_rate;
297  outlink->time_base = (AVRational){1, s->sample_rate};
298  }
299 
300  s->instance = lilv_plugin_instantiate(s->plugin, sample_rate, s->features);
301  if (!s->instance) {
302  av_log(s, AV_LOG_ERROR, "Failed to instantiate <%s>\n", lilv_node_as_uri(lilv_plugin_get_uri(s->plugin)));
303  return AVERROR(EINVAL);
304  }
305 
306  s->mins = av_calloc(s->nb_ports, sizeof(float));
307  s->maxes = av_calloc(s->nb_ports, sizeof(float));
308  s->controls = av_calloc(s->nb_ports, sizeof(float));
309 
310  if (!s->mins || !s->maxes || !s->controls)
311  return AVERROR(ENOMEM);
312 
313  lilv_plugin_get_port_ranges_float(s->plugin, s->mins, s->maxes, s->controls);
314  s->seq_out = av_malloc(sizeof(LV2_Atom_Sequence) + 9624);
315  if (!s->seq_out)
316  return AVERROR(ENOMEM);
317 
318  if (s->options && !strcmp(s->options, "help")) {
319  if (!s->nb_inputcontrols) {
321  "The '%s' plugin does not have any input controls.\n",
322  s->plugin_uri);
323  } else {
325  "The '%s' plugin has the following input controls:\n",
326  s->plugin_uri);
327  for (i = 0; i < s->nb_ports; i++) {
328  const LilvPort *port = lilv_plugin_get_port_by_index(s->plugin, i);
329  const LilvNode *symbol = lilv_port_get_symbol(s->plugin, port);
330  LilvNode *name = lilv_port_get_name(s->plugin, port);
331 
332  if (lilv_port_is_a(s->plugin, port, s->lv2_InputPort) &&
333  lilv_port_is_a(s->plugin, port, s->lv2_ControlPort)) {
334  av_log(ctx, AV_LOG_INFO, "%s\t\t<float> (from %f to %f) (default %f)\t\t%s\n",
335  lilv_node_as_string(symbol), s->mins[i], s->maxes[i], s->controls[i],
336  lilv_node_as_string(name));
337  }
338 
339  lilv_node_free(name);
340  }
341  }
342  return AVERROR_EXIT;
343  }
344 
345  p = s->options;
346  while (s->options) {
347  const LilvPort *port;
348  LilvNode *sym;
349  float val;
350  char *str, *vstr;
351  int index;
352 
353  if (!(arg = av_strtok(p, " |", &saveptr)))
354  break;
355  p = NULL;
356 
357  vstr = strstr(arg, "=");
358  if (vstr == NULL) {
359  av_log(ctx, AV_LOG_ERROR, "Invalid syntax.\n");
360  return AVERROR(EINVAL);
361  }
362 
363  vstr[0] = 0;
364  str = arg;
365  val = atof(vstr+1);
366  sym = lilv_new_string(s->world, str);
367  port = lilv_plugin_get_port_by_symbol(s->plugin, sym);
368  lilv_node_free(sym);
369  if (!port) {
370  av_log(s, AV_LOG_WARNING, "Unknown option: <%s>\n", str);
371  } else {
372  index = lilv_port_get_index(s->plugin, port);
373  s->controls[index] = val;
374  }
375  }
376 
377  if (s->nb_inputs &&
378  (lilv_plugin_has_feature(s->plugin, s->powerOf2BlockLength) ||
379  lilv_plugin_has_feature(s->plugin, s->fixedBlockLength) ||
380  lilv_plugin_has_feature(s->plugin, s->boundedBlockLength))) {
381  AVFilterLink *inlink = ctx->inputs[0];
382 
383  inlink->partial_buf_size = inlink->min_samples = inlink->max_samples = 4096;
384  }
385 
386  return 0;
387 }
388 
390 {
391  LV2Context *s = ctx->priv;
392  const LilvPlugins *plugins;
393  const LilvPlugin *plugin;
394  AVFilterPad pad = { NULL };
395  LilvNode *uri;
396  int i;
397 
398  s->world = lilv_world_new();
399  if (!s->world)
400  return AVERROR(ENOMEM);
401 
402  uri = lilv_new_uri(s->world, s->plugin_uri);
403  if (!uri) {
404  av_log(s, AV_LOG_ERROR, "Invalid plugin URI <%s>\n", s->plugin_uri);
405  return AVERROR(EINVAL);
406  }
407 
408  lilv_world_load_all(s->world);
409  plugins = lilv_world_get_all_plugins(s->world);
410  plugin = lilv_plugins_get_by_uri(plugins, uri);
411  lilv_node_free(uri);
412 
413  if (!plugin) {
414  av_log(s, AV_LOG_ERROR, "Plugin <%s> not found\n", s->plugin_uri);
415  return AVERROR(EINVAL);
416  }
417 
418  s->plugin = plugin;
419  s->nb_ports = lilv_plugin_get_num_ports(s->plugin);
420 
421  s->lv2_InputPort = lilv_new_uri(s->world, LV2_CORE__InputPort);
422  s->lv2_OutputPort = lilv_new_uri(s->world, LV2_CORE__OutputPort);
423  s->lv2_AudioPort = lilv_new_uri(s->world, LV2_CORE__AudioPort);
424  s->lv2_ControlPort = lilv_new_uri(s->world, LV2_CORE__ControlPort);
425  s->lv2_Optional = lilv_new_uri(s->world, LV2_CORE__connectionOptional);
426  s->atom_AtomPort = lilv_new_uri(s->world, LV2_ATOM__AtomPort);
427  s->atom_Sequence = lilv_new_uri(s->world, LV2_ATOM__Sequence);
428  s->urid_map = lilv_new_uri(s->world, LV2_URID__map);
429  s->powerOf2BlockLength = lilv_new_uri(s->world, LV2_BUF_SIZE__powerOf2BlockLength);
430  s->fixedBlockLength = lilv_new_uri(s->world, LV2_BUF_SIZE__fixedBlockLength);
431  s->boundedBlockLength = lilv_new_uri(s->world, LV2_BUF_SIZE__boundedBlockLength);
432 
433  for (i = 0; i < s->nb_ports; i++) {
434  const LilvPort *lport = lilv_plugin_get_port_by_index(s->plugin, i);
435  int is_input = 0;
436  int is_optional = 0;
437 
438  is_optional = lilv_port_has_property(s->plugin, lport, s->lv2_Optional);
439 
440  if (lilv_port_is_a(s->plugin, lport, s->lv2_InputPort)) {
441  is_input = 1;
442  } else if (!lilv_port_is_a(s->plugin, lport, s->lv2_OutputPort) && !is_optional) {
443  return AVERROR(EINVAL);
444  }
445 
446  if (lilv_port_is_a(s->plugin, lport, s->lv2_ControlPort)) {
447  if (is_input) {
448  s->nb_inputcontrols++;
449  }
450  } else if (lilv_port_is_a(s->plugin, lport, s->lv2_AudioPort)) {
451  if (is_input) {
452  s->nb_inputs++;
453  } else {
454  s->nb_outputs++;
455  }
456  }
457  }
458 
459  pad.type = AVMEDIA_TYPE_AUDIO;
460 
461  if (s->nb_inputs) {
462  pad.name = av_asprintf("in0:%s:%u", s->plugin_uri, s->nb_inputs);
463  if (!pad.name)
464  return AVERROR(ENOMEM);
465 
467  if (ff_insert_inpad(ctx, ctx->nb_inputs, &pad) < 0) {
468  av_freep(&pad.name);
469  return AVERROR(ENOMEM);
470  }
471  }
472 
473  return 0;
474 }
475 
477 {
478  LV2Context *s = ctx->priv;
481  AVFilterLink *outlink = ctx->outputs[0];
482  static const enum AVSampleFormat sample_fmts[] = {
484  int ret;
485 
487  if (!formats)
488  return AVERROR(ENOMEM);
490  if (ret < 0)
491  return ret;
492 
493  if (s->nb_inputs) {
495  if (!formats)
496  return AVERROR(ENOMEM);
497 
499  if (ret < 0)
500  return ret;
501  } else {
502  int sample_rates[] = { s->sample_rate, -1 };
503 
505  if (ret < 0)
506  return ret;
507  }
508 
509  if (s->nb_inputs == 2 && s->nb_outputs == 2) {
510  layouts = NULL;
512  if (ret < 0)
513  return ret;
515  if (ret < 0)
516  return ret;
517  } else {
518  if (s->nb_inputs >= 1) {
519  AVFilterLink *inlink = ctx->inputs[0];
520  uint64_t inlayout = FF_COUNT2LAYOUT(s->nb_inputs);
521 
522  layouts = NULL;
523  ret = ff_add_channel_layout(&layouts, inlayout);
524  if (ret < 0)
525  return ret;
526  ret = ff_channel_layouts_ref(layouts, &inlink->outcfg.channel_layouts);
527  if (ret < 0)
528  return ret;
529 
530  if (!s->nb_outputs) {
532  if (ret < 0)
533  return ret;
534  }
535  }
536 
537  if (s->nb_outputs >= 1) {
538  uint64_t outlayout = FF_COUNT2LAYOUT(s->nb_outputs);
539 
540  layouts = NULL;
541  ret = ff_add_channel_layout(&layouts, outlayout);
542  if (ret < 0)
543  return ret;
545  if (ret < 0)
546  return ret;
547  }
548  }
549 
550  return 0;
551 }
552 
554 {
555  LV2Context *s = ctx->priv;
556 
557  lilv_node_free(s->powerOf2BlockLength);
558  lilv_node_free(s->fixedBlockLength);
559  lilv_node_free(s->boundedBlockLength);
560  lilv_node_free(s->urid_map);
561  lilv_node_free(s->atom_Sequence);
562  lilv_node_free(s->atom_AtomPort);
563  lilv_node_free(s->lv2_Optional);
564  lilv_node_free(s->lv2_ControlPort);
565  lilv_node_free(s->lv2_AudioPort);
566  lilv_node_free(s->lv2_OutputPort);
567  lilv_node_free(s->lv2_InputPort);
568  uri_table_destroy(&s->uri_table);
569  lilv_instance_free(s->instance);
570  lilv_world_free(s->world);
571  av_freep(&s->mins);
572  av_freep(&s->maxes);
573  av_freep(&s->controls);
574  av_freep(&s->seq_out);
575 
576  if (ctx->nb_inputs)
577  av_freep(&ctx->input_pads[0].name);
578 }
579 
580 static const AVFilterPad lv2_outputs[] = {
581  {
582  .name = "default",
583  .type = AVMEDIA_TYPE_AUDIO,
584  .config_props = config_output,
585  .request_frame = request_frame,
586  },
587  { NULL }
588 };
589 
591  .name = "lv2",
592  .description = NULL_IF_CONFIG_SMALL("Apply LV2 effect."),
593  .priv_size = sizeof(LV2Context),
594  .priv_class = &lv2_class,
595  .init = init,
596  .uninit = uninit,
598  .inputs = 0,
599  .outputs = lv2_outputs,
601 };
formats
formats
Definition: signature.h:48
ff_get_audio_buffer
AVFrame * ff_get_audio_buffer(AVFilterLink *link, int nb_samples)
Request an audio samples buffer with a specific set of permissions.
Definition: audio.c:86
AV_SAMPLE_FMT_FLTP
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition: samplefmt.h:69
AVFilterChannelLayouts
A list of supported channel layouts.
Definition: formats.h:85
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
LV2Context::lv2_OutputPort
LilvNode * lv2_OutputPort
Definition: af_lv2.c:83
LV2Context::sample_rate
int sample_rate
Definition: af_lv2.c:52
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
opt.h
LV2Context::options
char * options
Definition: af_lv2.c:46
ff_make_format_list
AVFilterFormats * ff_make_format_list(const int *fmts)
Create a list of supported formats.
Definition: formats.c:286
AVFilterFormatsConfig::channel_layouts
AVFilterChannelLayouts * channel_layouts
Lists of supported channel layouts, only for audio.
Definition: avfilter.h:447
out
FILE * out
Definition: movenc.c:54
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:978
sample_fmts
static enum AVSampleFormat sample_fmts[]
Definition: adpcmenc.c:948
ff_channel_layouts_ref
int ff_channel_layouts_ref(AVFilterChannelLayouts *f, AVFilterChannelLayouts **ref)
Add *ref as a new reference to f.
Definition: formats.c:454
layouts
enum MovChannelLayoutTag * layouts
Definition: mov_chan.c:434
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:55
LV2Context::world
LilvWorld * world
Definition: af_lv2.c:57
inlink
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is inlink
Definition: filter_design.txt:212
av_asprintf
char * av_asprintf(const char *fmt,...)
Definition: avstring.c:113
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:112
lv2_outputs
static const AVFilterPad lv2_outputs[]
Definition: af_lv2.c:580
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:303
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:26
index
fg index
Definition: ffmpeg_filter.c:168
OFFSET
#define OFFSET(x)
Definition: af_lv2.c:90
AVOption
AVOption.
Definition: opt.h:247
table
static const uint16_t table[]
Definition: prosumer.c:206
AV_OPT_TYPE_DURATION
@ AV_OPT_TYPE_DURATION
Definition: opt.h:238
init
static av_cold int init(AVFilterContext *ctx)
Definition: af_lv2.c:389
ff_request_frame
int ff_request_frame(AVFilterLink *link)
Request an input frame from the filter at the other end of the link.
Definition: avfilter.c:395
connect_ports
static void connect_ports(LV2Context *s, AVFrame *in, AVFrame *out)
Definition: af_lv2.c:167
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:149
lv2_options
static const AVOption lv2_options[]
Definition: af_lv2.c:93
sample_rate
sample_rate
Definition: ffmpeg_filter.c:156
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
AVFilterFormats
A list of supported formats for one end of a filter link.
Definition: formats.h:64
ff_insert_inpad
static int ff_insert_inpad(AVFilterContext *f, unsigned index, AVFilterPad *p)
Insert a new input pad for the filter.
Definition: internal.h:240
LV2Context::lv2_ControlPort
LilvNode * lv2_ControlPort
Definition: af_lv2.c:80
ff_af_lv2
const AVFilter ff_af_lv2
Definition: af_lv2.c:590
URITable
Definition: af_lv2.c:38
LV2Context::lv2_AudioPort
LilvNode * lv2_AudioPort
Definition: af_lv2.c:78
val
static double val(void *priv, double ch)
Definition: aeval.c:75
LV2Context::fixedBlockLength
LilvNode * fixedBlockLength
Definition: af_lv2.c:86
LV2Context::nb_inputs
unsigned nb_inputs
Definition: af_lv2.c:48
AVFILTER_FLAG_DYNAMIC_INPUTS
#define AVFILTER_FLAG_DYNAMIC_INPUTS
The number of the filter inputs is not determined just by AVFilter.inputs.
Definition: avfilter.h:106
AV_CH_LAYOUT_STEREO
#define AV_CH_LAYOUT_STEREO
Definition: channel_layout.h:91
AVFilterPad
A filter pad used for either input or output.
Definition: internal.h:54
query_formats
static int query_formats(AVFilterContext *ctx)
Definition: af_lv2.c:476
LV2Context::duration
int64_t duration
Definition: af_lv2.c:55
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
inputs
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several inputs
Definition: filter_design.txt:243
ff_set_common_formats
int ff_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
A helper for query_formats() which sets all links to the same list of formats.
Definition: formats.c:580
duration
int64_t duration
Definition: movenc.c:64
ff_add_channel_layout
int ff_add_channel_layout(AVFilterChannelLayouts **l, uint64_t channel_layout)
Definition: formats.c:331
s
#define s(width, name)
Definition: cbs_vp9.c:257
LV2Context::pts
int64_t pts
Definition: af_lv2.c:54
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
LV2Context::nb_outputs
unsigned nb_outputs
Definition: af_lv2.c:50
av_strtok
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok().
Definition: avstring.c:186
LV2Context::features
const LV2_Feature * features[5]
Definition: af_lv2.c:68
outputs
static const AVFilterPad outputs[]
Definition: af_acontrast.c:203
URITable::n_uris
size_t n_uris
Definition: af_lv2.c:40
ctx
AVFormatContext * ctx
Definition: movenc.c:48
FLAGS
#define FLAGS
Definition: af_lv2.c:91
uninit
static av_cold void uninit(AVFilterContext *ctx)
Definition: af_lv2.c:553
LV2Context::lv2_Optional
LilvNode * lv2_Optional
Definition: af_lv2.c:81
arg
const char * arg
Definition: jacosubdec.c:67
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
NULL
#define NULL
Definition: coverity.c:32
LV2Context::boundedBlockLength
LilvNode * boundedBlockLength
Definition: af_lv2.c:87
av_frame_copy_props
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:537
LV2Context::lv2_InputPort
LilvNode * lv2_InputPort
Definition: af_lv2.c:82
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
LV2Context::map
LV2_URID_Map map
Definition: af_lv2.c:62
AVFilterPad::filter_frame
int(* filter_frame)(AVFilterLink *link, AVFrame *frame)
Filtering callback.
Definition: internal.h:93
uri_table_init
static void uri_table_init(URITable *table)
Definition: af_lv2.c:109
filter_frame
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
Definition: af_lv2.c:200
uri_table_destroy
static void uri_table_destroy(URITable *table)
Definition: af_lv2.c:115
LV2Context::seq_out
LV2_Atom_Sequence * seq_out
Definition: af_lv2.c:67
LV2Context::nb_inputcontrols
unsigned nb_inputcontrols
Definition: af_lv2.c:49
options
const OptionDef options[]
LV2Context::lv2_CVPort
LilvNode * lv2_CVPort
Definition: af_lv2.c:79
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:116
LV2Context::uri_table
URITable uri_table
Definition: af_lv2.c:61
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:59
uri_table_map
static LV2_URID uri_table_map(LV2_URID_Map_Handle handle, const char *uri)
Definition: af_lv2.c:126
av_frame_is_writable
int av_frame_is_writable(AVFrame *frame)
Check if the frame data is writable.
Definition: frame.c:473
request_frame
static int request_frame(AVFilterLink *outlink)
Definition: af_lv2.c:228
LV2Context::map_feature
LV2_Feature map_feature
Definition: af_lv2.c:63
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:191
sample_rates
sample_rates
Definition: ffmpeg_filter.c:156
internal.h
URITable::uris
char ** uris
Definition: af_lv2.c:39
AVFrame::nb_samples
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:369
LV2Context::nb_ports
uint32_t nb_ports
Definition: af_lv2.c:59
i
int i
Definition: input.c:406
LV2Context
Definition: af_lv2.c:43
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:254
AVFrame::extended_data
uint8_t ** extended_data
pointers to the data planes/channels.
Definition: frame.h:350
AVSampleFormat
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:58
LV2Context::atom_AtomPort
LilvNode * atom_AtomPort
Definition: af_lv2.c:76
len
int len
Definition: vorbis_enc_data.h:426
AVFilterPad::name
const char * name
Pad name.
Definition: internal.h:60
AVFILTER_DEFINE_CLASS
AVFILTER_DEFINE_CLASS(lv2)
LV2Context::powerOf2BlockLength
LilvNode * powerOf2BlockLength
Definition: af_lv2.c:85
av_rescale
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
Definition: mathematics.c:128
LV2Context::values
float * values
Definition: af_lv2.c:60
AVFilter
Filter definition.
Definition: avfilter.h:145
ret
ret
Definition: filter_design.txt:187
AVFilterPad::type
enum AVMediaType type
AVFilterPad type.
Definition: internal.h:65
FF_COUNT2LAYOUT
#define FF_COUNT2LAYOUT(c)
Encode a channel count as a channel layout.
Definition: formats.h:102
config_output
static int config_output(AVFilterLink *outlink)
Definition: af_lv2.c:263
buf_size_features
static const LV2_Feature buf_size_features[3]
Definition: af_lv2.c:257
LV2Context::urid_map
LilvNode * urid_map
Definition: af_lv2.c:84
LV2Context::plugin_uri
char * plugin_uri
Definition: af_lv2.c:45
ff_all_samplerates
AVFilterFormats * ff_all_samplerates(void)
Definition: formats.c:414
uri_table_unmap
static const char * uri_table_unmap(LV2_URID_Map_Handle handle, LV2_URID urid)
Definition: af_lv2.c:156
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Non-inlined equivalent of av_mallocz_array().
Definition: mem.c:251
channel_layout.h
LV2Context::atom_Sequence
LilvNode * atom_Sequence
Definition: af_lv2.c:77
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:224
avfilter.h
LV2Context::nb_samples
int nb_samples
Definition: af_lv2.c:53
AVFilterContext
An instance of a filter.
Definition: avfilter.h:333
audio.h
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
LV2Context::mins
float * mins
Definition: af_lv2.c:70
LV2Context::controls
float * controls
Definition: af_lv2.c:72
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
convert_header.str
string str
Definition: convert_header.py:20
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:561
LV2Context::instance
LilvInstance * instance
Definition: af_lv2.c:74
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
LV2Context::seq_in
LV2_Atom_Sequence seq_in[2]
Definition: af_lv2.c:66
ff_set_common_samplerates
int ff_set_common_samplerates(AVFilterContext *ctx, AVFilterFormats *samplerates)
Definition: formats.c:568
AVERROR_EXIT
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
Definition: error.h:56
avstring.h
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Definition: opt.h:228
LV2Context::maxes
float * maxes
Definition: af_lv2.c:71
LV2Context::unmap
LV2_URID_Unmap unmap
Definition: af_lv2.c:64
LV2Context::plugin
const LilvPlugin * plugin
Definition: af_lv2.c:58
ff_set_common_channel_layouts
int ff_set_common_channel_layouts(AVFilterContext *ctx, AVFilterChannelLayouts *channel_layouts)
A helper for query_formats() which sets all links to the same list of channel layouts/sample rates.
Definition: formats.c:561
LV2Context::unmap_feature
LV2_Feature unmap_feature
Definition: af_lv2.c:65