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/mem.h"
34 #include "libavutil/opt.h"
35 #include "audio.h"
36 #include "avfilter.h"
37 #include "filters.h"
38 #include "formats.h"
39 
40 typedef struct URITable {
41  char **uris;
42  size_t n_uris;
43 } URITable;
44 
45 typedef struct LV2Context {
46  const AVClass *class;
47  char *plugin_uri;
48  char *options;
49 
50  unsigned nb_inputs;
51  unsigned nb_inputcontrols;
52  unsigned nb_outputs;
53 
58 
59  LilvWorld *world;
60  const LilvPlugin *plugin;
61  uint32_t nb_ports;
62  float *values;
64  LV2_URID_Map map;
65  LV2_Feature map_feature;
66  LV2_URID_Unmap unmap;
67  LV2_Feature unmap_feature;
68  LV2_Atom_Sequence seq_in[2];
69  LV2_Atom_Sequence *seq_out;
70  const LV2_Feature *features[5];
71 
72  float *mins;
73  float *maxes;
74  float *controls;
75 
76  LilvInstance *instance;
77 
78  LilvNode *atom_AtomPort;
79  LilvNode *atom_Sequence;
80  LilvNode *lv2_AudioPort;
81  LilvNode *lv2_CVPort;
82  LilvNode *lv2_ControlPort;
83  LilvNode *lv2_Optional;
84  LilvNode *lv2_InputPort;
85  LilvNode *lv2_OutputPort;
86  LilvNode *urid_map;
88  LilvNode *fixedBlockLength;
89  LilvNode *boundedBlockLength;
90 } LV2Context;
91 
92 #define OFFSET(x) offsetof(LV2Context, x)
93 #define FLAGS AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
94 
95 static const AVOption lv2_options[] = {
96  { "plugin", "set plugin uri", OFFSET(plugin_uri), AV_OPT_TYPE_STRING, .flags = FLAGS },
97  { "p", "set plugin uri", OFFSET(plugin_uri), AV_OPT_TYPE_STRING, .flags = FLAGS },
98  { "controls", "set plugin options", OFFSET(options), AV_OPT_TYPE_STRING, .flags = FLAGS },
99  { "c", "set plugin options", OFFSET(options), AV_OPT_TYPE_STRING, .flags = FLAGS },
100  { "sample_rate", "set sample rate", OFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64=44100}, 1, INT32_MAX, FLAGS },
101  { "s", "set sample rate", OFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64=44100}, 1, INT32_MAX, FLAGS },
102  { "nb_samples", "set the number of samples per requested frame", OFFSET(nb_samples), AV_OPT_TYPE_INT, {.i64=1024}, 1, INT_MAX, FLAGS },
103  { "n", "set the number of samples per requested frame", OFFSET(nb_samples), AV_OPT_TYPE_INT, {.i64=1024}, 1, INT_MAX, FLAGS },
104  { "duration", "set audio duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64=-1}, -1, INT64_MAX, FLAGS },
105  { "d", "set audio duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64=-1}, -1, INT64_MAX, FLAGS },
106  { NULL }
107 };
108 
110 
112 {
113  table->uris = NULL;
114  table->n_uris = 0;
115 }
116 
118 {
119  int i;
120 
121  for (i = 0; i < table->n_uris; i++) {
122  av_freep(&table->uris[i]);
123  }
124 
125  av_freep(&table->uris);
126 }
127 
128 static LV2_URID uri_table_map(LV2_URID_Map_Handle handle, const char *uri)
129 {
130  URITable *table = (URITable*)handle;
131  const size_t len = strlen(uri);
132  size_t i;
133  char **tmp;
134 
135  for (i = 0; i < table->n_uris; i++) {
136  if (!strcmp(table->uris[i], uri)) {
137  return i + 1;
138  }
139  }
140 
141  tmp = av_calloc(table->n_uris + 1, sizeof(char*));
142  if (!tmp)
143  return table->n_uris;
144  memcpy(tmp, table->uris, table->n_uris * sizeof(char**));
145 
146  av_free(table->uris);
147  table->uris = tmp;
148  table->uris[table->n_uris] = av_malloc(len + 1);
149  if (!table->uris[table->n_uris])
150  return table->n_uris;
151 
152  memcpy(table->uris[table->n_uris], uri, len + 1);
153  table->n_uris++;
154 
155  return table->n_uris;
156 }
157 
158 static const char *uri_table_unmap(LV2_URID_Map_Handle handle, LV2_URID urid)
159 {
160  URITable *table = (URITable*)handle;
161 
162  if (urid > 0 && urid <= table->n_uris) {
163  return table->uris[urid - 1];
164  }
165 
166  return NULL;
167 }
168 
170 {
171  LV2Context *s = ctx->priv;
172  int ich = 0, och = 0, i;
173 
174  for (i = 0; i < s->nb_ports; i++) {
175  const LilvPort *port = lilv_plugin_get_port_by_index(s->plugin, i);
176 
177  if (lilv_port_is_a(s->plugin, port, s->lv2_AudioPort) ||
178  lilv_port_is_a(s->plugin, port, s->lv2_CVPort)) {
179  if (lilv_port_is_a(s->plugin, port, s->lv2_InputPort)) {
180  lilv_instance_connect_port(s->instance, i, in->extended_data[ich++]);
181  } else if (lilv_port_is_a(s->plugin, port, s->lv2_OutputPort)) {
182  lilv_instance_connect_port(s->instance, i, out->extended_data[och++]);
183  } else {
184  av_log(ctx, AV_LOG_WARNING, "port %d neither input nor output, skipping\n", i);
185  }
186  } else if (lilv_port_is_a(s->plugin, port, s->atom_AtomPort)) {
187  if (lilv_port_is_a(s->plugin, port, s->lv2_InputPort)) {
188  lilv_instance_connect_port(s->instance, i, &s->seq_in);
189  } else {
190  lilv_instance_connect_port(s->instance, i, s->seq_out);
191  }
192  } else if (lilv_port_is_a(s->plugin, port, s->lv2_ControlPort)) {
193  lilv_instance_connect_port(s->instance, i, &s->controls[i]);
194  }
195  }
196 
197  s->seq_in[0].atom.size = sizeof(LV2_Atom_Sequence_Body);
198  s->seq_in[0].atom.type = uri_table_map(&s->uri_table, LV2_ATOM__Sequence);
199  s->seq_out->atom.size = 9624;
200  s->seq_out->atom.type = uri_table_map(&s->uri_table, LV2_ATOM__Chunk);
201 }
202 
204 {
205  AVFilterContext *ctx = inlink->dst;
206  LV2Context *s = ctx->priv;
207  AVFrame *out;
208 
209  if (!s->nb_outputs ||
210  (av_frame_is_writable(in) && s->nb_inputs == s->nb_outputs)) {
211  out = in;
212  } else {
213  out = ff_get_audio_buffer(ctx->outputs[0], in->nb_samples);
214  if (!out) {
215  av_frame_free(&in);
216  return AVERROR(ENOMEM);
217  }
219  }
220 
221  connect_ports(ctx, in, out);
222 
223  lilv_instance_run(s->instance, in->nb_samples);
224 
225  if (out != in)
226  av_frame_free(&in);
227 
228  return ff_filter_frame(ctx->outputs[0], out);
229 }
230 
231 static int request_frame(AVFilterLink *outlink)
232 {
233  AVFilterContext *ctx = outlink->src;
234  LV2Context *s = ctx->priv;
235  AVFrame *out;
236  int64_t t;
237 
238  if (ctx->nb_inputs)
239  return ff_request_frame(ctx->inputs[0]);
240 
241  t = av_rescale(s->pts, AV_TIME_BASE, s->sample_rate);
242  if (s->duration >= 0 && t >= s->duration)
243  return AVERROR_EOF;
244 
245  out = ff_get_audio_buffer(outlink, s->nb_samples);
246  if (!out)
247  return AVERROR(ENOMEM);
248 
250 
251  lilv_instance_run(s->instance, out->nb_samples);
252 
253  out->sample_rate = s->sample_rate;
254  out->pts = s->pts;
255  s->pts += s->nb_samples;
256 
257  return ff_filter_frame(outlink, out);
258 }
259 
260 static const LV2_Feature buf_size_features[3] = {
261  { LV2_BUF_SIZE__powerOf2BlockLength, NULL },
262  { LV2_BUF_SIZE__fixedBlockLength, NULL },
263  { LV2_BUF_SIZE__boundedBlockLength, NULL },
264 };
265 
266 static int config_output(AVFilterLink *outlink)
267 {
268  AVFilterContext *ctx = outlink->src;
269  LV2Context *s = ctx->priv;
270  char *p, *arg, *saveptr = NULL;
271  int i, sample_rate;
272 
273  uri_table_init(&s->uri_table);
274  s->map.handle = &s->uri_table;
275  s->map.map = uri_table_map;
276  s->map_feature.URI = LV2_URID_MAP_URI;
277  s->map_feature.data = &s->map;
278  s->unmap.handle = &s->uri_table;
279  s->unmap.unmap = uri_table_unmap;
280  s->unmap_feature.URI = LV2_URID_UNMAP_URI;
281  s->unmap_feature.data = &s->unmap;
282  s->features[0] = &s->map_feature;
283  s->features[1] = &s->unmap_feature;
284  s->features[2] = &buf_size_features[0];
285  s->features[3] = &buf_size_features[1];
286  s->features[4] = &buf_size_features[2];
287 
288  if (ctx->nb_inputs) {
289  AVFilterLink *inlink = ctx->inputs[0];
290 
291  outlink->format = inlink->format;
292  outlink->sample_rate = sample_rate = inlink->sample_rate;
293  if (s->nb_inputs == s->nb_outputs) {
294  int ret;
295  if ((ret = av_channel_layout_copy(&outlink->ch_layout, &inlink->ch_layout)) < 0)
296  return ret;
297  }
298 
299  } else {
300  outlink->sample_rate = sample_rate = s->sample_rate;
301  outlink->time_base = (AVRational){1, s->sample_rate};
302  }
303 
304  s->instance = lilv_plugin_instantiate(s->plugin, sample_rate, s->features);
305  if (!s->instance) {
306  av_log(ctx, AV_LOG_ERROR, "Failed to instantiate <%s>\n", lilv_node_as_uri(lilv_plugin_get_uri(s->plugin)));
307  return AVERROR(EINVAL);
308  }
309 
310  s->mins = av_calloc(s->nb_ports, sizeof(float));
311  s->maxes = av_calloc(s->nb_ports, sizeof(float));
312  s->controls = av_calloc(s->nb_ports, sizeof(float));
313 
314  if (!s->mins || !s->maxes || !s->controls)
315  return AVERROR(ENOMEM);
316 
317  lilv_plugin_get_port_ranges_float(s->plugin, s->mins, s->maxes, s->controls);
318  s->seq_out = av_malloc(sizeof(LV2_Atom_Sequence) + 9624);
319  if (!s->seq_out)
320  return AVERROR(ENOMEM);
321 
322  if (s->options && !strcmp(s->options, "help")) {
323  if (!s->nb_inputcontrols) {
325  "The '%s' plugin does not have any input controls.\n",
326  s->plugin_uri);
327  } else {
329  "The '%s' plugin has the following input controls:\n",
330  s->plugin_uri);
331  for (i = 0; i < s->nb_ports; i++) {
332  const LilvPort *port = lilv_plugin_get_port_by_index(s->plugin, i);
333  const LilvNode *symbol = lilv_port_get_symbol(s->plugin, port);
334  LilvNode *name = lilv_port_get_name(s->plugin, port);
335 
336  if (lilv_port_is_a(s->plugin, port, s->lv2_InputPort) &&
337  lilv_port_is_a(s->plugin, port, s->lv2_ControlPort)) {
338  av_log(ctx, AV_LOG_INFO, "%s\t\t<float> (from %f to %f) (default %f)\t\t%s\n",
339  lilv_node_as_string(symbol), s->mins[i], s->maxes[i], s->controls[i],
340  lilv_node_as_string(name));
341  }
342 
343  lilv_node_free(name);
344  }
345  }
346  return AVERROR_EXIT;
347  }
348 
349  p = s->options;
350  while (s->options) {
351  const LilvPort *port;
352  LilvNode *sym;
353  float val;
354  char *str, *vstr;
355  int index;
356 
357  if (!(arg = av_strtok(p, " |", &saveptr)))
358  break;
359  p = NULL;
360 
361  vstr = strstr(arg, "=");
362  if (vstr == NULL) {
363  av_log(ctx, AV_LOG_ERROR, "Invalid syntax.\n");
364  return AVERROR(EINVAL);
365  }
366 
367  vstr[0] = 0;
368  str = arg;
369  val = atof(vstr+1);
370  sym = lilv_new_string(s->world, str);
371  port = lilv_plugin_get_port_by_symbol(s->plugin, sym);
372  lilv_node_free(sym);
373  if (!port) {
374  av_log(ctx, AV_LOG_WARNING, "Unknown option: <%s>\n", str);
375  } else {
376  index = lilv_port_get_index(s->plugin, port);
377  s->controls[index] = val;
378  }
379  }
380 
381  if (s->nb_inputs &&
382  (lilv_plugin_has_feature(s->plugin, s->powerOf2BlockLength) ||
383  lilv_plugin_has_feature(s->plugin, s->fixedBlockLength) ||
384  lilv_plugin_has_feature(s->plugin, s->boundedBlockLength))) {
385  FilterLink *inlink = ff_filter_link(ctx->inputs[0]);
386 
387  inlink->min_samples = inlink->max_samples = 4096;
388  }
389 
390  return 0;
391 }
392 
394 {
395  LV2Context *s = ctx->priv;
396  const LilvPlugins *plugins;
397  const LilvPlugin *plugin;
398  AVFilterPad pad = { NULL };
399  LilvNode *uri;
400  int i, ret;
401 
402  s->world = lilv_world_new();
403  if (!s->world)
404  return AVERROR(ENOMEM);
405 
406  uri = lilv_new_uri(s->world, s->plugin_uri);
407  if (!uri) {
408  av_log(ctx, AV_LOG_ERROR, "Invalid plugin URI <%s>\n", s->plugin_uri);
409  return AVERROR(EINVAL);
410  }
411 
412  lilv_world_load_all(s->world);
413  plugins = lilv_world_get_all_plugins(s->world);
414  plugin = lilv_plugins_get_by_uri(plugins, uri);
415  lilv_node_free(uri);
416 
417  if (!plugin) {
418  av_log(ctx, AV_LOG_ERROR, "Plugin <%s> not found\n", s->plugin_uri);
419  return AVERROR(EINVAL);
420  }
421 
422  s->plugin = plugin;
423  s->nb_ports = lilv_plugin_get_num_ports(s->plugin);
424 
425  s->lv2_InputPort = lilv_new_uri(s->world, LV2_CORE__InputPort);
426  s->lv2_OutputPort = lilv_new_uri(s->world, LV2_CORE__OutputPort);
427  s->lv2_AudioPort = lilv_new_uri(s->world, LV2_CORE__AudioPort);
428  s->lv2_ControlPort = lilv_new_uri(s->world, LV2_CORE__ControlPort);
429  s->lv2_Optional = lilv_new_uri(s->world, LV2_CORE__connectionOptional);
430  s->atom_AtomPort = lilv_new_uri(s->world, LV2_ATOM__AtomPort);
431  s->atom_Sequence = lilv_new_uri(s->world, LV2_ATOM__Sequence);
432  s->urid_map = lilv_new_uri(s->world, LV2_URID__map);
433  s->powerOf2BlockLength = lilv_new_uri(s->world, LV2_BUF_SIZE__powerOf2BlockLength);
434  s->fixedBlockLength = lilv_new_uri(s->world, LV2_BUF_SIZE__fixedBlockLength);
435  s->boundedBlockLength = lilv_new_uri(s->world, LV2_BUF_SIZE__boundedBlockLength);
436 
437  for (i = 0; i < s->nb_ports; i++) {
438  const LilvPort *lport = lilv_plugin_get_port_by_index(s->plugin, i);
439  int is_input = 0;
440  int is_optional = 0;
441 
442  is_optional = lilv_port_has_property(s->plugin, lport, s->lv2_Optional);
443 
444  if (lilv_port_is_a(s->plugin, lport, s->lv2_InputPort)) {
445  is_input = 1;
446  } else if (!lilv_port_is_a(s->plugin, lport, s->lv2_OutputPort) && !is_optional) {
447  return AVERROR(EINVAL);
448  }
449 
450  if (lilv_port_is_a(s->plugin, lport, s->lv2_ControlPort)) {
451  if (is_input) {
452  s->nb_inputcontrols++;
453  }
454  } else if (lilv_port_is_a(s->plugin, lport, s->lv2_AudioPort)) {
455  if (is_input) {
456  s->nb_inputs++;
457  } else {
458  s->nb_outputs++;
459  }
460  }
461  }
462 
463  pad.type = AVMEDIA_TYPE_AUDIO;
464 
465  if (s->nb_inputs) {
466  pad.name = av_asprintf("in0:%s:%u", s->plugin_uri, s->nb_inputs);
467  if (!pad.name)
468  return AVERROR(ENOMEM);
469 
471  if ((ret = ff_append_inpad_free_name(ctx, &pad)) < 0)
472  return ret;
473  }
474 
475  return 0;
476 }
477 
479  AVFilterFormatsConfig **cfg_in,
480  AVFilterFormatsConfig **cfg_out)
481 {
482  const LV2Context *s = ctx->priv;
484  static const enum AVSampleFormat sample_fmts[] = {
486  int ret = ff_set_common_formats_from_list2(ctx, cfg_in, cfg_out, sample_fmts);
487  if (ret < 0)
488  return ret;
489 
490  if (!s->nb_inputs) {
491  int sample_rates[] = { s->sample_rate, -1 };
492 
494  if (ret < 0)
495  return ret;
496  }
497 
498  if (s->nb_inputs == 2 && s->nb_outputs == 2) {
499  layouts = NULL;
501  if (ret < 0)
502  return ret;
503  ret = ff_set_common_channel_layouts2(ctx, cfg_in, cfg_out, layouts);
504  if (ret < 0)
505  return ret;
506  } else {
507  if (s->nb_inputs >= 1) {
508  AVChannelLayout inlayout = FF_COUNT2LAYOUT(s->nb_inputs);
509 
510  layouts = NULL;
511  ret = ff_add_channel_layout(&layouts, &inlayout);
512  if (ret < 0)
513  return ret;
515  if (ret < 0)
516  return ret;
517 
518  if (!s->nb_outputs) {
520  if (ret < 0)
521  return ret;
522  }
523  }
524 
525  if (s->nb_outputs >= 1) {
526  AVChannelLayout outlayout = FF_COUNT2LAYOUT(s->nb_outputs);
527 
528  layouts = NULL;
529  ret = ff_add_channel_layout(&layouts, &outlayout);
530  if (ret < 0)
531  return ret;
533  if (ret < 0)
534  return ret;
535  }
536  }
537 
538  return 0;
539 }
540 
541 static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
542  char *res, int res_len, int flags)
543 {
544  LV2Context *s = ctx->priv;
545  const LilvPort *port;
546  LilvNode *sym;
547  int index;
548 
549  sym = lilv_new_string(s->world, cmd);
550  port = lilv_plugin_get_port_by_symbol(s->plugin, sym);
551  lilv_node_free(sym);
552  if (!port) {
553  av_log(ctx, AV_LOG_WARNING, "Unknown option: <%s>\n", cmd);
554  } else {
555  index = lilv_port_get_index(s->plugin, port);
556  s->controls[index] = atof(args);
557  }
558  return 0;
559 }
560 
562 {
563  LV2Context *s = ctx->priv;
564 
565  lilv_node_free(s->powerOf2BlockLength);
566  lilv_node_free(s->fixedBlockLength);
567  lilv_node_free(s->boundedBlockLength);
568  lilv_node_free(s->urid_map);
569  lilv_node_free(s->atom_Sequence);
570  lilv_node_free(s->atom_AtomPort);
571  lilv_node_free(s->lv2_Optional);
572  lilv_node_free(s->lv2_ControlPort);
573  lilv_node_free(s->lv2_AudioPort);
574  lilv_node_free(s->lv2_OutputPort);
575  lilv_node_free(s->lv2_InputPort);
576  uri_table_destroy(&s->uri_table);
577  lilv_instance_free(s->instance);
578  lilv_world_free(s->world);
579  av_freep(&s->mins);
580  av_freep(&s->maxes);
581  av_freep(&s->controls);
582  av_freep(&s->seq_out);
583 }
584 
585 static const AVFilterPad lv2_outputs[] = {
586  {
587  .name = "default",
588  .type = AVMEDIA_TYPE_AUDIO,
589  .config_props = config_output,
590  .request_frame = request_frame,
591  },
592 };
593 
595  .p.name = "lv2",
596  .p.description = NULL_IF_CONFIG_SMALL("Apply LV2 effect."),
597  .p.priv_class = &lv2_class,
598  .p.flags = AVFILTER_FLAG_DYNAMIC_INPUTS,
599  .priv_size = sizeof(LV2Context),
600  .init = init,
601  .uninit = uninit,
605 };
flags
const SwsFlags flags[]
Definition: swscale.c:61
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:98
AV_SAMPLE_FMT_FLTP
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition: samplefmt.h:66
query_formats
static int query_formats(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
Definition: af_lv2.c:478
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:216
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
process_command
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
Definition: af_lv2.c:541
LV2Context::lv2_OutputPort
LilvNode * lv2_OutputPort
Definition: af_lv2.c:85
LV2Context::sample_rate
int sample_rate
Definition: af_lv2.c:54
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:48
ff_set_common_channel_layouts2
int ff_set_common_channel_layouts2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, AVFilterChannelLayouts *channel_layouts)
Helpers for query_formats2() which set all free audio links to the same list of channel layouts/sampl...
Definition: formats.c:911
out
FILE * out
Definition: movenc.c:55
AV_CHANNEL_LAYOUT_STEREO
#define AV_CHANNEL_LAYOUT_STEREO
Definition: channel_layout.h:395
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1062
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:673
layouts
enum MovChannelLayoutTag * layouts
Definition: mov_chan.c:335
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
LV2Context::world
LilvWorld * world
Definition: af_lv2.c:59
int64_t
long long int64_t
Definition: coverity.c:34
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:115
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:63
lv2_outputs
static const AVFilterPad lv2_outputs[]
Definition: af_lv2.c:585
sample_rates
static const int sample_rates[]
Definition: dcaenc.h:34
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:427
OFFSET
#define OFFSET(x)
Definition: af_lv2.c:92
ff_af_lv2
const FFFilter ff_af_lv2
Definition: af_lv2.c:594
AVOption
AVOption.
Definition: opt.h:429
table
static const uint16_t table[]
Definition: prosumer.c:203
AV_OPT_TYPE_DURATION
@ AV_OPT_TYPE_DURATION
Underlying C type is int64_t.
Definition: opt.h:319
init
static av_cold int init(AVFilterContext *ctx)
Definition: af_lv2.c:393
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:480
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:215
lv2_options
static const AVOption lv2_options[]
Definition: af_lv2.c:95
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
formats.h
LV2Context::lv2_ControlPort
LilvNode * lv2_ControlPort
Definition: af_lv2.c:82
URITable
Definition: af_lv2.c:40
LV2Context::lv2_AudioPort
LilvNode * lv2_AudioPort
Definition: af_lv2.c:80
val
static double val(void *priv, double ch)
Definition: aeval.c:77
LV2Context::fixedBlockLength
LilvNode * fixedBlockLength
Definition: af_lv2.c:88
LV2Context::nb_inputs
unsigned nb_inputs
Definition: af_lv2.c:50
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:151
AVFilterPad
A filter pad used for either input or output.
Definition: filters.h:39
LV2Context::duration
int64_t duration
Definition: af_lv2.c:57
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
av_cold
#define av_cold
Definition: attributes.h:90
FFFilter
Definition: filters.h:266
duration
int64_t duration
Definition: movenc.c:65
s
#define s(width, name)
Definition: cbs_vp9.c:198
LV2Context::pts
int64_t pts
Definition: af_lv2.c:56
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
LV2Context::nb_outputs
unsigned nb_outputs
Definition: af_lv2.c:52
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:179
LV2Context::features
const LV2_Feature * features[5]
Definition: af_lv2.c:70
URITable::n_uris
size_t n_uris
Definition: af_lv2.c:42
filters.h
ff_set_common_samplerates_from_list2
int ff_set_common_samplerates_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const int *samplerates)
Definition: formats.c:944
ctx
AVFormatContext * ctx
Definition: movenc.c:49
FLAGS
#define FLAGS
Definition: af_lv2.c:93
uninit
static av_cold void uninit(AVFilterContext *ctx)
Definition: af_lv2.c:561
LV2Context::lv2_Optional
LilvNode * lv2_Optional
Definition: af_lv2.c:83
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: filters.h:264
arg
const char * arg
Definition: jacosubdec.c:67
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
NULL
#define NULL
Definition: coverity.c:32
LV2Context::boundedBlockLength
LilvNode * boundedBlockLength
Definition: af_lv2.c:89
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:597
tmp
static uint8_t tmp[20]
Definition: aes_ctr.c:47
LV2Context::lv2_InputPort
LilvNode * lv2_InputPort
Definition: af_lv2.c:84
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
ff_append_inpad_free_name
int ff_append_inpad_free_name(AVFilterContext *f, AVFilterPad *p)
Definition: avfilter.c:132
LV2Context::map
LV2_URID_Map map
Definition: af_lv2.c:64
options
Definition: swscale.c:43
AVFilterPad::filter_frame
int(* filter_frame)(AVFilterLink *link, AVFrame *frame)
Filtering callback.
Definition: filters.h:94
connect_ports
static void connect_ports(AVFilterContext *ctx, AVFrame *in, AVFrame *out)
Definition: af_lv2.c:169
ff_add_channel_layout
int ff_add_channel_layout(AVFilterChannelLayouts **l, const AVChannelLayout *channel_layout)
Definition: formats.c:521
uri_table_init
static void uri_table_init(URITable *table)
Definition: af_lv2.c:111
index
int index
Definition: gxfenc.c:90
filter_frame
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
Definition: af_lv2.c:203
AVFilterFormatsConfig
Lists of formats / etc.
Definition: avfilter.h:121
ff_filter_link
static FilterLink * ff_filter_link(AVFilterLink *link)
Definition: filters.h:198
uri_table_destroy
static void uri_table_destroy(URITable *table)
Definition: af_lv2.c:117
LV2Context::seq_out
LV2_Atom_Sequence * seq_out
Definition: af_lv2.c:69
LV2Context::nb_inputcontrols
unsigned nb_inputcontrols
Definition: af_lv2.c:51
LV2Context::lv2_CVPort
LilvNode * lv2_CVPort
Definition: af_lv2.c:81
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:94
LV2Context::uri_table
URITable uri_table
Definition: af_lv2.c:63
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition: channel_layout.h:319
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:56
uri_table_map
static LV2_URID uri_table_map(LV2_URID_Map_Handle handle, const char *uri)
Definition: af_lv2.c:128
av_frame_is_writable
int av_frame_is_writable(AVFrame *frame)
Check if the frame data is writable.
Definition: frame.c:533
request_frame
static int request_frame(AVFilterLink *outlink)
Definition: af_lv2.c:231
LV2Context::map_feature
LV2_Feature map_feature
Definition: af_lv2.c:65
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
URITable::uris
char ** uris
Definition: af_lv2.c:41
AVFrame::nb_samples
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:507
LV2Context::nb_ports
uint32_t nb_ports
Definition: af_lv2.c:61
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
LV2Context
Definition: af_lv2.c:45
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:253
AVFrame::extended_data
uint8_t ** extended_data
pointers to the data planes/channels.
Definition: frame.h:488
AVSampleFormat
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:55
LV2Context::atom_AtomPort
LilvNode * atom_AtomPort
Definition: af_lv2.c:78
FILTER_QUERY_FUNC2
#define FILTER_QUERY_FUNC2(func)
Definition: filters.h:240
len
int len
Definition: vorbis_enc_data.h:426
AVFilterPad::name
const char * name
Pad name.
Definition: filters.h:45
AVFILTER_DEFINE_CLASS
AVFILTER_DEFINE_CLASS(lv2)
LV2Context::powerOf2BlockLength
LilvNode * powerOf2BlockLength
Definition: af_lv2.c:87
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:129
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
LV2Context::values
float * values
Definition: af_lv2.c:62
ret
ret
Definition: filter_design.txt:187
AVFilterPad::type
enum AVMediaType type
AVFilterPad type.
Definition: filters.h:50
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:266
buf_size_features
static const LV2_Feature buf_size_features[3]
Definition: af_lv2.c:260
LV2Context::urid_map
LilvNode * urid_map
Definition: af_lv2.c:86
LV2Context::plugin_uri
char * plugin_uri
Definition: af_lv2.c:47
uri_table_unmap
static const char * uri_table_unmap(LV2_URID_Map_Handle handle, LV2_URID urid)
Definition: af_lv2.c:158
ff_set_common_formats_from_list2
int ff_set_common_formats_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const int *fmts)
Definition: formats.c:1016
channel_layout.h
LV2Context::atom_Sequence
LilvNode * atom_Sequence
Definition: af_lv2.c:79
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
avfilter.h
LV2Context::nb_samples
int nb_samples
Definition: af_lv2.c:55
AVFilterContext
An instance of a filter.
Definition: avfilter.h:269
av_channel_layout_copy
int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src)
Make a copy of a channel layout.
Definition: channel_layout.c:449
FFFilter::p
AVFilter p
The public AVFilter.
Definition: filters.h:270
mem.h
audio.h
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
LV2Context::mins
float * mins
Definition: af_lv2.c:72
LV2Context::controls
float * controls
Definition: af_lv2.c:74
channel_layouts
static const uint16_t channel_layouts[7]
Definition: dca_lbr.c:112
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
LV2Context::instance
LilvInstance * instance
Definition: af_lv2.c:76
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
LV2Context::seq_in
LV2_Atom_Sequence seq_in[2]
Definition: af_lv2.c:68
AVERROR_EXIT
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
Definition: error.h:58
avstring.h
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
Definition: opt.h:276
LV2Context::maxes
float * maxes
Definition: af_lv2.c:73
LV2Context::unmap
LV2_URID_Unmap unmap
Definition: af_lv2.c:66
LV2Context::plugin
const LilvPlugin * plugin
Definition: af_lv2.c:60
LV2Context::unmap_feature
LV2_Feature unmap_feature
Definition: af_lv2.c:67