FFmpeg
ffmpeg_filter.c
Go to the documentation of this file.
1 /*
2  * ffmpeg filter configuration
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include <stdint.h>
22 
23 #include "ffmpeg.h"
24 
25 #include "libavfilter/avfilter.h"
26 #include "libavfilter/buffersink.h"
27 #include "libavfilter/buffersrc.h"
28 
30 
31 #include "libavutil/avassert.h"
32 #include "libavutil/avstring.h"
33 #include "libavutil/bprint.h"
35 #include "libavutil/display.h"
36 #include "libavutil/opt.h"
37 #include "libavutil/pixdesc.h"
38 #include "libavutil/pixfmt.h"
39 #include "libavutil/imgutils.h"
40 #include "libavutil/samplefmt.h"
41 
42 static const enum AVPixelFormat *get_compliance_unofficial_pix_fmts(enum AVCodecID codec_id, const enum AVPixelFormat default_formats[])
43 {
44  static const enum AVPixelFormat mjpeg_formats[] =
48  static const enum AVPixelFormat ljpeg_formats[] =
53 
54  if (codec_id == AV_CODEC_ID_MJPEG) {
55  return mjpeg_formats;
56  } else if (codec_id == AV_CODEC_ID_LJPEG) {
57  return ljpeg_formats;
58  } else {
59  return default_formats;
60  }
61 }
62 
64 {
65  if (codec && codec->pix_fmts) {
66  const enum AVPixelFormat *p = codec->pix_fmts;
68  //FIXME: This should check for AV_PIX_FMT_FLAG_ALPHA after PAL8 pixel format without alpha is implemented
69  int has_alpha = desc ? desc->nb_components % 2 == 0 : 0;
70  enum AVPixelFormat best= AV_PIX_FMT_NONE;
71 
74  }
75  for (; *p != AV_PIX_FMT_NONE; p++) {
76  best= avcodec_find_best_pix_fmt_of_2(best, *p, target, has_alpha, NULL);
77  if (*p == target)
78  break;
79  }
80  if (*p == AV_PIX_FMT_NONE) {
81  if (target != AV_PIX_FMT_NONE)
83  "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
84  av_get_pix_fmt_name(target),
85  codec->name,
86  av_get_pix_fmt_name(best));
87  return best;
88  }
89  }
90  return target;
91 }
92 
94 {
95  if (codec && codec->sample_fmts) {
96  const enum AVSampleFormat *p = codec->sample_fmts;
97  for (; *p != -1; p++) {
98  if (*p == st->codecpar->format)
99  break;
100  }
101  if (*p == -1) {
103  av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
106  "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
108  codec->name,
110  st->codecpar->format = codec->sample_fmts[0];
111  }
112  }
113 }
114 
115 static char *choose_pix_fmts(OutputFilter *ofilter)
116 {
117  OutputStream *ost = ofilter->ost;
118  AVDictionaryEntry *strict_dict = av_dict_get(ost->encoder_opts, "strict", NULL, 0);
119  if (strict_dict)
120  // used by choose_pixel_fmt() and below
121  av_opt_set(ost->enc_ctx, "strict", strict_dict->value, 0);
122 
123  if (ost->keep_pix_fmt) {
126  if (ost->enc_ctx->pix_fmt == AV_PIX_FMT_NONE)
127  return NULL;
128  return av_strdup(av_get_pix_fmt_name(ost->enc_ctx->pix_fmt));
129  }
130  if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
131  return av_strdup(av_get_pix_fmt_name(choose_pixel_fmt(ost->st, ost->enc_ctx, ost->enc, ost->enc_ctx->pix_fmt)));
132  } else if (ost->enc && ost->enc->pix_fmts) {
133  const enum AVPixelFormat *p;
134  AVIOContext *s = NULL;
135  uint8_t *ret;
136  int len;
137 
138  if (avio_open_dyn_buf(&s) < 0)
139  exit_program(1);
140 
141  p = ost->enc->pix_fmts;
142  if (ost->enc_ctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
143  p = get_compliance_unofficial_pix_fmts(ost->enc_ctx->codec_id, p);
144  }
145 
146  for (; *p != AV_PIX_FMT_NONE; p++) {
147  const char *name = av_get_pix_fmt_name(*p);
148  avio_printf(s, "%s|", name);
149  }
151  ret[len - 1] = 0;
152  return ret;
153  } else
154  return NULL;
155 }
156 
157 /* Define a function for building a string containing a list of
158  * allowed formats. */
159 #define DEF_CHOOSE_FORMAT(suffix, type, var, supported_list, none, get_name) \
160 static char *choose_ ## suffix (OutputFilter *ofilter) \
161 { \
162  if (ofilter->var != none) { \
163  get_name(ofilter->var); \
164  return av_strdup(name); \
165  } else if (ofilter->supported_list) { \
166  const type *p; \
167  AVIOContext *s = NULL; \
168  uint8_t *ret; \
169  int len; \
170  \
171  if (avio_open_dyn_buf(&s) < 0) \
172  exit_program(1); \
173  \
174  for (p = ofilter->supported_list; *p != none; p++) { \
175  get_name(*p); \
176  avio_printf(s, "%s|", name); \
177  } \
178  len = avio_close_dyn_buf(s, &ret); \
179  ret[len - 1] = 0; \
180  return ret; \
181  } else \
182  return NULL; \
183 }
184 
185 //DEF_CHOOSE_FORMAT(pix_fmts, enum AVPixelFormat, format, formats, AV_PIX_FMT_NONE,
186 // GET_PIX_FMT_NAME)
187 
190 
193 
194 DEF_CHOOSE_FORMAT(channel_layouts, uint64_t, channel_layout, channel_layouts, 0,
196 
198 {
199  FilterGraph *fg = av_mallocz(sizeof(*fg));
200 
201  if (!fg)
202  exit_program(1);
203  fg->index = nb_filtergraphs;
204 
205  GROW_ARRAY(fg->outputs, fg->nb_outputs);
206  if (!(fg->outputs[0] = av_mallocz(sizeof(*fg->outputs[0]))))
207  exit_program(1);
208  fg->outputs[0]->ost = ost;
209  fg->outputs[0]->graph = fg;
210  fg->outputs[0]->format = -1;
211 
212  ost->filter = fg->outputs[0];
213 
214  GROW_ARRAY(fg->inputs, fg->nb_inputs);
215  if (!(fg->inputs[0] = av_mallocz(sizeof(*fg->inputs[0]))))
216  exit_program(1);
217  fg->inputs[0]->ist = ist;
218  fg->inputs[0]->graph = fg;
219  fg->inputs[0]->format = -1;
220 
221  fg->inputs[0]->frame_queue = av_fifo_alloc(8 * sizeof(AVFrame*));
222  if (!fg->inputs[0]->frame_queue)
223  exit_program(1);
224 
225  GROW_ARRAY(ist->filters, ist->nb_filters);
226  ist->filters[ist->nb_filters - 1] = fg->inputs[0];
227 
229  filtergraphs[nb_filtergraphs - 1] = fg;
230 
231  return 0;
232 }
233 
234 static char *describe_filter_link(FilterGraph *fg, AVFilterInOut *inout, int in)
235 {
236  AVFilterContext *ctx = inout->filter_ctx;
237  AVFilterPad *pads = in ? ctx->input_pads : ctx->output_pads;
238  int nb_pads = in ? ctx->nb_inputs : ctx->nb_outputs;
239  AVIOContext *pb;
240  uint8_t *res = NULL;
241 
242  if (avio_open_dyn_buf(&pb) < 0)
243  exit_program(1);
244 
245  avio_printf(pb, "%s", ctx->filter->name);
246  if (nb_pads > 1)
247  avio_printf(pb, ":%s", avfilter_pad_get_name(pads, inout->pad_idx));
248  avio_w8(pb, 0);
249  avio_close_dyn_buf(pb, &res);
250  return res;
251 }
252 
254 {
255  InputStream *ist = NULL;
256  enum AVMediaType type = avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx);
257  int i;
258 
259  // TODO: support other filter types
261  av_log(NULL, AV_LOG_FATAL, "Only video and audio filters supported "
262  "currently.\n");
263  exit_program(1);
264  }
265 
266  if (in->name) {
268  AVStream *st = NULL;
269  char *p;
270  int file_idx = strtol(in->name, &p, 0);
271 
272  if (file_idx < 0 || file_idx >= nb_input_files) {
273  av_log(NULL, AV_LOG_FATAL, "Invalid file index %d in filtergraph description %s.\n",
274  file_idx, fg->graph_desc);
275  exit_program(1);
276  }
277  s = input_files[file_idx]->ctx;
278 
279  for (i = 0; i < s->nb_streams; i++) {
280  enum AVMediaType stream_type = s->streams[i]->codecpar->codec_type;
281  if (stream_type != type &&
282  !(stream_type == AVMEDIA_TYPE_SUBTITLE &&
283  type == AVMEDIA_TYPE_VIDEO /* sub2video hack */))
284  continue;
285  if (check_stream_specifier(s, s->streams[i], *p == ':' ? p + 1 : p) == 1) {
286  st = s->streams[i];
287  break;
288  }
289  }
290  if (!st) {
291  av_log(NULL, AV_LOG_FATAL, "Stream specifier '%s' in filtergraph description %s "
292  "matches no streams.\n", p, fg->graph_desc);
293  exit_program(1);
294  }
295  ist = input_streams[input_files[file_idx]->ist_index + st->index];
296  if (ist->user_set_discard == AVDISCARD_ALL) {
297  av_log(NULL, AV_LOG_FATAL, "Stream specifier '%s' in filtergraph description %s "
298  "matches a disabled input stream.\n", p, fg->graph_desc);
299  exit_program(1);
300  }
301  } else {
302  /* find the first unused stream of corresponding type */
303  for (i = 0; i < nb_input_streams; i++) {
304  ist = input_streams[i];
305  if (ist->user_set_discard == AVDISCARD_ALL)
306  continue;
307  if (ist->dec_ctx->codec_type == type && ist->discard)
308  break;
309  }
310  if (i == nb_input_streams) {
311  av_log(NULL, AV_LOG_FATAL, "Cannot find a matching stream for "
312  "unlabeled input pad %d on filter %s\n", in->pad_idx,
313  in->filter_ctx->name);
314  exit_program(1);
315  }
316  }
317  av_assert0(ist);
318 
319  ist->discard = 0;
321  ist->st->discard = AVDISCARD_NONE;
322 
323  GROW_ARRAY(fg->inputs, fg->nb_inputs);
324  if (!(fg->inputs[fg->nb_inputs - 1] = av_mallocz(sizeof(*fg->inputs[0]))))
325  exit_program(1);
326  fg->inputs[fg->nb_inputs - 1]->ist = ist;
327  fg->inputs[fg->nb_inputs - 1]->graph = fg;
328  fg->inputs[fg->nb_inputs - 1]->format = -1;
329  fg->inputs[fg->nb_inputs - 1]->type = ist->st->codecpar->codec_type;
330  fg->inputs[fg->nb_inputs - 1]->name = describe_filter_link(fg, in, 1);
331 
332  fg->inputs[fg->nb_inputs - 1]->frame_queue = av_fifo_alloc(8 * sizeof(AVFrame*));
333  if (!fg->inputs[fg->nb_inputs - 1]->frame_queue)
334  exit_program(1);
335 
336  GROW_ARRAY(ist->filters, ist->nb_filters);
337  ist->filters[ist->nb_filters - 1] = fg->inputs[fg->nb_inputs - 1];
338 }
339 
341 {
342  AVFilterInOut *inputs, *outputs, *cur;
343  AVFilterGraph *graph;
344  int ret = 0;
345 
346  /* this graph is only used for determining the kinds of inputs
347  * and outputs we have, and is discarded on exit from this function */
348  graph = avfilter_graph_alloc();
349  if (!graph)
350  return AVERROR(ENOMEM);
351  graph->nb_threads = 1;
352 
354  if (ret < 0)
355  goto fail;
356 
357  for (cur = inputs; cur; cur = cur->next)
358  init_input_filter(fg, cur);
359 
360  for (cur = outputs; cur;) {
361  GROW_ARRAY(fg->outputs, fg->nb_outputs);
362  fg->outputs[fg->nb_outputs - 1] = av_mallocz(sizeof(*fg->outputs[0]));
363  if (!fg->outputs[fg->nb_outputs - 1])
364  exit_program(1);
365 
366  fg->outputs[fg->nb_outputs - 1]->graph = fg;
367  fg->outputs[fg->nb_outputs - 1]->out_tmp = cur;
369  cur->pad_idx);
370  fg->outputs[fg->nb_outputs - 1]->name = describe_filter_link(fg, cur, 0);
371  cur = cur->next;
372  fg->outputs[fg->nb_outputs - 1]->out_tmp->next = NULL;
373  }
374 
375 fail:
377  avfilter_graph_free(&graph);
378  return ret;
379 }
380 
381 static int insert_trim(int64_t start_time, int64_t duration,
382  AVFilterContext **last_filter, int *pad_idx,
383  const char *filter_name)
384 {
385  AVFilterGraph *graph = (*last_filter)->graph;
387  const AVFilter *trim;
388  enum AVMediaType type = avfilter_pad_get_type((*last_filter)->output_pads, *pad_idx);
389  const char *name = (type == AVMEDIA_TYPE_VIDEO) ? "trim" : "atrim";
390  int ret = 0;
391 
392  if (duration == INT64_MAX && start_time == AV_NOPTS_VALUE)
393  return 0;
394 
395  trim = avfilter_get_by_name(name);
396  if (!trim) {
397  av_log(NULL, AV_LOG_ERROR, "%s filter not present, cannot limit "
398  "recording time.\n", name);
400  }
401 
402  ctx = avfilter_graph_alloc_filter(graph, trim, filter_name);
403  if (!ctx)
404  return AVERROR(ENOMEM);
405 
406  if (duration != INT64_MAX) {
407  ret = av_opt_set_int(ctx, "durationi", duration,
409  }
410  if (ret >= 0 && start_time != AV_NOPTS_VALUE) {
411  ret = av_opt_set_int(ctx, "starti", start_time,
413  }
414  if (ret < 0) {
415  av_log(ctx, AV_LOG_ERROR, "Error configuring the %s filter", name);
416  return ret;
417  }
418 
420  if (ret < 0)
421  return ret;
422 
423  ret = avfilter_link(*last_filter, *pad_idx, ctx, 0);
424  if (ret < 0)
425  return ret;
426 
427  *last_filter = ctx;
428  *pad_idx = 0;
429  return 0;
430 }
431 
432 static int insert_filter(AVFilterContext **last_filter, int *pad_idx,
433  const char *filter_name, const char *args)
434 {
435  AVFilterGraph *graph = (*last_filter)->graph;
437  int ret;
438 
440  avfilter_get_by_name(filter_name),
441  filter_name, args, NULL, graph);
442  if (ret < 0)
443  return ret;
444 
445  ret = avfilter_link(*last_filter, *pad_idx, ctx, 0);
446  if (ret < 0)
447  return ret;
448 
449  *last_filter = ctx;
450  *pad_idx = 0;
451  return 0;
452 }
453 
455 {
456  char *pix_fmts;
457  OutputStream *ost = ofilter->ost;
458  OutputFile *of = output_files[ost->file_index];
459  AVFilterContext *last_filter = out->filter_ctx;
460  int pad_idx = out->pad_idx;
461  int ret;
462  char name[255];
463 
464  snprintf(name, sizeof(name), "out_%d_%d", ost->file_index, ost->index);
466  avfilter_get_by_name("buffersink"),
467  name, NULL, NULL, fg->graph);
468 
469  if (ret < 0)
470  return ret;
471 
472  if (ofilter->width || ofilter->height) {
473  char args[255];
475  AVDictionaryEntry *e = NULL;
476 
477  snprintf(args, sizeof(args), "%d:%d",
478  ofilter->width, ofilter->height);
479 
480  while ((e = av_dict_get(ost->sws_dict, "", e,
482  av_strlcatf(args, sizeof(args), ":%s=%s", e->key, e->value);
483  }
484 
485  snprintf(name, sizeof(name), "scaler_out_%d_%d",
486  ost->file_index, ost->index);
488  name, args, NULL, fg->graph)) < 0)
489  return ret;
490  if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
491  return ret;
492 
493  last_filter = filter;
494  pad_idx = 0;
495  }
496 
497  if ((pix_fmts = choose_pix_fmts(ofilter))) {
499  snprintf(name, sizeof(name), "format_out_%d_%d",
500  ost->file_index, ost->index);
502  avfilter_get_by_name("format"),
503  "format", pix_fmts, NULL, fg->graph);
504  av_freep(&pix_fmts);
505  if (ret < 0)
506  return ret;
507  if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
508  return ret;
509 
510  last_filter = filter;
511  pad_idx = 0;
512  }
513 
514  if (ost->frame_rate.num && 0) {
515  AVFilterContext *fps;
516  char args[255];
517 
518  snprintf(args, sizeof(args), "fps=%d/%d", ost->frame_rate.num,
519  ost->frame_rate.den);
520  snprintf(name, sizeof(name), "fps_out_%d_%d",
521  ost->file_index, ost->index);
523  name, args, NULL, fg->graph);
524  if (ret < 0)
525  return ret;
526 
527  ret = avfilter_link(last_filter, pad_idx, fps, 0);
528  if (ret < 0)
529  return ret;
530  last_filter = fps;
531  pad_idx = 0;
532  }
533 
534  snprintf(name, sizeof(name), "trim_out_%d_%d",
535  ost->file_index, ost->index);
537  &last_filter, &pad_idx, name);
538  if (ret < 0)
539  return ret;
540 
541 
542  if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
543  return ret;
544 
545  return 0;
546 }
547 
549 {
550  OutputStream *ost = ofilter->ost;
551  OutputFile *of = output_files[ost->file_index];
552  AVCodecContext *codec = ost->enc_ctx;
553  AVFilterContext *last_filter = out->filter_ctx;
554  int pad_idx = out->pad_idx;
556  char name[255];
557  int ret;
558 
559  snprintf(name, sizeof(name), "out_%d_%d", ost->file_index, ost->index);
561  avfilter_get_by_name("abuffersink"),
562  name, NULL, NULL, fg->graph);
563  if (ret < 0)
564  return ret;
565  if ((ret = av_opt_set_int(ofilter->filter, "all_channel_counts", 1, AV_OPT_SEARCH_CHILDREN)) < 0)
566  return ret;
567 
568 #define AUTO_INSERT_FILTER(opt_name, filter_name, arg) do { \
569  AVFilterContext *filt_ctx; \
570  \
571  av_log(NULL, AV_LOG_INFO, opt_name " is forwarded to lavfi " \
572  "similarly to -af " filter_name "=%s.\n", arg); \
573  \
574  ret = avfilter_graph_create_filter(&filt_ctx, \
575  avfilter_get_by_name(filter_name), \
576  filter_name, arg, NULL, fg->graph); \
577  if (ret < 0) \
578  return ret; \
579  \
580  ret = avfilter_link(last_filter, pad_idx, filt_ctx, 0); \
581  if (ret < 0) \
582  return ret; \
583  \
584  last_filter = filt_ctx; \
585  pad_idx = 0; \
586 } while (0)
587  if (ost->audio_channels_mapped) {
588  int i;
589  AVBPrint pan_buf;
590  av_bprint_init(&pan_buf, 256, 8192);
591  av_bprintf(&pan_buf, "0x%"PRIx64,
592  av_get_default_channel_layout(ost->audio_channels_mapped));
593  for (i = 0; i < ost->audio_channels_mapped; i++)
594  if (ost->audio_channels_map[i] != -1)
595  av_bprintf(&pan_buf, "|c%d=c%d", i, ost->audio_channels_map[i]);
596 
597  AUTO_INSERT_FILTER("-map_channel", "pan", pan_buf.str);
598  av_bprint_finalize(&pan_buf, NULL);
599  }
600 
601  if (codec->channels && !codec->channel_layout)
603 
604  sample_fmts = choose_sample_fmts(ofilter);
605  sample_rates = choose_sample_rates(ofilter);
606  channel_layouts = choose_channel_layouts(ofilter);
609  char args[256];
610  args[0] = 0;
611 
612  if (sample_fmts)
613  av_strlcatf(args, sizeof(args), "sample_fmts=%s:",
614  sample_fmts);
615  if (sample_rates)
616  av_strlcatf(args, sizeof(args), "sample_rates=%s:",
617  sample_rates);
618  if (channel_layouts)
619  av_strlcatf(args, sizeof(args), "channel_layouts=%s:",
621 
625 
626  snprintf(name, sizeof(name), "format_out_%d_%d",
627  ost->file_index, ost->index);
629  avfilter_get_by_name("aformat"),
630  name, args, NULL, fg->graph);
631  if (ret < 0)
632  return ret;
633 
634  ret = avfilter_link(last_filter, pad_idx, format, 0);
635  if (ret < 0)
636  return ret;
637 
638  last_filter = format;
639  pad_idx = 0;
640  }
641 
642  if (audio_volume != 256 && 0) {
643  char args[256];
644 
645  snprintf(args, sizeof(args), "%f", audio_volume / 256.);
646  AUTO_INSERT_FILTER("-vol", "volume", args);
647  }
648 
649  if (ost->apad && of->shortest) {
650  char args[256];
651  int i;
652 
653  for (i=0; i<of->ctx->nb_streams; i++)
655  break;
656 
657  if (i<of->ctx->nb_streams) {
658  snprintf(args, sizeof(args), "%s", ost->apad);
659  AUTO_INSERT_FILTER("-apad", "apad", args);
660  }
661  }
662 
663  snprintf(name, sizeof(name), "trim for output stream %d:%d",
664  ost->file_index, ost->index);
666  &last_filter, &pad_idx, name);
667  if (ret < 0)
668  return ret;
669 
670  if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
671  return ret;
672 
673  return 0;
674 }
675 
677 {
678  if (!ofilter->ost) {
679  av_log(NULL, AV_LOG_FATAL, "Filter %s has an unconnected output\n", ofilter->name);
680  exit_program(1);
681  }
682 
683  switch (avfilter_pad_get_type(out->filter_ctx->output_pads, out->pad_idx)) {
684  case AVMEDIA_TYPE_VIDEO: return configure_output_video_filter(fg, ofilter, out);
685  case AVMEDIA_TYPE_AUDIO: return configure_output_audio_filter(fg, ofilter, out);
686  default: av_assert0(0);
687  }
688 }
689 
691 {
692  int i;
693  for (i = 0; i < nb_filtergraphs; i++) {
694  int n;
695  for (n = 0; n < filtergraphs[i]->nb_outputs; n++) {
697  if (!output->ost) {
698  av_log(NULL, AV_LOG_FATAL, "Filter %s has an unconnected output\n", output->name);
699  exit_program(1);
700  }
701  }
702  }
703 }
704 
705 static int sub2video_prepare(InputStream *ist, InputFilter *ifilter)
706 {
708  int i, w, h;
709 
710  /* Compute the size of the canvas for the subtitles stream.
711  If the subtitles codecpar has set a size, use it. Otherwise use the
712  maximum dimensions of the video streams in the same file. */
713  w = ifilter->width;
714  h = ifilter->height;
715  if (!(w && h)) {
716  for (i = 0; i < avf->nb_streams; i++) {
718  w = FFMAX(w, avf->streams[i]->codecpar->width);
719  h = FFMAX(h, avf->streams[i]->codecpar->height);
720  }
721  }
722  if (!(w && h)) {
723  w = FFMAX(w, 720);
724  h = FFMAX(h, 576);
725  }
726  av_log(avf, AV_LOG_INFO, "sub2video: using %dx%d canvas\n", w, h);
727  }
728  ist->sub2video.w = ifilter->width = w;
729  ist->sub2video.h = ifilter->height = h;
730 
731  ifilter->width = ist->dec_ctx->width ? ist->dec_ctx->width : ist->sub2video.w;
732  ifilter->height = ist->dec_ctx->height ? ist->dec_ctx->height : ist->sub2video.h;
733 
734  /* rectangles are AV_PIX_FMT_PAL8, but we have no guarantee that the
735  palettes for all rectangles are identical or compatible */
736  ifilter->format = AV_PIX_FMT_RGB32;
737 
738  ist->sub2video.frame = av_frame_alloc();
739  if (!ist->sub2video.frame)
740  return AVERROR(ENOMEM);
741  ist->sub2video.last_pts = INT64_MIN;
742  ist->sub2video.end_pts = INT64_MIN;
743  return 0;
744 }
745 
747  AVFilterInOut *in)
748 {
749  AVFilterContext *last_filter;
750  const AVFilter *buffer_filt = avfilter_get_by_name("buffer");
751  InputStream *ist = ifilter->ist;
753  AVRational tb = ist->framerate.num ? av_inv_q(ist->framerate) :
754  ist->st->time_base;
755  AVRational fr = ist->framerate;
756  AVRational sar;
757  AVBPrint args;
758  char name[255];
759  int ret, pad_idx = 0;
760  int64_t tsoffset = 0;
762 
763  if (!par)
764  return AVERROR(ENOMEM);
765  memset(par, 0, sizeof(*par));
766  par->format = AV_PIX_FMT_NONE;
767 
768  if (ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
769  av_log(NULL, AV_LOG_ERROR, "Cannot connect video filter to audio input\n");
770  ret = AVERROR(EINVAL);
771  goto fail;
772  }
773 
774  if (!fr.num)
775  fr = av_guess_frame_rate(input_files[ist->file_index]->ctx, ist->st, NULL);
776 
778  ret = sub2video_prepare(ist, ifilter);
779  if (ret < 0)
780  goto fail;
781  }
782 
783  sar = ifilter->sample_aspect_ratio;
784  if(!sar.den)
785  sar = (AVRational){0,1};
787  av_bprintf(&args,
788  "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:"
789  "pixel_aspect=%d/%d:sws_param=flags=%d",
790  ifilter->width, ifilter->height, ifilter->format,
791  tb.num, tb.den, sar.num, sar.den,
793  if (fr.num && fr.den)
794  av_bprintf(&args, ":frame_rate=%d/%d", fr.num, fr.den);
795  snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
796  ist->file_index, ist->st->index);
797 
798 
799  if ((ret = avfilter_graph_create_filter(&ifilter->filter, buffer_filt, name,
800  args.str, NULL, fg->graph)) < 0)
801  goto fail;
802  par->hw_frames_ctx = ifilter->hw_frames_ctx;
803  ret = av_buffersrc_parameters_set(ifilter->filter, par);
804  if (ret < 0)
805  goto fail;
806  av_freep(&par);
807  last_filter = ifilter->filter;
808 
809  if (ist->autorotate) {
810  double theta = get_rotation(ist->st);
811 
812  if (fabs(theta - 90) < 1.0) {
813  ret = insert_filter(&last_filter, &pad_idx, "transpose", "clock");
814  } else if (fabs(theta - 180) < 1.0) {
815  ret = insert_filter(&last_filter, &pad_idx, "hflip", NULL);
816  if (ret < 0)
817  return ret;
818  ret = insert_filter(&last_filter, &pad_idx, "vflip", NULL);
819  } else if (fabs(theta - 270) < 1.0) {
820  ret = insert_filter(&last_filter, &pad_idx, "transpose", "cclock");
821  } else if (fabs(theta) > 1.0) {
822  char rotate_buf[64];
823  snprintf(rotate_buf, sizeof(rotate_buf), "%f*PI/180", theta);
824  ret = insert_filter(&last_filter, &pad_idx, "rotate", rotate_buf);
825  }
826  if (ret < 0)
827  return ret;
828  }
829 
830  if (do_deinterlace) {
831  AVFilterContext *yadif;
832 
833  snprintf(name, sizeof(name), "deinterlace_in_%d_%d",
834  ist->file_index, ist->st->index);
835  if ((ret = avfilter_graph_create_filter(&yadif,
836  avfilter_get_by_name("yadif"),
837  name, "", NULL,
838  fg->graph)) < 0)
839  return ret;
840 
841  if ((ret = avfilter_link(last_filter, 0, yadif, 0)) < 0)
842  return ret;
843 
844  last_filter = yadif;
845  }
846 
847  snprintf(name, sizeof(name), "trim_in_%d_%d",
848  ist->file_index, ist->st->index);
849  if (copy_ts) {
850  tsoffset = f->start_time == AV_NOPTS_VALUE ? 0 : f->start_time;
851  if (!start_at_zero && f->ctx->start_time != AV_NOPTS_VALUE)
852  tsoffset += f->ctx->start_time;
853  }
854  ret = insert_trim(((f->start_time == AV_NOPTS_VALUE) || !f->accurate_seek) ?
855  AV_NOPTS_VALUE : tsoffset, f->recording_time,
856  &last_filter, &pad_idx, name);
857  if (ret < 0)
858  return ret;
859 
860  if ((ret = avfilter_link(last_filter, 0, in->filter_ctx, in->pad_idx)) < 0)
861  return ret;
862  return 0;
863 fail:
864  av_freep(&par);
865 
866  return ret;
867 }
868 
870  AVFilterInOut *in)
871 {
872  AVFilterContext *last_filter;
873  const AVFilter *abuffer_filt = avfilter_get_by_name("abuffer");
874  InputStream *ist = ifilter->ist;
876  AVBPrint args;
877  char name[255];
878  int ret, pad_idx = 0;
879  int64_t tsoffset = 0;
880 
881  if (ist->dec_ctx->codec_type != AVMEDIA_TYPE_AUDIO) {
882  av_log(NULL, AV_LOG_ERROR, "Cannot connect audio filter to non audio input\n");
883  return AVERROR(EINVAL);
884  }
885 
887  av_bprintf(&args, "time_base=%d/%d:sample_rate=%d:sample_fmt=%s",
888  1, ifilter->sample_rate,
889  ifilter->sample_rate,
890  av_get_sample_fmt_name(ifilter->format));
891  if (ifilter->channel_layout)
892  av_bprintf(&args, ":channel_layout=0x%"PRIx64,
893  ifilter->channel_layout);
894  else
895  av_bprintf(&args, ":channels=%d", ifilter->channels);
896  snprintf(name, sizeof(name), "graph_%d_in_%d_%d", fg->index,
897  ist->file_index, ist->st->index);
898 
899  if ((ret = avfilter_graph_create_filter(&ifilter->filter, abuffer_filt,
900  name, args.str, NULL,
901  fg->graph)) < 0)
902  return ret;
903  last_filter = ifilter->filter;
904 
905 #define AUTO_INSERT_FILTER_INPUT(opt_name, filter_name, arg) do { \
906  AVFilterContext *filt_ctx; \
907  \
908  av_log(NULL, AV_LOG_INFO, opt_name " is forwarded to lavfi " \
909  "similarly to -af " filter_name "=%s.\n", arg); \
910  \
911  snprintf(name, sizeof(name), "graph_%d_%s_in_%d_%d", \
912  fg->index, filter_name, ist->file_index, ist->st->index); \
913  ret = avfilter_graph_create_filter(&filt_ctx, \
914  avfilter_get_by_name(filter_name), \
915  name, arg, NULL, fg->graph); \
916  if (ret < 0) \
917  return ret; \
918  \
919  ret = avfilter_link(last_filter, 0, filt_ctx, 0); \
920  if (ret < 0) \
921  return ret; \
922  \
923  last_filter = filt_ctx; \
924 } while (0)
925 
926  if (audio_sync_method > 0) {
927  char args[256] = {0};
928 
929  av_strlcatf(args, sizeof(args), "async=%d", audio_sync_method);
930  if (audio_drift_threshold != 0.1)
931  av_strlcatf(args, sizeof(args), ":min_hard_comp=%f", audio_drift_threshold);
932  if (!fg->reconfiguration)
933  av_strlcatf(args, sizeof(args), ":first_pts=0");
934  AUTO_INSERT_FILTER_INPUT("-async", "aresample", args);
935  }
936 
937 // if (ost->audio_channels_mapped) {
938 // int i;
939 // AVBPrint pan_buf;
940 // av_bprint_init(&pan_buf, 256, 8192);
941 // av_bprintf(&pan_buf, "0x%"PRIx64,
942 // av_get_default_channel_layout(ost->audio_channels_mapped));
943 // for (i = 0; i < ost->audio_channels_mapped; i++)
944 // if (ost->audio_channels_map[i] != -1)
945 // av_bprintf(&pan_buf, ":c%d=c%d", i, ost->audio_channels_map[i]);
946 // AUTO_INSERT_FILTER_INPUT("-map_channel", "pan", pan_buf.str);
947 // av_bprint_finalize(&pan_buf, NULL);
948 // }
949 
950  if (audio_volume != 256) {
951  char args[256];
952 
953  av_log(NULL, AV_LOG_WARNING, "-vol has been deprecated. Use the volume "
954  "audio filter instead.\n");
955 
956  snprintf(args, sizeof(args), "%f", audio_volume / 256.);
957  AUTO_INSERT_FILTER_INPUT("-vol", "volume", args);
958  }
959 
960  snprintf(name, sizeof(name), "trim for input stream %d:%d",
961  ist->file_index, ist->st->index);
962  if (copy_ts) {
963  tsoffset = f->start_time == AV_NOPTS_VALUE ? 0 : f->start_time;
964  if (!start_at_zero && f->ctx->start_time != AV_NOPTS_VALUE)
965  tsoffset += f->ctx->start_time;
966  }
967  ret = insert_trim(((f->start_time == AV_NOPTS_VALUE) || !f->accurate_seek) ?
968  AV_NOPTS_VALUE : tsoffset, f->recording_time,
969  &last_filter, &pad_idx, name);
970  if (ret < 0)
971  return ret;
972 
973  if ((ret = avfilter_link(last_filter, 0, in->filter_ctx, in->pad_idx)) < 0)
974  return ret;
975 
976  return 0;
977 }
978 
980  AVFilterInOut *in)
981 {
982  if (!ifilter->ist->dec) {
984  "No decoder for stream #%d:%d, filtering impossible\n",
985  ifilter->ist->file_index, ifilter->ist->st->index);
987  }
988  switch (avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx)) {
989  case AVMEDIA_TYPE_VIDEO: return configure_input_video_filter(fg, ifilter, in);
990  case AVMEDIA_TYPE_AUDIO: return configure_input_audio_filter(fg, ifilter, in);
991  default: av_assert0(0);
992  }
993 }
994 
996 {
997  int i;
998  for (i = 0; i < fg->nb_outputs; i++)
999  fg->outputs[i]->filter = (AVFilterContext *)NULL;
1000  for (i = 0; i < fg->nb_inputs; i++)
1001  fg->inputs[i]->filter = (AVFilterContext *)NULL;
1002  avfilter_graph_free(&fg->graph);
1003 }
1004 
1006 {
1007  AVFilterInOut *inputs, *outputs, *cur;
1008  int ret, i, simple = filtergraph_is_simple(fg);
1009  const char *graph_desc = simple ? fg->outputs[0]->ost->avfilter :
1010  fg->graph_desc;
1011 
1012  cleanup_filtergraph(fg);
1013  if (!(fg->graph = avfilter_graph_alloc()))
1014  return AVERROR(ENOMEM);
1015 
1016  if (simple) {
1017  OutputStream *ost = fg->outputs[0]->ost;
1018  char args[512];
1019  AVDictionaryEntry *e = NULL;
1020 
1022 
1023  args[0] = 0;
1024  while ((e = av_dict_get(ost->sws_dict, "", e,
1026  av_strlcatf(args, sizeof(args), "%s=%s:", e->key, e->value);
1027  }
1028  if (strlen(args))
1029  args[strlen(args)-1] = 0;
1031 
1032  args[0] = 0;
1033  while ((e = av_dict_get(ost->swr_opts, "", e,
1035  av_strlcatf(args, sizeof(args), "%s=%s:", e->key, e->value);
1036  }
1037  if (strlen(args))
1038  args[strlen(args)-1] = 0;
1039  av_opt_set(fg->graph, "aresample_swr_opts", args, 0);
1040 
1041  args[0] = '\0';
1042  while ((e = av_dict_get(fg->outputs[0]->ost->resample_opts, "", e,
1044  av_strlcatf(args, sizeof(args), "%s=%s:", e->key, e->value);
1045  }
1046  if (strlen(args))
1047  args[strlen(args) - 1] = '\0';
1048 
1049  e = av_dict_get(ost->encoder_opts, "threads", NULL, 0);
1050  if (e)
1051  av_opt_set(fg->graph, "threads", e->value, 0);
1052  } else {
1054  }
1055 
1056  if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0)
1057  goto fail;
1058 
1061  : hw_device_ctx;
1062  for (i = 0; i < fg->graph->nb_filters; i++) {
1063  fg->graph->filters[i]->hw_device_ctx = av_buffer_ref(device);
1064  if (!fg->graph->filters[i]->hw_device_ctx) {
1065  ret = AVERROR(ENOMEM);
1066  goto fail;
1067  }
1068  }
1069  }
1070 
1071  if (simple && (!inputs || inputs->next || !outputs || outputs->next)) {
1072  const char *num_inputs;
1073  const char *num_outputs;
1074  if (!outputs) {
1075  num_outputs = "0";
1076  } else if (outputs->next) {
1077  num_outputs = ">1";
1078  } else {
1079  num_outputs = "1";
1080  }
1081  if (!inputs) {
1082  num_inputs = "0";
1083  } else if (inputs->next) {
1084  num_inputs = ">1";
1085  } else {
1086  num_inputs = "1";
1087  }
1088  av_log(NULL, AV_LOG_ERROR, "Simple filtergraph '%s' was expected "
1089  "to have exactly 1 input and 1 output."
1090  " However, it had %s input(s) and %s output(s)."
1091  " Please adjust, or use a complex filtergraph (-filter_complex) instead.\n",
1092  graph_desc, num_inputs, num_outputs);
1093  ret = AVERROR(EINVAL);
1094  goto fail;
1095  }
1096 
1097  for (cur = inputs, i = 0; cur; cur = cur->next, i++)
1098  if ((ret = configure_input_filter(fg, fg->inputs[i], cur)) < 0) {
1101  goto fail;
1102  }
1104 
1105  for (cur = outputs, i = 0; cur; cur = cur->next, i++)
1106  configure_output_filter(fg, fg->outputs[i], cur);
1108 
1109  if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
1110  goto fail;
1111 
1112  /* limit the lists of allowed formats to the ones selected, to
1113  * make sure they stay the same if the filtergraph is reconfigured later */
1114  for (i = 0; i < fg->nb_outputs; i++) {
1115  OutputFilter *ofilter = fg->outputs[i];
1116  AVFilterContext *sink = ofilter->filter;
1117 
1118  ofilter->format = av_buffersink_get_format(sink);
1119 
1120  ofilter->width = av_buffersink_get_w(sink);
1121  ofilter->height = av_buffersink_get_h(sink);
1122 
1123  ofilter->sample_rate = av_buffersink_get_sample_rate(sink);
1125  }
1126 
1127  fg->reconfiguration = 1;
1128 
1129  for (i = 0; i < fg->nb_outputs; i++) {
1130  OutputStream *ost = fg->outputs[i]->ost;
1131  if (!ost->enc) {
1132  /* identical to the same check in ffmpeg.c, needed because
1133  complex filter graphs are initialized earlier */
1134  av_log(NULL, AV_LOG_ERROR, "Encoder (codec %s) not found for output stream #%d:%d\n",
1135  avcodec_get_name(ost->st->codecpar->codec_id), ost->file_index, ost->index);
1136  ret = AVERROR(EINVAL);
1137  goto fail;
1138  }
1139  if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
1140  !(ost->enc->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE))
1141  av_buffersink_set_frame_size(ost->filter->filter,
1142  ost->enc_ctx->frame_size);
1143  }
1144 
1145  for (i = 0; i < fg->nb_inputs; i++) {
1146  while (av_fifo_size(fg->inputs[i]->frame_queue)) {
1147  AVFrame *tmp;
1148  av_fifo_generic_read(fg->inputs[i]->frame_queue, &tmp, sizeof(tmp), NULL);
1150  av_frame_free(&tmp);
1151  if (ret < 0)
1152  goto fail;
1153  }
1154  }
1155 
1156  /* send the EOFs for the finished inputs */
1157  for (i = 0; i < fg->nb_inputs; i++) {
1158  if (fg->inputs[i]->eof) {
1160  if (ret < 0)
1161  goto fail;
1162  }
1163  }
1164 
1165  /* process queued up subtitle packets */
1166  for (i = 0; i < fg->nb_inputs; i++) {
1167  InputStream *ist = fg->inputs[i]->ist;
1168  if (ist->sub2video.sub_queue && ist->sub2video.frame) {
1169  while (av_fifo_size(ist->sub2video.sub_queue)) {
1170  AVSubtitle tmp;
1171  av_fifo_generic_read(ist->sub2video.sub_queue, &tmp, sizeof(tmp), NULL);
1172  sub2video_update(ist, &tmp);
1173  avsubtitle_free(&tmp);
1174  }
1175  }
1176  }
1177 
1178  return 0;
1179 
1180 fail:
1181  cleanup_filtergraph(fg);
1182  return ret;
1183 }
1184 
1186 {
1187  av_buffer_unref(&ifilter->hw_frames_ctx);
1188 
1189  ifilter->format = frame->format;
1190 
1191  ifilter->width = frame->width;
1192  ifilter->height = frame->height;
1193  ifilter->sample_aspect_ratio = frame->sample_aspect_ratio;
1194 
1195  ifilter->sample_rate = frame->sample_rate;
1196  ifilter->channels = frame->channels;
1197  ifilter->channel_layout = frame->channel_layout;
1198 
1199  if (frame->hw_frames_ctx) {
1200  ifilter->hw_frames_ctx = av_buffer_ref(frame->hw_frames_ctx);
1201  if (!ifilter->hw_frames_ctx)
1202  return AVERROR(ENOMEM);
1203  }
1204 
1205  return 0;
1206 }
1207 
1209 {
1210  int i;
1211  for (i = 0; i < fg->nb_inputs; i++)
1212  if (fg->inputs[i]->ist == ist)
1213  return 1;
1214  return 0;
1215 }
1216 
1218 {
1219  return !fg->graph_desc;
1220 }
AVSubtitle
Definition: avcodec.h:3933
formats
formats
Definition: signature.h:48
init_complex_filtergraph
int init_complex_filtergraph(FilterGraph *fg)
Definition: ffmpeg_filter.c:340
InputFilter::sample_aspect_ratio
AVRational sample_aspect_ratio
Definition: ffmpeg.h:248
AVCodec
AVCodec.
Definition: avcodec.h:3481
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
audio_sync_method
int audio_sync_method
Definition: ffmpeg_opt.c:92
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
OutputFilter::graph
struct FilterGraph * graph
Definition: ffmpeg.h:262
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
nb_input_files
int nb_input_files
Definition: ffmpeg.c:150
opt.h
GET_SAMPLE_RATE_NAME
#define GET_SAMPLE_RATE_NAME(rate)
Definition: cmdutils.h:631
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: avcodec.h:3953
AVFilterGraph::nb_threads
int nb_threads
Maximum number of threads used by filters in this graph.
Definition: avfilter.h:869
avfilter_pad_get_name
const char * avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx)
Get the name of an AVFilterPad.
Definition: avfilter.c:1034
codec_id
enum AVCodecID codec_id
Definition: qsv.c:72
AVCodecContext::channel_layout
uint64_t channel_layout
Audio channel layout.
Definition: avcodec.h:2276
InputFilter::width
int width
Definition: ffmpeg.h:247
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:235
out
FILE * out
Definition: movenc.c:54
av_bprint_init
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:69
FilterGraph::graph_desc
const char * graph_desc
Definition: ffmpeg.h:284
n
int n
Definition: avisynth_c.h:760
sample_fmts
static enum AVSampleFormat sample_fmts[]
Definition: adpcmenc.c:686
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2522
FilterGraph::inputs
InputFilter ** inputs
Definition: ffmpeg.h:289
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:925
InputStream::dec_ctx
AVCodecContext * dec_ctx
Definition: ffmpeg.h:304
InputStream::user_set_discard
int user_set_discard
Definition: ffmpeg.h:299
output
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce output
Definition: filter_design.txt:225
AVCodec::pix_fmts
enum AVPixelFormat * pix_fmts
array of supported pixel formats, or NULL if unknown, array is terminated by -1
Definition: avcodec.h:3502
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:202
OutputFile::start_time
int64_t start_time
start time in microseconds == AV_TIME_BASE units
Definition: ffmpeg.h:559
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:295
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:26
AVFilterInOut::next
struct AVFilterInOut * next
next input/input in the list, NULL if this is the last
Definition: avfilter.h:1014
pixdesc.h
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1410
AVCodec::capabilities
int capabilities
Codec capabilities.
Definition: avcodec.h:3500
w
uint8_t w
Definition: llviddspenc.c:38
name
const char * name
Definition: avisynth_c.h:867
av_buffersrc_add_frame
int attribute_align_arg av_buffersrc_add_frame(AVFilterContext *ctx, AVFrame *frame)
Add a frame to the buffer source.
Definition: buffersrc.c:150
FilterGraph::index
int index
Definition: ffmpeg.h:283
check_filter_outputs
void check_filter_outputs(void)
Definition: ffmpeg_filter.c:690
InputStream::nb_filters
int nb_filters
Definition: ffmpeg.h:359
AV_DICT_IGNORE_SUFFIX
#define AV_DICT_IGNORE_SUFFIX
Return first entry in a dictionary whose first part corresponds to the search key,...
Definition: dict.h:70
ffmpeg.h
avresample.h
FilterGraph::nb_inputs
int nb_inputs
Definition: ffmpeg.h:290
AVFilterContext::hw_device_ctx
AVBufferRef * hw_device_ctx
For filters which will create hardware frames, sets the device the filter should create them in.
Definition: avfilter.h:394
AV_PIX_FMT_BGR24
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition: pixfmt.h:69
AV_PIX_FMT_BGRA
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
Definition: pixfmt.h:95
filter
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce 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
Definition: filter_design.txt:228
AVFilterContext::output_pads
AVFilterPad * output_pads
array of output pads
Definition: avfilter.h:349
get_compliance_unofficial_pix_fmts
static enum AVPixelFormat * get_compliance_unofficial_pix_fmts(enum AVCodecID codec_id, const enum AVPixelFormat default_formats[])
Definition: ffmpeg_filter.c:42
av_fifo_generic_read
int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void(*func)(void *, void *, int))
Feed data from an AVFifoBuffer to a user-supplied callback.
Definition: fifo.c:213
InputStream::decoding_needed
int decoding_needed
Definition: ffmpeg.h:300
av_strlcatf
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
Definition: avstring.c:101
ost
static AVStream * ost
Definition: vaapi_transcode.c:45
sample_rate
sample_rate
Definition: ffmpeg_filter.c:191
FF_COMPLIANCE_UNOFFICIAL
#define FF_COMPLIANCE_UNOFFICIAL
Allow unofficial extensions.
Definition: avcodec.h:2632
avfilter_graph_free
void avfilter_graph_free(AVFilterGraph **graph)
Free a graph, destroy its links, and set *graph to NULL.
Definition: avfiltergraph.c:120
InputFilter::channel_layout
uint64_t channel_layout
Definition: ffmpeg.h:252
InputFilter::ist
struct InputStream * ist
Definition: ffmpeg.h:237
init_simple_filtergraph
int init_simple_filtergraph(InputStream *ist, OutputStream *ost)
configure_filtergraph
int configure_filtergraph(FilterGraph *fg)
Definition: ffmpeg_filter.c:1005
AUTO_INSERT_FILTER
#define AUTO_INSERT_FILTER(opt_name, filter_name, arg)
exit_program
void exit_program(int ret)
Wraps exit with a program-specific cleanup routine.
Definition: cmdutils.c:136
InputStream
Definition: ffmpeg.h:295
SWS_BITEXACT
#define SWS_BITEXACT
Definition: swscale.h:84
do_deinterlace
int do_deinterlace
Definition: ffmpeg_opt.c:95
avfilter_graph_create_filter
int avfilter_graph_create_filter(AVFilterContext **filt_ctx, const AVFilter *filt, const char *name, const char *args, void *opaque, AVFilterGraph *graph_ctx)
Create and add a filter instance into an existing graph.
Definition: avfiltergraph.c:142
av_buffersink_set_frame_size
void av_buffersink_set_frame_size(AVFilterContext *ctx, unsigned frame_size)
Set the frame size for an audio buffer sink.
Definition: buffersink.c:175
avfilter_graph_alloc_filter
AVFilterContext * avfilter_graph_alloc_filter(AVFilterGraph *graph, const AVFilter *filter, const char *name)
Create a new filter instance in a filter graph.
Definition: avfiltergraph.c:170
InputStream::sub2video
struct InputStream::sub2video sub2video
fail
#define fail()
Definition: checkasm.h:120
InputFilter::type
enum AVMediaType type
Definition: ffmpeg.h:240
AVCodec::sample_fmts
enum AVSampleFormat * sample_fmts
array of supported sample formats, or NULL if unknown, array is terminated by -1
Definition: avcodec.h:3504
avfilter_graph_alloc
AVFilterGraph * avfilter_graph_alloc(void)
Allocate a filter graph.
Definition: avfiltergraph.c:83
samplefmt.h
AVDISCARD_NONE
@ AVDISCARD_NONE
discard nothing
Definition: avcodec.h:805
AV_BPRINT_SIZE_AUTOMATIC
#define AV_BPRINT_SIZE_AUTOMATIC
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:1645
OutputFilter::sample_rate
int sample_rate
Definition: ffmpeg.h:273
type
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 type
Definition: writing_filters.txt:86
InputFilter::frame_queue
AVFifoBuffer * frame_queue
Definition: ffmpeg.h:242
av_opt_set
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
Definition: opt.c:449
InputStream::sub2video::last_pts
int64_t last_pts
Definition: ffmpeg.h:347
AVRational::num
int num
Numerator.
Definition: rational.h:59
InputFile
Definition: ffmpeg.h:393
AVFilterPad
A filter pad used for either input or output.
Definition: internal.h:54
avsubtitle_free
void avsubtitle_free(AVSubtitle *sub)
Free all allocated data in the given subtitle struct.
Definition: utils.c:1098
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:189
avio_close_dyn_buf
int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
Definition: aviobuf.c:1415
check_stream_specifier
int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
Check if the given stream matches a stream specifier.
Definition: cmdutils.c:2071
OutputFile::shortest
int shortest
Definition: ffmpeg.h:562
avfilter_inout_free
void avfilter_inout_free(AVFilterInOut **inout)
Free the supplied list of AVFilterInOut and set *inout to NULL.
Definition: graphparser.c:203
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
duration
int64_t duration
Definition: movenc.c:63
avio_open_dyn_buf
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
Definition: aviobuf.c:1386
av_dict_get
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:40
AV_PIX_FMT_YUVJ422P
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
Definition: pixfmt.h:79
OutputFilter::width
int width
Definition: ffmpeg.h:270
input_streams
InputStream ** input_streams
Definition: ffmpeg.c:147
s
#define s(width, name)
Definition: cbs_vp9.c:257
FilterGraph::outputs
OutputFilter ** outputs
Definition: ffmpeg.h:291
InputStream::framerate
AVRational framerate
Definition: ffmpeg.h:333
configure_input_audio_filter
static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter, AVFilterInOut *in)
Definition: ffmpeg_filter.c:869
format
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 format(the sample packing is implied by the sample format) and sample rate. The lists are not just lists
sub2video_update
void sub2video_update(InputStream *ist, AVSubtitle *sub)
Definition: ffmpeg.c:240
GET_CH_LAYOUT_NAME
#define GET_CH_LAYOUT_NAME(ch_layout)
Definition: cmdutils.h:635
AVDictionaryEntry::key
char * key
Definition: dict.h:82
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
AVCodecParameters::width
int width
Video only.
Definition: avcodec.h:4023
InputFilter
Definition: ffmpeg.h:235
av_buffersink_get_format
int av_buffersink_get_format(const AVFilterContext *ctx)
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
outputs
static const AVFilterPad outputs[]
Definition: af_acontrast.c:203
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:275
OutputFilter::ost
struct OutputStream * ost
Definition: ffmpeg.h:261
AVFILTER_AUTO_CONVERT_NONE
@ AVFILTER_AUTO_CONVERT_NONE
all automatic conversions disabled
Definition: avfilter.h:976
OutputStream::avfilter
char * avfilter
Definition: ffmpeg.h:503
ctx
AVFormatContext * ctx
Definition: movenc.c:48
InputStream::sub2video::sub_queue
AVFifoBuffer * sub_queue
queue of AVSubtitle* before filter init
Definition: ffmpeg.h:349
audio_drift_threshold
float audio_drift_threshold
Definition: ffmpeg_opt.c:87
InputStream::filters
InputFilter ** filters
Definition: ffmpeg.h:358
avcodec_get_name
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
Definition: utils.c:1183
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
InputFilter::graph
struct FilterGraph * graph
Definition: ffmpeg.h:238
av_get_sample_fmt_name
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:49
f
#define f(width, name)
Definition: cbs_vp9.c:255
AV_PIX_FMT_YUVJ444P
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
Definition: pixfmt.h:80
AVCodecContext::codec_id
enum AVCodecID codec_id
Definition: avcodec.h:1575
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: avcodec.h:811
AVFormatContext
Format I/O context.
Definition: avformat.h:1342
avfilter_get_by_name
const AVFilter * avfilter_get_by_name(const char *name)
Get a filter definition matching the given name.
Definition: allfilters.c:485
OutputFilter::height
int height
Definition: ffmpeg.h:270
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:1017
OutputFilter::name
uint8_t * name
Definition: ffmpeg.h:263
avfilter_graph_config
int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx)
Check validity and configure all the links and formats in the graph.
Definition: avfiltergraph.c:1267
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avformat.h:899
NULL
#define NULL
Definition: coverity.c:32
InputStream::sub2video::w
int w
Definition: ffmpeg.h:351
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:125
InputStream::st
AVStream * st
Definition: ffmpeg.h:297
avfilter_graph_set_auto_convert
void avfilter_graph_set_auto_convert(AVFilterGraph *graph, unsigned flags)
Enable or disable automatic format conversion inside the graph.
Definition: avfiltergraph.c:165
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AV_PIX_FMT_YUVJ420P
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
Definition: pixfmt.h:78
AVFilterGraph::filters
AVFilterContext ** filters
Definition: avfilter.h:842
choose_sample_fmt
void choose_sample_fmt(AVStream *st, AVCodec *codec)
Definition: ffmpeg_filter.c:93
InputFilter::channels
int channels
Definition: ffmpeg.h:251
InputStream::dec
AVCodec * dec
Definition: ffmpeg.h:305
OutputStream::resample_opts
AVDictionary * resample_opts
Definition: ffmpeg.h:510
InputFilter::eof
int eof
Definition: ffmpeg.h:256
AV_CODEC_CAP_VARIABLE_FRAME_SIZE
#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE
Audio encoder supports receiving a different number of samples in each call.
Definition: avcodec.h:1053
AV_PIX_FMT_BGR0
@ AV_PIX_FMT_BGR0
packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
Definition: pixfmt.h:240
OutputFilter::channel_layout
uint64_t channel_layout
Definition: ffmpeg.h:274
avio_w8
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:196
AVFilterGraph
Definition: avfilter.h:840
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
nb_input_streams
int nb_input_streams
Definition: ffmpeg.c:148
avfilter_graph_parse2
int avfilter_graph_parse2(AVFilterGraph *graph, const char *filters, AVFilterInOut **inputs, AVFilterInOut **outputs)
Add a graph described by a string to a graph.
Definition: graphparser.c:407
av_buffersink_get_channel_layout
uint64_t av_buffersink_get_channel_layout(const AVFilterContext *ctx)
FilterGraph::nb_outputs
int nb_outputs
Definition: ffmpeg.h:292
av_opt_set_int
int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
Definition: opt.c:568
input_files
InputFile ** input_files
Definition: ffmpeg.c:149
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: avcodec.h:215
FilterGraph
Definition: ffmpeg.h:282
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1398
InputFilter::filter
AVFilterContext * filter
Definition: ffmpeg.h:236
AVFilterInOut::pad_idx
int pad_idx
index of the filt_ctx pad to use for linking
Definition: avfilter.h:1011
AVFilterGraph::scale_sws_opts
char * scale_sws_opts
sws options to use for the auto-inserted scale filters
Definition: avfilter.h:845
desc
const char * desc
Definition: nvenc.c:68
AVIOContext
Bytestream IO Context.
Definition: avio.h:161
AVMediaType
AVMediaType
Definition: avutil.h:199
av_buffersrc_parameters_alloc
AVBufferSrcParameters * av_buffersrc_parameters_alloc(void)
Allocate a new AVBufferSrcParameters instance.
Definition: buffersrc.c:88
InputStream::file_index
int file_index
Definition: ffmpeg.h:296
AVFilterInOut::filter_ctx
AVFilterContext * filter_ctx
filter context associated to this input/output
Definition: avfilter.h:1008
output_files
OutputFile ** output_files
Definition: ffmpeg.c:154
avfilter_link
int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad)
Link two filters together.
Definition: avfilter.c:135
AVBufferSrcParameters::hw_frames_ctx
AVBufferRef * hw_frames_ctx
Video with a hwaccel pixel format only.
Definition: buffersrc.h:106
start_time
static int64_t start_time
Definition: ffplay.c:331
FFMAX
#define FFMAX(a, b)
Definition: common.h:94
FilterGraph::graph
AVFilterGraph * graph
Definition: ffmpeg.h:286
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:59
insert_trim
static int insert_trim(int64_t start_time, int64_t duration, AVFilterContext **last_filter, int *pad_idx, const char *filter_name)
Definition: ffmpeg_filter.c:381
copy_ts
int copy_ts
Definition: ffmpeg_opt.c:100
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
av_guess_frame_rate
AVRational av_guess_frame_rate(AVFormatContext *ctx, AVStream *stream, AVFrame *frame)
Guess the frame rate, based on both the container and codec information.
Definition: utils.c:5107
HWDevice::device_ref
AVBufferRef * device_ref
Definition: ffmpeg.h:77
GET_SAMPLE_FMT_NAME
#define GET_SAMPLE_FMT_NAME(sample_fmt)
Definition: cmdutils.h:628
AV_OPT_SEARCH_CHILDREN
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition: opt.h:556
OutputFilter::filter
AVFilterContext * filter
Definition: ffmpeg.h:260
AV_PIX_FMT_RGB32
#define AV_PIX_FMT_RGB32
Definition: pixfmt.h:360
avcodec_find_best_pix_fmt_of_2
enum AVPixelFormat avcodec_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
Definition: imgconvert.c:54
OutputFilter::type
enum AVMediaType type
Definition: ffmpeg.h:267
configure_output_filter
int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
Definition: ffmpeg_filter.c:676
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:187
sample_rates
sample_rates
Definition: ffmpeg_filter.c:191
AVCodecContext::channels
int channels
number of audio channels
Definition: avcodec.h:2226
avfilter_init_str
int avfilter_init_str(AVFilterContext *filter, const char *args)
Initialize a filter with the supplied parameters.
Definition: avfilter.c:924
buffersink.h
ifilter_parameters_from_frame
int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame)
Definition: ffmpeg_filter.c:1185
AV_CODEC_ID_MJPEG
@ AV_CODEC_ID_MJPEG
Definition: avcodec.h:225
in
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
Definition: audio_convert.c:326
av_buffersink_get_w
int av_buffersink_get_w(const AVFilterContext *ctx)
bprint.h
av_buffersrc_parameters_set
int av_buffersrc_parameters_set(AVFilterContext *ctx, AVBufferSrcParameters *param)
Initialize the buffersrc or abuffersrc filter with the provided parameters.
Definition: buffersrc.c:99
DECODING_FOR_FILTER
#define DECODING_FOR_FILTER
Definition: ffmpeg.h:302
configure_input_filter
static int configure_input_filter(FilterGraph *fg, InputFilter *ifilter, AVFilterInOut *in)
Definition: ffmpeg_filter.c:979
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
hw_device_ctx
static AVBufferRef * hw_device_ctx
Definition: hw_decode.c:45
AVCodecParameters::height
int height
Definition: avcodec.h:4024
display.h
AVSampleFormat
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:58
InputFile::ctx
AVFormatContext * ctx
Definition: ffmpeg.h:394
args
const char AVS_Value args
Definition: avisynth_c.h:873
uint8_t
uint8_t
Definition: audio_convert.c:194
tb
#define tb
Definition: regdef.h:68
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:236
AVCodec::name
const char * name
Name of the codec implementation.
Definition: avcodec.h:3488
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
len
int len
Definition: vorbis_enc_data.h:452
init_input_filter
static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
Definition: ffmpeg_filter.c:253
filtergraphs
FilterGraph ** filtergraphs
Definition: ffmpeg.c:157
AVCodecContext::height
int height
Definition: avcodec.h:1738
ist_in_filtergraph
int ist_in_filtergraph(FilterGraph *fg, InputStream *ist)
Definition: ffmpeg_filter.c:1208
av_buffersink_get_h
int av_buffersink_get_h(const AVFilterContext *ctx)
AVFilter
Filter definition.
Definition: avfilter.h:144
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:870
AV_LOG_FATAL
#define AV_LOG_FATAL
Something went wrong and recovery is not possible.
Definition: log.h:170
pixfmt.h
frame
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 For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
InputFilter::name
uint8_t * name
Definition: ffmpeg.h:239
AVCodecContext::strict_std_compliance
int strict_std_compliance
strictly follow the standard (MPEG-4, ...).
Definition: avcodec.h:2628
insert_filter
static int insert_filter(AVFilterContext **last_filter, int *pad_idx, const char *filter_name, const char *args)
Definition: ffmpeg_filter.c:432
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:94
choose_pixel_fmt
enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *enc_ctx, AVCodec *codec, enum AVPixelFormat target)
Definition: ffmpeg_filter.c:63
InputFile::ist_index
int ist_index
Definition: ffmpeg.h:397
InputFilter::sample_rate
int sample_rate
Definition: ffmpeg.h:250
avfilter_pad_get_type
enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx)
Get the type of an AVFilterPad.
Definition: avfilter.c:1039
avio_printf
int avio_printf(AVIOContext *s, const char *fmt,...) av_printf_format(2
OutputFilter::format
int format
Definition: ffmpeg.h:272
configure_input_video_filter
static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter, AVFilterInOut *in)
Definition: ffmpeg_filter.c:746
filter_hw_device
HWDevice * filter_hw_device
Definition: ffmpeg_opt.c:82
AVCodecContext
main external API structure.
Definition: avcodec.h:1565
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:871
choose_pix_fmts
static char * choose_pix_fmts(OutputFilter *ofilter)
Definition: ffmpeg_filter.c:115
get_rotation
double get_rotation(AVStream *st)
Definition: cmdutils.c:2175
channel_layout.h
AVBufferSrcParameters
This structure contains the parameters describing the frames that will be passed to this filter.
Definition: buffersrc.h:73
av_buffersink_get_sample_rate
int av_buffersink_get_sample_rate(const AVFilterContext *ctx)
InputFilter::format
int format
Definition: ffmpeg.h:245
AVBufferSrcParameters::format
int format
video: the pixel format, value corresponds to enum AVPixelFormat audio: the sample format,...
Definition: buffersrc.h:78
describe_filter_link
static char * describe_filter_link(FilterGraph *fg, AVFilterInOut *inout, int in)
Definition: ffmpeg_filter.c:234
AVRational::den
int den
Denominator.
Definition: rational.h:60
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
filter_nbthreads
int filter_nbthreads
Definition: ffmpeg_opt.c:111
avfilter.h
InputFilter::height
int height
Definition: ffmpeg.h:247
GROW_ARRAY
#define GROW_ARRAY(array, nb_elems)
Definition: cmdutils.h:619
av_buffer_ref
AVBufferRef * av_buffer_ref(AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:93
AVERROR_FILTER_NOT_FOUND
#define AVERROR_FILTER_NOT_FOUND
Filter not found.
Definition: error.h:58
AV_CODEC_CAP_LOSSLESS
#define AV_CODEC_CAP_LOSSLESS
Codec is lossless.
Definition: avcodec.h:1071
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:71
InputStream::discard
int discard
Definition: ffmpeg.h:298
AVFilterContext
An instance of a filter.
Definition: avfilter.h:338
OutputFilter
Definition: ffmpeg.h:259
cleanup_filtergraph
static void cleanup_filtergraph(FilterGraph *fg)
Definition: ffmpeg_filter.c:995
InputStream::sub2video::frame
AVFrame * frame
Definition: ffmpeg.h:350
AVERROR_DECODER_NOT_FOUND
#define AVERROR_DECODER_NOT_FOUND
Decoder not found.
Definition: error.h:52
AVCodecContext::codec_type
enum AVMediaType codec_type
Definition: avcodec.h:1573
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:251
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:70
start_at_zero
int start_at_zero
Definition: ffmpeg_opt.c:101
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:81
audio_volume
int audio_volume
Definition: ffmpeg_opt.c:91
AV_CODEC_FLAG_BITEXACT
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition: avcodec.h:908
OutputFile::ctx
AVFormatContext * ctx
Definition: ffmpeg.h:555
OutputFilter::out_tmp
AVFilterInOut * out_tmp
Definition: ffmpeg.h:266
av_get_default_channel_layout
int64_t av_get_default_channel_layout(int nb_channels)
Return default channel layout for a given number of channels.
Definition: channel_layout.c:225
av_fifo_size
int av_fifo_size(const AVFifoBuffer *f)
Return the amount of data in bytes in the AVFifoBuffer, that is the amount of data you can read from ...
Definition: fifo.c:77
InputStream::sub2video::h
int h
Definition: ffmpeg.h:351
AVCodecParameters::format
int format
Definition: avcodec.h:3981
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:81
InputFilter::hw_frames_ctx
AVBufferRef * hw_frames_ctx
Definition: ffmpeg.h:254
DEF_CHOOSE_FORMAT
#define DEF_CHOOSE_FORMAT(suffix, type, var, supported_list, none, get_name)
Definition: ffmpeg_filter.c:159
AVDictionaryEntry
Definition: dict.h:81
InputStream::sub2video::end_pts
int64_t end_pts
Definition: ffmpeg.h:348
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: avcodec.h:3957
channel_layouts
static const uint16_t channel_layouts[7]
Definition: dca_lbr.c:113
FilterGraph::reconfiguration
int reconfiguration
Definition: ffmpeg.h:287
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
filtergraph_is_simple
int filtergraph_is_simple(FilterGraph *fg)
Definition: ffmpeg_filter.c:1217
nb_filtergraphs
int nb_filtergraphs
Definition: ffmpeg.c:158
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:1738
av_fifo_alloc
AVFifoBuffer * av_fifo_alloc(unsigned int size)
Initialize an AVFifoBuffer.
Definition: fifo.c:43
imgutils.h
OutputStream
Definition: muxing.c:53
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
configure_output_video_filter
static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
Definition: ffmpeg_filter.c:454
h
h
Definition: vp9dsp_template.c:2038
AVDictionaryEntry::value
char * value
Definition: dict.h:83
AVFilterGraph::nb_filters
unsigned nb_filters
Definition: avfilter.h:843
avstring.h
SWS_BILINEAR
#define SWS_BILINEAR
Definition: swscale.h:59
OutputFile::recording_time
int64_t recording_time
desired length of the resulting file in microseconds == AV_TIME_BASE units
Definition: ffmpeg.h:558
AVFilterInOut
A linked-list of the inputs/outputs of the filter chain.
Definition: avfilter.h:1003
AV_CODEC_ID_LJPEG
@ AV_CODEC_ID_LJPEG
Definition: avcodec.h:227
snprintf
#define snprintf
Definition: snprintf.h:34
buffersrc.h
AUTO_INSERT_FILTER_INPUT
#define AUTO_INSERT_FILTER_INPUT(opt_name, filter_name, arg)
configure_output_audio_filter
static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
Definition: ffmpeg_filter.c:548
av_get_pix_fmt_name
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:2438
filter_complex_nbthreads
int filter_complex_nbthreads
Definition: ffmpeg_opt.c:112
OutputFile
Definition: ffmpeg.h:554
sub2video_prepare
static int sub2video_prepare(InputStream *ist, InputFilter *ifilter)
Definition: ffmpeg_filter.c:705
InputStream::autorotate
int autorotate
Definition: ffmpeg.h:337