avfilter.c
Go to the documentation of this file.
1 /*
2  * filter layer
3  * Copyright (c) 2007 Bobby Bingham
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 "libavutil/avassert.h"
23 #include "libavutil/avstring.h"
25 #include "libavutil/common.h"
26 #include "libavutil/imgutils.h"
27 #include "libavutil/opt.h"
28 #include "libavutil/pixdesc.h"
29 #include "libavutil/rational.h"
30 #include "libavutil/samplefmt.h"
31 
32 #include "audio.h"
33 #include "avfilter.h"
34 #include "formats.h"
35 #include "internal.h"
36 #include "audio.h"
37 
39 
40 void ff_tlog_ref(void *ctx, AVFrame *ref, int end)
41 {
42  av_unused char buf[16];
43  ff_tlog(ctx,
44  "ref[%p buf:%p data:%p linesize[%d, %d, %d, %d] pts:%"PRId64" pos:%"PRId64,
45  ref, ref->buf, ref->data[0],
46  ref->linesize[0], ref->linesize[1], ref->linesize[2], ref->linesize[3],
47  ref->pts, av_frame_get_pkt_pos(ref));
48 
49  if (ref->width) {
50  ff_tlog(ctx, " a:%d/%d s:%dx%d i:%c iskey:%d type:%c",
52  ref->width, ref->height,
53  !ref->interlaced_frame ? 'P' : /* Progressive */
54  ref->top_field_first ? 'T' : 'B', /* Top / Bottom */
55  ref->key_frame,
57  }
58  if (ref->nb_samples) {
59  ff_tlog(ctx, " cl:%"PRId64"d n:%d r:%d",
60  ref->channel_layout,
61  ref->nb_samples,
62  ref->sample_rate);
63  }
64 
65  ff_tlog(ctx, "]%s", end ? "\n" : "");
66 }
67 
68 unsigned avfilter_version(void) {
71 }
72 
73 const char *avfilter_configuration(void)
74 {
75  return FFMPEG_CONFIGURATION;
76 }
77 
78 const char *avfilter_license(void)
79 {
80 #define LICENSE_PREFIX "libavfilter license: "
81  return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
82 }
83 
85 {
87  av_freep(&c->arg);
88  av_freep(&c->command);
89  filter->command_queue= c->next;
90  av_free(c);
91 }
92 
93 void ff_insert_pad(unsigned idx, unsigned *count, size_t padidx_off,
94  AVFilterPad **pads, AVFilterLink ***links,
95  AVFilterPad *newpad)
96 {
97  unsigned i;
98 
99  idx = FFMIN(idx, *count);
100 
101  *pads = av_realloc(*pads, sizeof(AVFilterPad) * (*count + 1));
102  *links = av_realloc(*links, sizeof(AVFilterLink*) * (*count + 1));
103  memmove(*pads +idx+1, *pads +idx, sizeof(AVFilterPad) * (*count-idx));
104  memmove(*links+idx+1, *links+idx, sizeof(AVFilterLink*) * (*count-idx));
105  memcpy(*pads+idx, newpad, sizeof(AVFilterPad));
106  (*links)[idx] = NULL;
107 
108  (*count)++;
109  for (i = idx+1; i < *count; i++)
110  if (*links[i])
111  (*(unsigned *)((uint8_t *) *links[i] + padidx_off))++;
112 }
113 
114 int avfilter_link(AVFilterContext *src, unsigned srcpad,
115  AVFilterContext *dst, unsigned dstpad)
116 {
118 
119  if (src->nb_outputs <= srcpad || dst->nb_inputs <= dstpad ||
120  src->outputs[srcpad] || dst->inputs[dstpad])
121  return -1;
122 
123  if (src->output_pads[srcpad].type != dst->input_pads[dstpad].type) {
124  av_log(src, AV_LOG_ERROR,
125  "Media type mismatch between the '%s' filter output pad %d (%s) and the '%s' filter input pad %d (%s)\n",
126  src->name, srcpad, (char *)av_x_if_null(av_get_media_type_string(src->output_pads[srcpad].type), "?"),
127  dst->name, dstpad, (char *)av_x_if_null(av_get_media_type_string(dst-> input_pads[dstpad].type), "?"));
128  return AVERROR(EINVAL);
129  }
130 
131  src->outputs[srcpad] =
132  dst-> inputs[dstpad] = link = av_mallocz(sizeof(AVFilterLink));
133 
134  link->src = src;
135  link->dst = dst;
136  link->srcpad = &src->output_pads[srcpad];
137  link->dstpad = &dst->input_pads[dstpad];
138  link->type = src->output_pads[srcpad].type;
140  link->format = -1;
141 
142  return 0;
143 }
144 
146 {
147  if (!*link)
148  return;
149 
150  av_frame_free(&(*link)->partial_buf);
151 
152  av_freep(link);
153 }
154 
156 {
157  return link->channels;
158 }
159 
161 {
162  link->closed = closed;
163 }
164 
166  unsigned filt_srcpad_idx, unsigned filt_dstpad_idx)
167 {
168  int ret;
169  unsigned dstpad_idx = link->dstpad - link->dst->input_pads;
170 
171  av_log(link->dst, AV_LOG_VERBOSE, "auto-inserting filter '%s' "
172  "between the filter '%s' and the filter '%s'\n",
173  filt->name, link->src->name, link->dst->name);
174 
175  link->dst->inputs[dstpad_idx] = NULL;
176  if ((ret = avfilter_link(filt, filt_dstpad_idx, link->dst, dstpad_idx)) < 0) {
177  /* failed to link output filter to new filter */
178  link->dst->inputs[dstpad_idx] = link;
179  return ret;
180  }
181 
182  /* re-hookup the link to the new destination filter we inserted */
183  link->dst = filt;
184  link->dstpad = &filt->input_pads[filt_srcpad_idx];
185  filt->inputs[filt_srcpad_idx] = link;
186 
187  /* if any information on supported media formats already exists on the
188  * link, we need to preserve that */
189  if (link->out_formats)
191  &filt->outputs[filt_dstpad_idx]->out_formats);
192 
193  if (link->out_samplerates)
195  &filt->outputs[filt_dstpad_idx]->out_samplerates);
196  if (link->out_channel_layouts)
198  &filt->outputs[filt_dstpad_idx]->out_channel_layouts);
199 
200  return 0;
201 }
202 
204 {
205  int (*config_link)(AVFilterLink *);
206  unsigned i;
207  int ret;
208 
209  for (i = 0; i < filter->nb_inputs; i ++) {
210  AVFilterLink *link = filter->inputs[i];
211  AVFilterLink *inlink;
212 
213  if (!link) continue;
214 
215  inlink = link->src->nb_inputs ? link->src->inputs[0] : NULL;
216  link->current_pts = AV_NOPTS_VALUE;
217 
218  switch (link->init_state) {
219  case AVLINK_INIT:
220  continue;
221  case AVLINK_STARTINIT:
222  av_log(filter, AV_LOG_INFO, "circular filter chain detected\n");
223  return 0;
224  case AVLINK_UNINIT:
225  link->init_state = AVLINK_STARTINIT;
226 
227  if ((ret = avfilter_config_links(link->src)) < 0)
228  return ret;
229 
230  if (!(config_link = link->srcpad->config_props)) {
231  if (link->src->nb_inputs != 1) {
232  av_log(link->src, AV_LOG_ERROR, "Source filters and filters "
233  "with more than one input "
234  "must set config_props() "
235  "callbacks on all outputs\n");
236  return AVERROR(EINVAL);
237  }
238  } else if ((ret = config_link(link)) < 0) {
239  av_log(link->src, AV_LOG_ERROR,
240  "Failed to configure output pad on %s\n",
241  link->src->name);
242  return ret;
243  }
244 
245  switch (link->type) {
246  case AVMEDIA_TYPE_VIDEO:
247  if (!link->time_base.num && !link->time_base.den)
248  link->time_base = inlink ? inlink->time_base : AV_TIME_BASE_Q;
249 
250  if (!link->sample_aspect_ratio.num && !link->sample_aspect_ratio.den)
251  link->sample_aspect_ratio = inlink ?
252  inlink->sample_aspect_ratio : (AVRational){1,1};
253 
254  if (inlink && !link->frame_rate.num && !link->frame_rate.den)
255  link->frame_rate = inlink->frame_rate;
256 
257  if (inlink) {
258  if (!link->w)
259  link->w = inlink->w;
260  if (!link->h)
261  link->h = inlink->h;
262  } else if (!link->w || !link->h) {
263  av_log(link->src, AV_LOG_ERROR,
264  "Video source filters must set their output link's "
265  "width and height\n");
266  return AVERROR(EINVAL);
267  }
268  break;
269 
270  case AVMEDIA_TYPE_AUDIO:
271  if (inlink) {
272  if (!link->time_base.num && !link->time_base.den)
273  link->time_base = inlink->time_base;
274  }
275 
276  if (!link->time_base.num && !link->time_base.den)
277  link->time_base = (AVRational) {1, link->sample_rate};
278  }
279 
280  if ((config_link = link->dstpad->config_props))
281  if ((ret = config_link(link)) < 0) {
282  av_log(link->src, AV_LOG_ERROR,
283  "Failed to configure input pad on %s\n",
284  link->dst->name);
285  return ret;
286  }
287 
288  link->init_state = AVLINK_INIT;
289  }
290  }
291 
292  return 0;
293 }
294 
295 void ff_tlog_link(void *ctx, AVFilterLink *link, int end)
296 {
297  if (link->type == AVMEDIA_TYPE_VIDEO) {
298  ff_tlog(ctx,
299  "link[%p s:%dx%d fmt:%s %s->%s]%s",
300  link, link->w, link->h,
302  link->src ? link->src->filter->name : "",
303  link->dst ? link->dst->filter->name : "",
304  end ? "\n" : "");
305  } else {
306  char buf[128];
307  av_get_channel_layout_string(buf, sizeof(buf), -1, link->channel_layout);
308 
309  ff_tlog(ctx,
310  "link[%p r:%d cl:%s fmt:%s %s->%s]%s",
311  link, (int)link->sample_rate, buf,
313  link->src ? link->src->filter->name : "",
314  link->dst ? link->dst->filter->name : "",
315  end ? "\n" : "");
316  }
317 }
318 
320 {
321  int ret = -1;
323 
324  if (link->closed)
325  return AVERROR_EOF;
326  av_assert0(!link->frame_requested);
327  link->frame_requested = 1;
328  while (link->frame_requested) {
329  if (link->srcpad->request_frame)
330  ret = link->srcpad->request_frame(link);
331  else if (link->src->inputs[0])
332  ret = ff_request_frame(link->src->inputs[0]);
333  if (ret == AVERROR_EOF && link->partial_buf) {
334  AVFrame *pbuf = link->partial_buf;
335  link->partial_buf = NULL;
336  ret = ff_filter_frame_framed(link, pbuf);
337  }
338  if (ret < 0) {
339  link->frame_requested = 0;
340  if (ret == AVERROR_EOF)
341  link->closed = 1;
342  } else {
343  av_assert0(!link->frame_requested ||
345  }
346  }
347  return ret;
348 }
349 
351 {
352  int i, min = INT_MAX;
353 
354  if (link->srcpad->poll_frame)
355  return link->srcpad->poll_frame(link);
356 
357  for (i = 0; i < link->src->nb_inputs; i++) {
358  int val;
359  if (!link->src->inputs[i])
360  return -1;
361  val = ff_poll_frame(link->src->inputs[i]);
362  min = FFMIN(min, val);
363  }
364 
365  return min;
366 }
367 
369 {
370  if (pts == AV_NOPTS_VALUE)
371  return;
372  link->current_pts = av_rescale_q(pts, link->time_base, AV_TIME_BASE_Q);
373  /* TODO use duration */
374  if (link->graph && link->age_index >= 0)
376 }
377 
378 int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags)
379 {
380  if(!strcmp(cmd, "ping")){
381  av_strlcatf(res, res_len, "pong from:%s %s\n", filter->filter->name, filter->name);
382  return 0;
383  }else if(filter->filter->process_command) {
384  return filter->filter->process_command(filter, cmd, arg, res, res_len, flags);
385  }
386  return AVERROR(ENOSYS);
387 }
388 
390 
392 {
393  AVFilter *f = NULL;
394 
395  if (!name)
396  return NULL;
397 
398  while ((f = avfilter_next(f)))
399  if (!strcmp(f->name, name))
400  return f;
401 
402  return NULL;
403 }
404 
406 {
407  AVFilter **f = &first_filter;
408  int i;
409 
410  for(i=0; filter->inputs && filter->inputs[i].name; i++) {
411  const AVFilterPad *input = &filter->inputs[i];
412  av_assert0( !input->filter_frame
413  || (!input->start_frame && !input->end_frame));
414  }
415 
416  while (*f)
417  f = &(*f)->next;
418  *f = filter;
419  filter->next = NULL;
420 
421  return 0;
422 }
423 
424 const AVFilter *avfilter_next(const AVFilter *prev)
425 {
426  return prev ? prev->next : first_filter;
427 }
428 
429 #if FF_API_OLD_FILTER_REGISTER
430 AVFilter **av_filter_next(AVFilter **filter)
431 {
432  return filter ? &(*filter)->next : &first_filter;
433 }
434 
435 void avfilter_uninit(void)
436 {
437 }
438 #endif
439 
441 {
442  int count;
443 
444  if (!pads)
445  return 0;
446 
447  for(count = 0; pads->name; count ++) pads ++;
448  return count;
449 }
450 
451 static const char *default_filter_name(void *filter_ctx)
452 {
453  AVFilterContext *ctx = filter_ctx;
454  return ctx->name ? ctx->name : ctx->filter->name;
455 }
456 
457 static void *filter_child_next(void *obj, void *prev)
458 {
459  AVFilterContext *ctx = obj;
460  if (!prev && ctx->filter && ctx->filter->priv_class && ctx->priv)
461  return ctx->priv;
462  return NULL;
463 }
464 
465 static const AVClass *filter_child_class_next(const AVClass *prev)
466 {
467  AVFilter *f = NULL;
468 
469  /* find the filter that corresponds to prev */
470  while (prev && (f = avfilter_next(f)))
471  if (f->priv_class == prev)
472  break;
473 
474  /* could not find filter corresponding to prev */
475  if (prev && !f)
476  return NULL;
477 
478  /* find next filter with specific options */
479  while ((f = avfilter_next(f)))
480  if (f->priv_class)
481  return f->priv_class;
482 
483  return NULL;
484 }
485 
486 static const AVClass avfilter_class = {
487  .class_name = "AVFilter",
488  .item_name = default_filter_name,
489  .version = LIBAVUTIL_VERSION_INT,
490  .category = AV_CLASS_CATEGORY_FILTER,
491  .child_next = filter_child_next,
492  .child_class_next = filter_child_class_next,
493 };
494 
495 AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name)
496 {
498 
499  if (!filter)
500  return NULL;
501 
502  ret = av_mallocz(sizeof(AVFilterContext));
503  if (!ret)
504  return NULL;
505 
506  ret->av_class = &avfilter_class;
507  ret->filter = filter;
508  ret->name = inst_name ? av_strdup(inst_name) : NULL;
509  if (filter->priv_size) {
510  ret->priv = av_mallocz(filter->priv_size);
511  if (!ret->priv)
512  goto err;
513  }
514 
515  if (filter->priv_class) {
516  *(const AVClass**)ret->priv = filter->priv_class;
518  }
519 
520  ret->nb_inputs = avfilter_pad_count(filter->inputs);
521  if (ret->nb_inputs ) {
522  ret->input_pads = av_malloc(sizeof(AVFilterPad) * ret->nb_inputs);
523  if (!ret->input_pads)
524  goto err;
525  memcpy(ret->input_pads, filter->inputs, sizeof(AVFilterPad) * ret->nb_inputs);
526  ret->inputs = av_mallocz(sizeof(AVFilterLink*) * ret->nb_inputs);
527  if (!ret->inputs)
528  goto err;
529  }
530 
531  ret->nb_outputs = avfilter_pad_count(filter->outputs);
532  if (ret->nb_outputs) {
533  ret->output_pads = av_malloc(sizeof(AVFilterPad) * ret->nb_outputs);
534  if (!ret->output_pads)
535  goto err;
536  memcpy(ret->output_pads, filter->outputs, sizeof(AVFilterPad) * ret->nb_outputs);
537  ret->outputs = av_mallocz(sizeof(AVFilterLink*) * ret->nb_outputs);
538  if (!ret->outputs)
539  goto err;
540  }
541 #if FF_API_FOO_COUNT
542  ret->output_count = ret->nb_outputs;
543  ret->input_count = ret->nb_inputs;
544 #endif
545 
546  return ret;
547 
548 err:
549  av_freep(&ret->inputs);
550  av_freep(&ret->input_pads);
551  ret->nb_inputs = 0;
552  av_freep(&ret->outputs);
553  av_freep(&ret->output_pads);
554  ret->nb_outputs = 0;
555  av_freep(&ret->priv);
556  av_free(ret);
557  return NULL;
558 }
559 
560 #if FF_API_AVFILTER_OPEN
561 int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name)
562 {
563  *filter_ctx = ff_filter_alloc(filter, inst_name);
564  return *filter_ctx ? 0 : AVERROR(ENOMEM);
565 }
566 #endif
567 
569 {
570  int i;
572 
573  if (!filter)
574  return;
575 
576  if (filter->graph)
577  ff_filter_graph_remove_filter(filter->graph, filter);
578 
579  if (filter->filter->uninit)
580  filter->filter->uninit(filter);
581 
582  for (i = 0; i < filter->nb_inputs; i++) {
583  if ((link = filter->inputs[i])) {
584  if (link->src)
585  link->src->outputs[link->srcpad - link->src->output_pads] = NULL;
592  }
593  avfilter_link_free(&link);
594  }
595  for (i = 0; i < filter->nb_outputs; i++) {
596  if ((link = filter->outputs[i])) {
597  if (link->dst)
598  link->dst->inputs[link->dstpad - link->dst->input_pads] = NULL;
605  }
606  avfilter_link_free(&link);
607  }
608 
609  if (filter->filter->priv_class)
610  av_opt_free(filter->priv);
611 
612  av_freep(&filter->name);
613  av_freep(&filter->input_pads);
614  av_freep(&filter->output_pads);
615  av_freep(&filter->inputs);
616  av_freep(&filter->outputs);
617  av_freep(&filter->priv);
618  while(filter->command_queue){
619  ff_command_queue_pop(filter);
620  }
621  av_free(filter);
622 }
623 
625  const char *args)
626 {
627  const AVOption *o = NULL;
628  int ret, count = 0;
629  char *av_uninit(parsed_key), *av_uninit(value);
630  const char *key;
631  int offset= -1;
632 
633  if (!args)
634  return 0;
635 
636  while (*args) {
637  const char *shorthand = NULL;
638 
639  o = av_opt_next(ctx->priv, o);
640  if (o) {
641  if (o->type == AV_OPT_TYPE_CONST || o->offset == offset)
642  continue;
643  offset = o->offset;
644  shorthand = o->name;
645  }
646 
647  ret = av_opt_get_key_value(&args, "=", ":",
648  shorthand ? AV_OPT_FLAG_IMPLICIT_KEY : 0,
649  &parsed_key, &value);
650  if (ret < 0) {
651  if (ret == AVERROR(EINVAL))
652  av_log(ctx, AV_LOG_ERROR, "No option name near '%s'\n", args);
653  else
654  av_log(ctx, AV_LOG_ERROR, "Unable to parse '%s': %s\n", args,
655  av_err2str(ret));
656  return ret;
657  }
658  if (*args)
659  args++;
660  if (parsed_key) {
661  key = parsed_key;
662  while ((o = av_opt_next(ctx->priv, o))); /* discard all remaining shorthand */
663  } else {
664  key = shorthand;
665  }
666 
667  av_log(ctx, AV_LOG_DEBUG, "Setting '%s' to value '%s'\n", key, value);
668  av_dict_set(options, key, value, 0);
669  if ((ret = av_opt_set(ctx->priv, key, value, 0)) < 0) {
671  if (ret == AVERROR_OPTION_NOT_FOUND)
672  av_log(ctx, AV_LOG_ERROR, "Option '%s' not found\n", key);
673  av_free(value);
674  av_free(parsed_key);
675  return ret;
676  }
677  }
678 
679  av_free(value);
680  av_free(parsed_key);
681  count++;
682  }
683  return count;
684 }
685 
686 #if FF_API_AVFILTER_INIT_FILTER
687 int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque)
688 {
689  return avfilter_init_str(filter, args);
690 }
691 #endif
692 
694 {
695  int ret = 0;
696 
697  if (ctx->filter->priv_class) {
698  ret = av_opt_set_dict(ctx->priv, options);
699  if (ret < 0) {
700  av_log(ctx, AV_LOG_ERROR, "Error applying options to the filter.\n");
701  return ret;
702  }
703  }
704 
705  if (ctx->filter->init_opaque)
706  ret = ctx->filter->init_opaque(ctx, NULL);
707  else if (ctx->filter->init)
708  ret = ctx->filter->init(ctx);
709  else if (ctx->filter->init_dict)
710  ret = ctx->filter->init_dict(ctx, options);
711 
712  return ret;
713 }
714 
715 int avfilter_init_str(AVFilterContext *filter, const char *args)
716 {
719  int ret=0;
720 
721  if (args && *args) {
722  if (!filter->filter->priv_class) {
723  av_log(filter, AV_LOG_ERROR, "This filter does not take any "
724  "options, but options were provided: %s.\n", args);
725  return AVERROR(EINVAL);
726  }
727 
728 #if FF_API_OLD_FILTER_OPTS
729  if ( !strcmp(filter->filter->name, "format") ||
730  !strcmp(filter->filter->name, "noformat") ||
731  !strcmp(filter->filter->name, "frei0r") ||
732  !strcmp(filter->filter->name, "frei0r_src") ||
733  !strcmp(filter->filter->name, "ocv") ||
734  !strcmp(filter->filter->name, "pan") ||
735  !strcmp(filter->filter->name, "pp") ||
736  !strcmp(filter->filter->name, "aevalsrc")) {
737  /* a hack for compatibility with the old syntax
738  * replace colons with |s */
739  char *copy = av_strdup(args);
740  char *p = copy;
741  int nb_leading = 0; // number of leading colons to skip
742  int deprecated = 0;
743 
744  if (!copy) {
745  ret = AVERROR(ENOMEM);
746  goto fail;
747  }
748 
749  if (!strcmp(filter->filter->name, "frei0r") ||
750  !strcmp(filter->filter->name, "ocv"))
751  nb_leading = 1;
752  else if (!strcmp(filter->filter->name, "frei0r_src"))
753  nb_leading = 3;
754 
755  while (nb_leading--) {
756  p = strchr(p, ':');
757  if (!p) {
758  p = copy + strlen(copy);
759  break;
760  }
761  p++;
762  }
763 
764  deprecated = strchr(p, ':') != NULL;
765 
766  if (!strcmp(filter->filter->name, "aevalsrc")) {
767  deprecated = 0;
768  while ((p = strchr(p, ':')) && p[1] != ':') {
769  const char *epos = strchr(p + 1, '=');
770  const char *spos = strchr(p + 1, ':');
771  const int next_token_is_opt = epos && (!spos || epos < spos);
772  if (next_token_is_opt) {
773  p++;
774  break;
775  }
776  /* next token does not contain a '=', assume a channel expression */
777  deprecated = 1;
778  *p++ = '|';
779  }
780  if (p && *p == ':') { // double sep '::' found
781  deprecated = 1;
782  memmove(p, p + 1, strlen(p));
783  }
784  } else
785  while ((p = strchr(p, ':')))
786  *p++ = '|';
787 
788  if (deprecated)
789  av_log(filter, AV_LOG_WARNING, "This syntax is deprecated. Use "
790  "'|' to separate the list items.\n");
791 
792  av_log(filter, AV_LOG_DEBUG, "compat: called with args=[%s]\n", copy);
793  ret = process_options(filter, &options, copy);
794  av_freep(&copy);
795 
796  if (ret < 0)
797  goto fail;
798 #endif
799  } else {
800 #if CONFIG_MP_FILTER
801  if (!strcmp(filter->filter->name, "mp")) {
802  char *escaped;
803 
804  if (!strncmp(args, "filter=", 7))
805  args += 7;
806  ret = av_escape(&escaped, args, ":=", AV_ESCAPE_MODE_BACKSLASH, 0);
807  if (ret < 0) {
808  av_log(filter, AV_LOG_ERROR, "Unable to escape MPlayer filters arg '%s'\n", args);
809  goto fail;
810  }
811  ret = process_options(filter, &options, escaped);
812  av_free(escaped);
813  } else
814 #endif
815  ret = process_options(filter, &options, args);
816  if (ret < 0)
817  goto fail;
818  }
819  }
820 
821  ret = avfilter_init_dict(filter, &options);
822  if (ret < 0)
823  goto fail;
824 
825  if ((e = av_dict_get(options, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
826  av_log(filter, AV_LOG_ERROR, "No such option: %s.\n", e->key);
828  goto fail;
829  }
830 
831 fail:
832  av_dict_free(&options);
833 
834  return ret;
835 }
836 
837 const char *avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx)
838 {
839  return pads[pad_idx].name;
840 }
841 
842 enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx)
843 {
844  return pads[pad_idx].type;
845 }
846 
848 {
849  return ff_filter_frame(link->dst->outputs[0], frame);
850 }
851 
853 {
854  int (*filter_frame)(AVFilterLink *, AVFrame *);
855  AVFilterPad *dst = link->dstpad;
856  AVFrame *out;
857  int ret;
859  int64_t pts;
860 
861  if (link->closed) {
862  av_frame_free(&frame);
863  return AVERROR_EOF;
864  }
865 
866  if (!(filter_frame = dst->filter_frame))
868 
869  /* copy the frame if needed */
870  if (dst->needs_writable && !av_frame_is_writable(frame)) {
871  av_log(link->dst, AV_LOG_DEBUG, "Copying data in avfilter.\n");
872 
873  /* Maybe use ff_copy_buffer_ref instead? */
874  switch (link->type) {
875  case AVMEDIA_TYPE_VIDEO:
876  out = ff_get_video_buffer(link, link->w, link->h);
877  break;
878  case AVMEDIA_TYPE_AUDIO:
879  out = ff_get_audio_buffer(link, frame->nb_samples);
880  break;
881  default: return AVERROR(EINVAL);
882  }
883  if (!out) {
884  av_frame_free(&frame);
885  return AVERROR(ENOMEM);
886  }
887  av_frame_copy_props(out, frame);
888 
889  switch (link->type) {
890  case AVMEDIA_TYPE_VIDEO:
891  av_image_copy(out->data, out->linesize, (const uint8_t **)frame->data, frame->linesize,
892  frame->format, frame->width, frame->height);
893  break;
894  case AVMEDIA_TYPE_AUDIO:
896  0, 0, frame->nb_samples,
898  frame->format);
899  break;
900  default: return AVERROR(EINVAL);
901  }
902 
903  av_frame_free(&frame);
904  } else
905  out = frame;
906 
907  while(cmd && cmd->time <= out->pts * av_q2d(link->time_base)){
908  av_log(link->dst, AV_LOG_DEBUG,
909  "Processing command time:%f command:%s arg:%s\n",
910  cmd->time, cmd->command, cmd->arg);
911  avfilter_process_command(link->dst, cmd->command, cmd->arg, 0, 0, cmd->flags);
912  ff_command_queue_pop(link->dst);
913  cmd= link->dst->command_queue;
914  }
915 
916  pts = out->pts;
917  ret = filter_frame(link, out);
918  link->frame_requested = 0;
919  ff_update_link_current_pts(link, pts);
920  return ret;
921 }
922 
924 {
925  int insamples = frame->nb_samples, inpos = 0, nb_samples;
926  AVFrame *pbuf = link->partial_buf;
927  int nb_channels = av_frame_get_channels(frame);
928  int ret = 0;
929 
931  /* Handle framing (min_samples, max_samples) */
932  while (insamples) {
933  if (!pbuf) {
934  AVRational samples_tb = { 1, link->sample_rate };
935  pbuf = ff_get_audio_buffer(link, link->partial_buf_size);
936  if (!pbuf) {
937  av_log(link->dst, AV_LOG_WARNING,
938  "Samples dropped due to memory allocation failure.\n");
939  return 0;
940  }
941  av_frame_copy_props(pbuf, frame);
942  pbuf->pts = frame->pts +
943  av_rescale_q(inpos, samples_tb, link->time_base);
944  pbuf->nb_samples = 0;
945  }
946  nb_samples = FFMIN(insamples,
947  link->partial_buf_size - pbuf->nb_samples);
949  pbuf->nb_samples, inpos,
950  nb_samples, nb_channels, link->format);
951  inpos += nb_samples;
952  insamples -= nb_samples;
953  pbuf->nb_samples += nb_samples;
954  if (pbuf->nb_samples >= link->min_samples) {
955  ret = ff_filter_frame_framed(link, pbuf);
956  pbuf = NULL;
957  }
958  }
959  av_frame_free(&frame);
960  link->partial_buf = pbuf;
961  return ret;
962 }
963 
965 {
967 
968  /* Consistency checks */
969  if (link->type == AVMEDIA_TYPE_VIDEO) {
970  if (strcmp(link->dst->filter->name, "scale")) {
971  av_assert1(frame->format == link->format);
972  av_assert1(frame->width == link->w);
973  av_assert1(frame->height == link->h);
974  }
975  } else {
976  av_assert1(frame->format == link->format);
977  av_assert1(av_frame_get_channels(frame) == link->channels);
978  av_assert1(frame->channel_layout == link->channel_layout);
979  av_assert1(frame->sample_rate == link->sample_rate);
980  }
981 
982  /* Go directly to actual filtering if possible */
983  if (link->type == AVMEDIA_TYPE_AUDIO &&
984  link->min_samples &&
985  (link->partial_buf ||
986  frame->nb_samples < link->min_samples ||
987  frame->nb_samples > link->max_samples)) {
988  return ff_filter_frame_needs_framing(link, frame);
989  } else {
990  return ff_filter_frame_framed(link, frame);
991  }
992 }
993 
995 {
996  return &avfilter_class;
997 }
const char * name
Definition: avisynth_c.h:675
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
void ff_tlog_ref(void *ctx, AVFrame *ref, int end)
Definition: avfilter.c:40
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:424
void avfilter_link_set_closed(AVFilterLink *link, int closed)
Set the closed field of a link.
Definition: avfilter.c:160
AVFilterContext * ff_filter_alloc(const AVFilter *filter, const char *inst_name)
Allocate a new filter context and return it.
Definition: avfilter.c:495
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
FIXME Range Coding of cr are ref
Definition: snow.txt:367
static int default_filter_frame(AVFilterLink *link, AVFrame *frame)
Definition: avfilter.c:847
AVOption.
Definition: opt.h:251
void avfilter_free(AVFilterContext *filter)
Free a filter context.
Definition: avfilter.c:568
misc image utilities
int av_escape(char **dst, const char *src, const char *special_chars, enum AVEscapeMode mode, int flags)
Escape string in src, and put the escaped string in an allocated string in *dst, which must be freed ...
Definition: avstring.c:271
external API header
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition: frame.h:343
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
void ff_channel_layouts_changeref(AVFilterChannelLayouts **oldref, AVFilterChannelLayouts **newref)
Definition: formats.c:491
void av_opt_set_defaults(void *s)
Set the values of all AVOption fields to their default values.
Definition: opt.c:942
enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx)
Get the type of an AVFilterPad.
Definition: avfilter.c:842
int num
numerator
Definition: rational.h:44
Sinusoidal phase f
Use backslash escaping.
Definition: avstring.h:258
enum AVMediaType type
AVFilterPad type.
#define LIBAVFILTER_VERSION_INT
void * av_realloc(void *ptr, size_t size)
Allocate or reallocate a block of memory.
Definition: mem.c:141
Accept to parse a value without a key; the key will then be returned as NULL.
Definition: opt.h:511
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition: video.c:143
AVDictionaryEntry * av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:39
void(* uninit)(AVFilterContext *ctx)
Filter uninitialization function.
Definition: avfilter.h:485
#define FFMPEG_LICENSE
Definition: config.h:5
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
struct AVFilterGraph * graph
filtergraph this filter belongs to
Definition: avfilter.h:547
int(* init_dict)(AVFilterContext *ctx, AVDictionary **options)
Should be set instead of init by the filters that want to pass a dictionary of AVOptions to nested co...
Definition: avfilter.h:478
const char * name
Pad name.
int priv_size
size of private data to allocate for the filter
Definition: avfilter.h:497
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:55
AVFilterLink ** inputs
array of pointers to input links
Definition: avfilter.h:532
char * name
name of this filter instance
Definition: avfilter.h:529
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
const char * name
Definition: opt.h:252
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:964
int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad)
Link two filters together.
Definition: avfilter.c:114
AVFilterPad * output_pads
array of output pads
Definition: avfilter.h:538
const char * avfilter_license(void)
Return the libavfilter license.
Definition: avfilter.c:78
uint8_t
AVOptions.
int(* poll_frame)(AVFilterLink *link)
Frame poll callback.
end end
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:159
void ff_command_queue_pop(AVFilterContext *filter)
Definition: avfilter.c:84
the mask is usually to keep the same permissions Filters should remove permissions on reference they give to output whenever necessary It can be automatically done by setting the rej_perms field on the output pad Here are a few guidelines corresponding to common then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
static double av_q2d(AVRational a)
Convert rational to double.
Definition: rational.h:69
int avfilter_config_links(AVFilterContext *filter)
Negotiate the media format, dimensions, etc of all inputs to a filter.
Definition: avfilter.c:203
char av_get_picture_type_char(enum AVPictureType pict_type)
Return a single letter to describe the given picture type pict_type.
const AVFilter * avfilter_next(const AVFilter *prev)
Iterate over all registered filters.
Definition: avfilter.c:424
#define AVERROR_EOF
End of file.
Definition: error.h:55
int interlaced_frame
The content of the picture is interlaced.
Definition: frame.h:270
static void copy(LZOContext *c, int cnt)
Copies bytes from input to output buffer with checking.
Definition: lzo.c:79
const OptionDef options[]
Definition: ffserver.c:4697
frame
Definition: stft.m:14
A filter pad used for either input or output.
void ff_update_link_current_pts(AVFilterLink *link, int64_t pts)
Definition: avfilter.c:368
static void * av_x_if_null(const void *p, const void *x)
Return x default pointer in case p is NULL.
Definition: avutil.h:250
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:130
static const AVClass avfilter_class
Definition: avfilter.c:486
AVFilterPad * input_pads
array of input pads
Definition: avfilter.h:531
int width
width and height of the video frame
Definition: frame.h:122
void ff_formats_changeref(AVFilterFormats **oldref, AVFilterFormats **newref)
Before After |formats |<------—.
Definition: formats.c:497
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
static const char * default_filter_name(void *filter_ctx)
Definition: avfilter.c:451
AVFrame * ff_get_audio_buffer(AVFilterLink *link, int nb_samples)
Request an audio samples buffer with a specific set of permissions.
Definition: audio.c:84
int avfilter_link_get_channels(AVFilterLink *link)
Get the number of channels of a link.
Definition: avfilter.c:155
unsigned nb_outputs
number of output pads
Definition: avfilter.h:543
unsigned avfilter_version(void)
Return the LIBAVFILTER_VERSION_INT constant.
Definition: avfilter.c:68
void * priv
private data for use by the filter
Definition: avfilter.h:545
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values. ...
Definition: dict.c:162
int av_get_channel_layout_nb_channels(uint64_t channel_layout)
Return the number of channels in the channel layout.
const char * arg
const AVOption * av_opt_next(void *obj, const AVOption *last)
Iterate over all AVOptions belonging to obj.
Definition: opt.c:63
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 the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame This method is called when a frame is wanted on an output For an input
int av_frame_is_writable(AVFrame *frame)
Check if the frame data is writable.
Definition: frame.c:361
simple assert() macros that are a bit more flexible than ISO C assert().
#define FF_TPRINTF_START(ctx, func)
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
static const uint8_t offset[127][2]
Definition: vf_spp.c:70
void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4], const uint8_t *src_data[4], const int src_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height)
Copy image in src_data to dst_data.
Definition: imgutils.c:257
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a link
uint64_t channel_layout
Channel layout of the audio data.
Definition: frame.h:331
const AVOption * av_opt_find(void *obj, const char *name, const char *unit, int opt_flags, int search_flags)
Look for an option in an object.
Definition: opt.c:1223
#define AV_LOG_VERBOSE
Definition: log.h:157
static void * filter_child_next(void *obj, void *prev)
Definition: avfilter.c:457
static int request_frame(AVFilterLink *outlink)
Definition: af_amerge.c:172
struct AVRational AVRational
rational number numerator/denominator
int(* config_props)(AVFilterLink *link)
Link configuration callback.
audio channel layout utility functions
int av_frame_get_channels(const AVFrame *frame)
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:144
unsigned nb_inputs
number of input pads
Definition: avfilter.h:536
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:53
#define FFMIN(a, b)
Definition: common.h:58
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition: opt.h:538
static AVFilter * first_filter
Definition: avfilter.c:389
struct AVFilterCommand * next
ret
Definition: avfilter.c:821
#define ff_tlog(pctx,...)
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:110
int(* init)(AVFilterContext *ctx)
Filter initialization function.
Definition: avfilter.h:471
static int ff_filter_frame_needs_framing(AVFilterLink *link, AVFrame *frame)
Definition: avfilter.c:923
const char * av_get_sample_fmt_name(enum AVSampleFormat sample_fmt)
Return the name of sample_fmt, or NULL if sample_fmt is not recognized.
Definition: samplefmt.c:47
LIBAVUTIL_VERSION_INT
Definition: eval.c:55
int avfilter_init_str(AVFilterContext *filter, const char *args)
Initialize a filter with the supplied parameters.
Definition: avfilter.c:715
const AVFilterPad * inputs
NULL terminated list of inputs. NULL if none.
Definition: avfilter.h:445
const AVClass * avfilter_get_class(void)
Definition: avfilter.c:994
int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt, unsigned filt_srcpad_idx, unsigned filt_dstpad_idx)
Insert a filter in the middle of an existing link.
Definition: avfilter.c:165
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames...
Definition: frame.h:134
NULL
Definition: eval.c:55
const AVClass * priv_class
A class for the private data, used to access filter private AVOptions.
Definition: avfilter.h:452
AVS_Value src
Definition: avisynth_c.h:523
int offset
The offset relative to the context structure where the option value is stored.
Definition: opt.h:264
void ff_tlog_link(void *ctx, AVFilterLink *link, int end)
Definition: avfilter.c:295
int(* process_command)(AVFilterContext *, const char *cmd, const char *arg, char *res, int res_len, int flags)
Make the filter instance process a command.
Definition: avfilter.h:513
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:202
int av_opt_set_dict(void *obj, AVDictionary **options)
Set all the options from a given dictionary on an object.
Definition: opt.c:1202
char * av_strdup(const char *s)
Duplicate the string s.
Definition: mem.c:220
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
AVRational sample_aspect_ratio
Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
Definition: frame.h:154
void ff_avfilter_graph_update_heap(AVFilterGraph *graph, AVFilterLink *link)
Update the position of a link in the age heap.
int av_samples_copy(uint8_t **dst, uint8_t *const *src, int dst_offset, int src_offset, int nb_samples, int nb_channels, enum AVSampleFormat sample_fmt)
Copy samples from src to dst.
Definition: samplefmt.c:225
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
void ff_channel_layouts_unref(AVFilterChannelLayouts **ref)
Remove a reference to a channel layouts list.
Definition: formats.c:473
int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags)
Make the filter instance process a command.
Definition: avfilter.c:378
void * buf
Definition: avisynth_c.h:594
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:62
double value
Definition: eval.c:82
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
Describe the class of an AVClass context structure.
Definition: log.h:50
int sample_rate
Sample rate of the audio data.
Definition: frame.h:326
Filter definition.
Definition: avfilter.h:436
synthesis window for stochastic i
rational number numerator/denominator
Definition: rational.h:43
struct AVFilter * next
Definition: avfilter.h:499
AVMediaType
Definition: avutil.h:141
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
Definition: avstring.c:100
void ff_formats_unref(AVFilterFormats **ref)
If *ref is non-NULL, remove *ref as a reference to the format list it currently points to...
Definition: formats.c:468
const char * name
filter name
Definition: avfilter.h:437
const char * avfilter_configuration(void)
Return the libavfilter build-time configuration.
Definition: avfilter.c:73
const char * avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx)
Get the name of an AVFilterPad.
Definition: avfilter.c:837
#define LICENSE_PREFIX
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
AVFilterLink ** outputs
array of pointers to output links
Definition: avfilter.h:539
static const int8_t filt[NUMTAPS]
Definition: af_earwax.c:39
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
static int flags
Definition: cpu.c:23
int(* filter_frame)(AVFilterLink *link, AVFrame *frame)
Filtering callback.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
int(* init_opaque)(AVFilterContext *ctx, void *opaque)
Filter initialization function, alternative to the init() callback.
Definition: avfilter.h:520
int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options)
Initialize a filter with the supplied dictionary of options.
Definition: avfilter.c:693
void av_opt_free(void *obj)
Free all string and binary options in obj.
Definition: opt.c:1194
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
common internal and external API header
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output links
rational numbers
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:108
static double c[64]
struct AVFilterCommand * command_queue
Definition: avfilter.h:549
#define AV_OPT_SEARCH_FAKE_OBJ
The obj passed to av_opt_find() is fake – only a double pointer to AVClass instead of a required poi...
Definition: opt.h:547
char * key
Definition: dict.h:81
int den
denominator
Definition: rational.h:45
static int filter_frame(AVFilterLink *inlink, AVFrame *insamplesref)
Definition: af_aconvert.c:140
#define FFMPEG_CONFIGURATION
Definition: config.h:4
void ff_filter_graph_remove_filter(AVFilterGraph *graph, AVFilterContext *filter)
Remove a filter from a graph;.
Definition: avfiltergraph.c:62
#define AVERROR_OPTION_NOT_FOUND
Option not found.
Definition: error.h:61
int avfilter_register(AVFilter *filter)
Register a filter.
Definition: avfilter.c:405
int top_field_first
If the content is interlaced, is top field displayed first.
Definition: frame.h:275
enum AVOptionType type
Definition: opt.h:265
int av_opt_get_key_value(const char **ropts, const char *key_val_sep, const char *pairs_sep, unsigned flags, char **rkey, char **rval)
Extract a key-value pair from the beginning of a string.
Definition: opt.c:1120
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
const AVClass * av_class
needed for av_log()
Definition: avfilter.h:525
static int ff_filter_frame_framed(AVFilterLink *link, AVFrame *frame)
Definition: avfilter.c:852
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:139
int64_t av_frame_get_pkt_pos(const AVFrame *frame)
int(* request_frame)(AVFilterLink *link)
Frame request callback.
An instance of a filter.
Definition: avfilter.h:524
#define av_uninit(x)
Definition: attributes.h:137
int avfilter_pad_count(const AVFilterPad *pads)
Get the number of elements in a NULL-terminated array of AVFilterPads (e.g.
Definition: avfilter.c:440
int height
Definition: frame.h:122
#define AV_LOG_INFO
Definition: log.h:156
const AVFilterPad * outputs
NULL terminated list of outputs. NULL if none.
Definition: avfilter.h:446
void INT64 INT64 count
Definition: avisynth_c.h:594
#define AV_DICT_IGNORE_SUFFIX
Definition: dict.h:68
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
void ff_insert_pad(unsigned idx, unsigned *count, size_t padidx_off, AVFilterPad **pads, AVFilterLink ***links, AVFilterPad *newpad)
Insert a new pad.
Definition: avfilter.c:93
double time
time expressed in seconds
int ff_request_frame(AVFilterLink *link)
Request an input frame from the filter at the other end of the link.
Definition: avfilter.c:319
int nb_channels
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:1700
static const AVClass * filter_child_class_next(const AVClass *prev)
Definition: avfilter.c:465
internal API functions
AVFilter * avfilter_get_by_name(const char *name)
Get a filter definition matching the given name.
Definition: avfilter.c:391
uint8_t ** extended_data
pointers to the data planes/channels.
Definition: frame.h:117
int ff_poll_frame(AVFilterLink *link)
Poll a frame from the filter chain.
Definition: avfilter.c:350
float min
Frame requests may need to loop in order to be fulfilled.
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
void avfilter_link_free(AVFilterLink **link)
Free the link in *link, and set its pointer to NULL.
Definition: avfilter.c:145
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
Definition: opt.c:252
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:127
const AVFilter * filter
the AVFilter of which this is an instance
Definition: avfilter.h:527
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:190
char * command
command
#define av_unused
Definition: attributes.h:114
static int process_options(AVFilterContext *ctx, AVDictionary **options, const char *args)
Definition: avfilter.c:624
void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout)
Return a description of a channel layout.
char * arg
optional argument for the command
#define LIBAVFILTER_VERSION_MICRO