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 #include "graph/graphprint.h"
25 
26 #include "libavfilter/avfilter.h"
27 #include "libavfilter/buffersink.h"
28 #include "libavfilter/buffersrc.h"
29 
30 #include "libavutil/attributes.h"
31 #include "libavutil/avassert.h"
32 #include "libavutil/avstring.h"
33 #include "libavutil/bprint.h"
35 #include "libavutil/downmix_info.h"
36 #include "libavutil/mem.h"
37 #include "libavutil/opt.h"
38 #include "libavutil/pixdesc.h"
39 #include "libavutil/pixfmt.h"
40 #include "libavutil/samplefmt.h"
41 #include "libavutil/time.h"
42 #include "libavutil/timestamp.h"
43 
44 typedef struct FilterGraphPriv {
46 
47  // name used for logging
48  char log_name[32];
49 
50  int is_simple;
51  // true when the filtergraph contains only meta filters
52  // that do not modify the frame data
53  int is_meta;
55 
56  unsigned nb_outputs_done;
57 
59 
60  // frame for temporarily holding output from the filtergraph
62  // frame for sending output to the encoder
64 
66  unsigned sch_idx;
68 
70 {
71  return (FilterGraphPriv*)fg;
72 }
73 
74 static const FilterGraphPriv *cfgp_from_cfg(const FilterGraph *fg)
75 {
76  return (const FilterGraphPriv*)fg;
77 }
78 
79 // data that is local to the filter thread and not visible outside of it
80 typedef struct FilterGraphThread {
82 
84 
85  // Temporary buffer for output frames, since on filtergraph reset
86  // we cannot send them to encoders immediately.
87  // The output index is stored in frame opaque.
89 
90  // index of the next input to request from the scheduler
91  unsigned next_in;
92  // set to 1 after at least one frame passed through this output
93  int got_frame;
94 
95  // EOF status of each input/output, as received by the thread
96  uint8_t *eof_in;
97  uint8_t *eof_out;
99 
100 typedef struct InputFilterPriv {
102 
104 
105  // used to hold submitted input
107 
108  // For inputs bound to a filtergraph output
110 
111  // source data type: AVMEDIA_TYPE_SUBTITLE for sub2video,
112  // same as type otherwise
114 
115  int eof;
116  int bound;
118  uint64_t nb_dropped;
119 
120  // parameters configured for this input
121  int format;
122 
123  int width, height;
128 
131 
133 
136 
138 
140 
144 
147 
148  struct {
149  AVFrame *frame;
150 
153 
154  /// marks if sub2video_update should force an initialization
155  unsigned int initialize;
156  } sub2video;
158 
160 {
161  return (InputFilterPriv*)ifilter;
162 }
163 
164 typedef struct FPSConvContext {
166  /* number of frames emitted by the video-encoding sync code */
168  /* history of nb_frames_prev, i.e. the number of times the
169  * previous frame was duplicated by vsync code in recent
170  * do_video_out() calls */
172 
173  uint64_t dup_warning;
174 
177 
179 
185 
186 typedef struct OutputFilterPriv {
188 
189  void *log_parent;
190  char log_name[32];
191 
192  int needed;
193 
194  /* desired output stream properties */
195  int format;
196  int width, height;
202 
203  unsigned crop_top;
204  unsigned crop_bottom;
205  unsigned crop_left;
206  unsigned crop_right;
207 
210 
211  // time base in which the output is sent to our downstream
212  // does not need to match the filtersink's timebase
214  // at least one frame with the above timebase was sent
215  // to our downstream, so it cannot change anymore
217 
219 
222 
223  // those are only set if no format is specified and the encoder gives us multiple options
224  // They point directly to the relevant lists of the encoder.
225  union {
226  const enum AVPixelFormat *pix_fmts;
228  };
230  const int *sample_rates;
234 
236 
240  // offset for output timestamps, in AV_TIME_BASE_Q
244 
245  unsigned flags;
247 
249 {
250  return (OutputFilterPriv*)ofilter;
251 }
252 
253 typedef struct FilterCommand {
254  char *target;
255  char *command;
256  char *arg;
257 
258  double time;
260 } FilterCommand;
261 
262 static void filter_command_free(void *opaque, uint8_t *data)
263 {
265 
266  av_freep(&fc->target);
267  av_freep(&fc->command);
268  av_freep(&fc->arg);
269 
270  av_free(data);
271 }
272 
274 {
275  AVFrame *frame = ifp->sub2video.frame;
276  int ret;
277 
279 
280  frame->width = ifp->width;
281  frame->height = ifp->height;
282  frame->format = ifp->format;
283  frame->colorspace = ifp->color_space;
284  frame->color_range = ifp->color_range;
285  frame->alpha_mode = ifp->alpha_mode;
286 
288  if (ret < 0)
289  return ret;
290 
291  memset(frame->data[0], 0, frame->height * frame->linesize[0]);
292 
293  return 0;
294 }
295 
296 static void sub2video_copy_rect(uint8_t *dst, int dst_linesize, int w, int h,
297  AVSubtitleRect *r)
298 {
299  uint32_t *pal, *dst2;
300  uint8_t *src, *src2;
301  int x, y;
302 
303  if (r->type != SUBTITLE_BITMAP) {
304  av_log(NULL, AV_LOG_WARNING, "sub2video: non-bitmap subtitle\n");
305  return;
306  }
307  if (r->x < 0 || r->x + r->w > w || r->y < 0 || r->y + r->h > h) {
308  av_log(NULL, AV_LOG_WARNING, "sub2video: rectangle (%d %d %d %d) overflowing %d %d\n",
309  r->x, r->y, r->w, r->h, w, h
310  );
311  return;
312  }
313 
314  dst += r->y * dst_linesize + r->x * 4;
315  src = r->data[0];
316  pal = (uint32_t *)r->data[1];
317  for (y = 0; y < r->h; y++) {
318  dst2 = (uint32_t *)dst;
319  src2 = src;
320  for (x = 0; x < r->w; x++)
321  *(dst2++) = pal[*(src2++)];
322  dst += dst_linesize;
323  src += r->linesize[0];
324  }
325 }
326 
328 {
329  AVFrame *frame = ifp->sub2video.frame;
330  int ret;
331 
332  av_assert1(frame->data[0]);
333  ifp->sub2video.last_pts = frame->pts = pts;
337  if (ret != AVERROR_EOF && ret < 0)
339  "Error while add the frame to buffer source(%s).\n",
340  av_err2str(ret));
341 }
342 
343 static void sub2video_update(InputFilterPriv *ifp, int64_t heartbeat_pts,
344  const AVSubtitle *sub)
345 {
346  AVFrame *frame = ifp->sub2video.frame;
347  int8_t *dst;
348  int dst_linesize;
349  int num_rects;
350  int64_t pts, end_pts;
351 
352  if (sub) {
353  pts = av_rescale_q(sub->pts + sub->start_display_time * 1000LL,
354  AV_TIME_BASE_Q, ifp->time_base);
355  end_pts = av_rescale_q(sub->pts + sub->end_display_time * 1000LL,
356  AV_TIME_BASE_Q, ifp->time_base);
357  num_rects = sub->num_rects;
358  } else {
359  /* If we are initializing the system, utilize current heartbeat
360  PTS as the start time, and show until the following subpicture
361  is received. Otherwise, utilize the previous subpicture's end time
362  as the fall-back value. */
363  pts = ifp->sub2video.initialize ?
364  heartbeat_pts : ifp->sub2video.end_pts;
365  end_pts = INT64_MAX;
366  num_rects = 0;
367  }
368  if (sub2video_get_blank_frame(ifp) < 0) {
370  "Impossible to get a blank canvas.\n");
371  return;
372  }
373  dst = frame->data [0];
374  dst_linesize = frame->linesize[0];
375  for (int i = 0; i < num_rects; i++)
376  sub2video_copy_rect(dst, dst_linesize, frame->width, frame->height, sub->rects[i]);
377  sub2video_push_ref(ifp, pts);
378  ifp->sub2video.end_pts = end_pts;
379  ifp->sub2video.initialize = 0;
380 }
381 
382 /* Define a function for appending a list of allowed formats
383  * to an AVBPrint. If nonempty, the list will have a header. */
384 #define DEF_CHOOSE_FORMAT(name, type, var, supported_list, none, printf_format, get_name) \
385 static void choose_ ## name (OutputFilterPriv *ofp, AVBPrint *bprint) \
386 { \
387  if (ofp->var == none && !ofp->supported_list) \
388  return; \
389  av_bprintf(bprint, #name "="); \
390  if (ofp->var != none) { \
391  av_bprintf(bprint, printf_format, get_name(ofp->var)); \
392  } else { \
393  const type *p; \
394  \
395  for (p = ofp->supported_list; *p != none; p++) { \
396  av_bprintf(bprint, printf_format "|", get_name(*p)); \
397  } \
398  if (bprint->len > 0) \
399  bprint->str[--bprint->len] = '\0'; \
400  } \
401  av_bprint_chars(bprint, ':', 1); \
402 }
403 
406 
409 
411  "%d", )
412 
413 DEF_CHOOSE_FORMAT(color_spaces, enum AVColorSpace, color_space, color_spaces,
415 
416 DEF_CHOOSE_FORMAT(color_ranges, enum AVColorRange, color_range, color_ranges,
418 
419 DEF_CHOOSE_FORMAT(alpha_modes, enum AVAlphaMode, alpha_mode, alpha_modes,
421 
422 static void choose_channel_layouts(OutputFilterPriv *ofp, AVBPrint *bprint)
423 {
424  if (av_channel_layout_check(&ofp->ch_layout)) {
425  av_bprintf(bprint, "channel_layouts=");
426  av_channel_layout_describe_bprint(&ofp->ch_layout, bprint);
427  } else if (ofp->ch_layouts) {
428  const AVChannelLayout *p;
429 
430  av_bprintf(bprint, "channel_layouts=");
431  for (p = ofp->ch_layouts; p->nb_channels; p++) {
433  av_bprintf(bprint, "|");
434  }
435  if (bprint->len > 0)
436  bprint->str[--bprint->len] = '\0';
437  } else
438  return;
439  av_bprint_chars(bprint, ':', 1);
440 }
441 
442 static int read_binary(void *logctx, const char *path,
443  uint8_t **data, int *len)
444 {
445  AVIOContext *io = NULL;
446  int64_t fsize;
447  int ret;
448 
449  *data = NULL;
450  *len = 0;
451 
452  ret = avio_open2(&io, path, AVIO_FLAG_READ, &int_cb, NULL);
453  if (ret < 0) {
454  av_log(logctx, AV_LOG_ERROR, "Cannot open file '%s': %s\n",
455  path, av_err2str(ret));
456  return ret;
457  }
458 
459  fsize = avio_size(io);
460  if (fsize < 0 || fsize > INT_MAX) {
461  av_log(logctx, AV_LOG_ERROR, "Cannot obtain size of file %s\n", path);
462  ret = AVERROR(EIO);
463  goto fail;
464  }
465 
466  *data = av_malloc(fsize);
467  if (!*data) {
468  ret = AVERROR(ENOMEM);
469  goto fail;
470  }
471 
472  ret = avio_read(io, *data, fsize);
473  if (ret != fsize) {
474  av_log(logctx, AV_LOG_ERROR, "Error reading file %s\n", path);
475  ret = ret < 0 ? ret : AVERROR(EIO);
476  goto fail;
477  }
478 
479  *len = fsize;
480 
481  ret = 0;
482 fail:
483  avio_close(io);
484  if (ret < 0) {
485  av_freep(data);
486  *len = 0;
487  }
488  return ret;
489 }
490 
491 static int filter_opt_apply(void *logctx, AVFilterContext *f,
492  const char *key, const char *val)
493 {
494  const AVOption *o = NULL;
495  int ret;
496 
498  if (ret >= 0)
499  return 0;
500 
501  if (ret == AVERROR_OPTION_NOT_FOUND && key[0] == '/')
503  if (!o)
504  goto err_apply;
505 
506  // key is a valid option name prefixed with '/'
507  // interpret value as a path from which to load the actual option value
508  key++;
509 
510  if (o->type == AV_OPT_TYPE_BINARY) {
511  uint8_t *data;
512  int len;
513 
514  ret = read_binary(logctx, val, &data, &len);
515  if (ret < 0)
516  goto err_load;
517 
519  av_freep(&data);
520  } else {
521  char *data = read_file_to_string(val);
522  if (!data) {
523  ret = AVERROR(EIO);
524  goto err_load;
525  }
526 
528  av_freep(&data);
529  }
530  if (ret < 0)
531  goto err_apply;
532 
533  return 0;
534 
535 err_apply:
536  av_log(logctx, AV_LOG_ERROR,
537  "Error applying option '%s' to filter '%s': %s\n",
538  key, f->filter->name, av_err2str(ret));
539  return ret;
540 err_load:
541  av_log(logctx, AV_LOG_ERROR,
542  "Error loading value for option '%s' from file '%s'\n",
543  key, val);
544  return ret;
545 }
546 
547 static int graph_opts_apply(void *logctx, AVFilterGraphSegment *seg)
548 {
549  for (size_t i = 0; i < seg->nb_chains; i++) {
550  AVFilterChain *ch = seg->chains[i];
551 
552  for (size_t j = 0; j < ch->nb_filters; j++) {
553  AVFilterParams *p = ch->filters[j];
554  const AVDictionaryEntry *e = NULL;
555 
556  av_assert0(p->filter);
557 
558  while ((e = av_dict_iterate(p->opts, e))) {
559  int ret = filter_opt_apply(logctx, p->filter, e->key, e->value);
560  if (ret < 0)
561  return ret;
562  }
563 
564  av_dict_free(&p->opts);
565  }
566  }
567 
568  return 0;
569 }
570 
571 static int graph_parse(void *logctx,
572  AVFilterGraph *graph, const char *desc,
574  AVBufferRef *hw_device)
575 {
577  int ret;
578 
579  *inputs = NULL;
580  *outputs = NULL;
581 
582  ret = avfilter_graph_segment_parse(graph, desc, 0, &seg);
583  if (ret < 0)
584  return ret;
585 
587  if (ret < 0)
588  goto fail;
589 
590  if (hw_device) {
591  for (int i = 0; i < graph->nb_filters; i++) {
592  AVFilterContext *f = graph->filters[i];
593 
594  if (!(f->filter->flags & AVFILTER_FLAG_HWDEVICE))
595  continue;
596  f->hw_device_ctx = av_buffer_ref(hw_device);
597  if (!f->hw_device_ctx) {
598  ret = AVERROR(ENOMEM);
599  goto fail;
600  }
601  }
602  }
603 
604  ret = graph_opts_apply(logctx, seg);
605  if (ret < 0)
606  goto fail;
607 
609 
610 fail:
612  return ret;
613 }
614 
615 // Filters can be configured only if the formats of all inputs are known.
617 {
618  for (int i = 0; i < fg->nb_inputs; i++) {
620  if (ifp->format < 0)
621  return 0;
622  }
623  return 1;
624 }
625 
626 static int filter_thread(void *arg);
627 
628 static char *describe_filter_link(FilterGraph *fg, AVFilterInOut *inout, int in)
629 {
630  AVFilterContext *ctx = inout->filter_ctx;
631  AVFilterPad *pads = in ? ctx->input_pads : ctx->output_pads;
632  int nb_pads = in ? ctx->nb_inputs : ctx->nb_outputs;
633 
634  if (nb_pads > 1)
635  return av_strdup(ctx->filter->name);
636  return av_asprintf("%s:%s", ctx->filter->name,
637  avfilter_pad_get_name(pads, inout->pad_idx));
638 }
639 
640 static const char *ofilter_item_name(void *obj)
641 {
642  OutputFilterPriv *ofp = obj;
643  return ofp->log_name;
644 }
645 
646 static const AVClass ofilter_class = {
647  .class_name = "OutputFilter",
648  .version = LIBAVUTIL_VERSION_INT,
649  .item_name = ofilter_item_name,
650  .parent_log_context_offset = offsetof(OutputFilterPriv, log_parent),
651  .category = AV_CLASS_CATEGORY_FILTER,
652 };
653 
655 {
656  OutputFilterPriv *ofp;
657  OutputFilter *ofilter;
658 
659  ofp = allocate_array_elem(&fg->outputs, sizeof(*ofp), &fg->nb_outputs);
660  if (!ofp)
661  return NULL;
662 
663  ofilter = &ofp->ofilter;
664  ofilter->class = &ofilter_class;
665  ofp->log_parent = fg;
666  ofilter->graph = fg;
667  ofilter->type = type;
668  ofp->format = -1;
672  ofilter->index = fg->nb_outputs - 1;
673 
674  snprintf(ofp->log_name, sizeof(ofp->log_name), "%co%d",
675  av_get_media_type_string(type)[0], ofilter->index);
676 
677  return ofilter;
678 }
679 
680 static int ifilter_bind_ist(InputFilter *ifilter, InputStream *ist,
681  const ViewSpecifier *vs)
682 {
683  InputFilterPriv *ifp = ifp_from_ifilter(ifilter);
684  FilterGraphPriv *fgp = fgp_from_fg(ifilter->graph);
686  int ret;
687 
688  av_assert0(!ifp->bound);
689  ifp->bound = 1;
690 
691  if (ifilter->type != ist->par->codec_type &&
692  !(ifilter->type == AVMEDIA_TYPE_VIDEO && ist->par->codec_type == AVMEDIA_TYPE_SUBTITLE)) {
693  av_log(fgp, AV_LOG_ERROR, "Tried to connect %s stream to %s filtergraph input\n",
695  return AVERROR(EINVAL);
696  }
697 
698  ifp->type_src = ist->st->codecpar->codec_type;
699 
700  ifp->opts.fallback = av_frame_alloc();
701  if (!ifp->opts.fallback)
702  return AVERROR(ENOMEM);
703 
704  ret = ist_filter_add(ist, ifilter, filtergraph_is_simple(ifilter->graph),
705  vs, &ifp->opts, &src);
706  if (ret < 0)
707  return ret;
708 
709  ifilter->input_name = av_strdup(ifp->opts.name);
710  if (!ifilter->input_name)
711  return AVERROR(EINVAL);
712 
713  ret = sch_connect(fgp->sch,
714  src, SCH_FILTER_IN(fgp->sch_idx, ifilter->index));
715  if (ret < 0)
716  return ret;
717 
718  if (ifp->type_src == AVMEDIA_TYPE_SUBTITLE) {
719  ifp->sub2video.frame = av_frame_alloc();
720  if (!ifp->sub2video.frame)
721  return AVERROR(ENOMEM);
722 
723  ifp->width = ifp->opts.sub2video_width;
724  ifp->height = ifp->opts.sub2video_height;
725 
726  /* rectangles are AV_PIX_FMT_PAL8, but we have no guarantee that the
727  palettes for all rectangles are identical or compatible */
728  ifp->format = AV_PIX_FMT_RGB32;
729 
730  ifp->time_base = AV_TIME_BASE_Q;
731 
732  av_log(fgp, AV_LOG_VERBOSE, "sub2video: using %dx%d canvas\n",
733  ifp->width, ifp->height);
734  }
735 
736  return 0;
737 }
738 
740  const ViewSpecifier *vs)
741 {
744  int ret;
745 
746  av_assert0(!ifp->bound);
747  ifp->bound = 1;
748 
749  if (ifp->ifilter.type != dec->type) {
750  av_log(fgp, AV_LOG_ERROR, "Tried to connect %s decoder to %s filtergraph input\n",
752  return AVERROR(EINVAL);
753  }
754 
755  ifp->type_src = ifp->ifilter.type;
756 
757  ret = dec_filter_add(dec, &ifp->ifilter, &ifp->opts, vs, &src);
758  if (ret < 0)
759  return ret;
760 
761  ifp->ifilter.input_name = av_strdup(ifp->opts.name);
762  if (!ifp->ifilter.input_name)
763  return AVERROR(EINVAL);
764 
765  ret = sch_connect(fgp->sch, src, SCH_FILTER_IN(fgp->sch_idx, ifp->ifilter.index));
766  if (ret < 0)
767  return ret;
768 
769  return 0;
770 }
771 
772 static int set_channel_layout(OutputFilterPriv *f, const AVChannelLayout *layouts_allowed,
773  const AVChannelLayout *layout_requested)
774 {
775  int i, err;
776 
777  if (layout_requested->order != AV_CHANNEL_ORDER_UNSPEC) {
778  /* Pass the layout through for all orders but UNSPEC */
779  err = av_channel_layout_copy(&f->ch_layout, layout_requested);
780  if (err < 0)
781  return err;
782  return 0;
783  }
784 
785  /* Requested layout is of order UNSPEC */
786  if (!layouts_allowed) {
787  /* Use the default native layout for the requested amount of channels when the
788  encoder doesn't have a list of supported layouts */
789  av_channel_layout_default(&f->ch_layout, layout_requested->nb_channels);
790  return 0;
791  }
792  /* Encoder has a list of supported layouts. Pick the first layout in it with the
793  same amount of channels as the requested layout */
794  for (i = 0; layouts_allowed[i].nb_channels; i++) {
795  if (layouts_allowed[i].nb_channels == layout_requested->nb_channels)
796  break;
797  }
798  if (layouts_allowed[i].nb_channels) {
799  /* Use it if one is found */
800  err = av_channel_layout_copy(&f->ch_layout, &layouts_allowed[i]);
801  if (err < 0)
802  return err;
803  return 0;
804  }
805  /* If no layout for the amount of channels requested was found, use the default
806  native layout for it. */
807  av_channel_layout_default(&f->ch_layout, layout_requested->nb_channels);
808 
809  return 0;
810 }
811 
812 int ofilter_bind_enc(OutputFilter *ofilter, unsigned sched_idx_enc,
813  const OutputFilterOptions *opts)
814 {
815  OutputFilterPriv *ofp = ofp_from_ofilter(ofilter);
816  FilterGraph *fg = ofilter->graph;
817  FilterGraphPriv *fgp = fgp_from_fg(fg);
818  int ret;
819 
820  av_assert0(!ofilter->bound);
821  av_assert0(!opts->enc ||
822  ofilter->type == opts->enc->type);
823 
824  ofp->needed = ofilter->bound = 1;
825  av_freep(&ofilter->linklabel);
826 
827  ofp->flags |= opts->flags;
828  ofp->ts_offset = opts->ts_offset;
829  ofp->enc_timebase = opts->output_tb;
830 
831  ofp->trim_start_us = opts->trim_start_us;
832  ofp->trim_duration_us = opts->trim_duration_us;
833 
834  ofilter->output_name = av_strdup(opts->name);
835  if (!ofilter->output_name)
836  return AVERROR(EINVAL);
837 
838  ret = av_dict_copy(&ofp->sws_opts, opts->sws_opts, 0);
839  if (ret < 0)
840  return ret;
841 
842  ret = av_dict_copy(&ofp->swr_opts, opts->swr_opts, 0);
843  if (ret < 0)
844  return ret;
845 
846  if (opts->flags & OFILTER_FLAG_AUDIO_24BIT)
847  av_dict_set(&ofp->swr_opts, "output_sample_bits", "24", 0);
848 
849  if (fgp->is_simple) {
850  // for simple filtergraph there is just one output,
851  // so use only graph-level information for logging
852  ofp->log_parent = NULL;
853  av_strlcpy(ofp->log_name, fgp->log_name, sizeof(ofp->log_name));
854  } else
855  av_strlcatf(ofp->log_name, sizeof(ofp->log_name), "->%s", ofilter->output_name);
856 
857  switch (ofilter->type) {
858  case AVMEDIA_TYPE_VIDEO:
859  ofp->width = opts->width;
860  ofp->height = opts->height;
861  if (opts->format != AV_PIX_FMT_NONE) {
862  ofp->format = opts->format;
863  } else
864  ofp->pix_fmts = opts->pix_fmts;
865 
866  if (opts->color_space != AVCOL_SPC_UNSPECIFIED)
867  ofp->color_space = opts->color_space;
868  else
869  ofp->color_spaces = opts->color_spaces;
870 
871  if (opts->color_range != AVCOL_RANGE_UNSPECIFIED)
872  ofp->color_range = opts->color_range;
873  else
874  ofp->color_ranges = opts->color_ranges;
875 
876  if (opts->alpha_mode != AVALPHA_MODE_UNSPECIFIED)
877  ofp->alpha_mode = opts->alpha_mode;
878  else
879  ofp->alpha_modes = opts->alpha_modes;
880 
882 
883  ofp->fps.last_frame = av_frame_alloc();
884  if (!ofp->fps.last_frame)
885  return AVERROR(ENOMEM);
886 
887  ofp->fps.vsync_method = opts->vsync_method;
888  ofp->fps.framerate = opts->frame_rate;
889  ofp->fps.framerate_max = opts->max_frame_rate;
890  ofp->fps.framerate_supported = opts->frame_rates;
891 
892  // reduce frame rate for mpeg4 to be within the spec limits
893  if (opts->enc && opts->enc->id == AV_CODEC_ID_MPEG4)
894  ofp->fps.framerate_clip = 65535;
895 
896  ofp->fps.dup_warning = 1000;
897 
898  break;
899  case AVMEDIA_TYPE_AUDIO:
900  if (opts->format != AV_SAMPLE_FMT_NONE) {
901  ofp->format = opts->format;
902  } else {
903  ofp->sample_fmts = opts->sample_fmts;
904  }
905  if (opts->sample_rate) {
906  ofp->sample_rate = opts->sample_rate;
907  } else
908  ofp->sample_rates = opts->sample_rates;
909  if (opts->ch_layout.nb_channels) {
910  int ret = set_channel_layout(ofp, opts->ch_layouts, &opts->ch_layout);
911  if (ret < 0)
912  return ret;
913  } else {
914  ofp->ch_layouts = opts->ch_layouts;
915  }
916  break;
917  }
918 
919  ret = sch_connect(fgp->sch, SCH_FILTER_OUT(fgp->sch_idx, ofilter->index),
920  SCH_ENC(sched_idx_enc));
921  if (ret < 0)
922  return ret;
923 
924  return 0;
925 }
926 
928  const OutputFilterOptions *opts)
929 {
930  OutputFilterPriv *ofp = ofp_from_ofilter(ofilter);
931 
932  av_assert0(!ofilter->bound);
933  av_assert0(ofilter->type == ifp->ifilter.type);
934 
935  ofp->needed = ofilter->bound = 1;
936  av_freep(&ofilter->linklabel);
937 
938  ofilter->output_name = av_strdup(opts->name);
939  if (!ofilter->output_name)
940  return AVERROR(EINVAL);
941 
942  ifp->ofilter_src = ofilter;
943 
944  av_strlcatf(ofp->log_name, sizeof(ofp->log_name), "->%s", ofilter->output_name);
945 
946  return 0;
947 }
948 
949 static int ifilter_bind_fg(InputFilterPriv *ifp, FilterGraph *fg_src, int out_idx)
950 {
952  OutputFilter *ofilter_src = fg_src->outputs[out_idx];
954  char name[32];
955  int ret;
956 
957  av_assert0(!ifp->bound);
958  ifp->bound = 1;
959 
960  if (ifp->ifilter.type != ofilter_src->type) {
961  av_log(fgp, AV_LOG_ERROR, "Tried to connect %s output to %s input\n",
962  av_get_media_type_string(ofilter_src->type),
964  return AVERROR(EINVAL);
965  }
966 
967  ifp->type_src = ifp->ifilter.type;
968 
969  memset(&opts, 0, sizeof(opts));
970 
971  snprintf(name, sizeof(name), "fg:%d:%d", fgp->fg.index, ifp->ifilter.index);
972  opts.name = name;
973 
974  ret = ofilter_bind_ifilter(ofilter_src, ifp, &opts);
975  if (ret < 0)
976  return ret;
977 
978  ret = sch_connect(fgp->sch, SCH_FILTER_OUT(fg_src->index, out_idx),
979  SCH_FILTER_IN(fgp->sch_idx, ifp->ifilter.index));
980  if (ret < 0)
981  return ret;
982 
983  return 0;
984 }
985 
987 {
988  InputFilterPriv *ifp;
989  InputFilter *ifilter;
990 
991  ifp = allocate_array_elem(&fg->inputs, sizeof(*ifp), &fg->nb_inputs);
992  if (!ifp)
993  return NULL;
994 
995  ifilter = &ifp->ifilter;
996  ifilter->graph = fg;
997 
998  ifp->frame = av_frame_alloc();
999  if (!ifp->frame)
1000  return NULL;
1001 
1002  ifilter->index = fg->nb_inputs - 1;
1003  ifp->format = -1;
1007 
1009  if (!ifp->frame_queue)
1010  return NULL;
1011 
1012  return ifilter;
1013 }
1014 
1016 {
1017  FilterGraph *fg = *pfg;
1018  FilterGraphPriv *fgp;
1019 
1020  if (!fg)
1021  return;
1022  fgp = fgp_from_fg(fg);
1023 
1024  for (int j = 0; j < fg->nb_inputs; j++) {
1025  InputFilter *ifilter = fg->inputs[j];
1026  InputFilterPriv *ifp = ifp_from_ifilter(ifilter);
1027 
1028  if (ifp->frame_queue) {
1029  AVFrame *frame;
1030  while (av_fifo_read(ifp->frame_queue, &frame, 1) >= 0)
1031  av_frame_free(&frame);
1032  av_fifo_freep2(&ifp->frame_queue);
1033  }
1034  av_frame_free(&ifp->sub2video.frame);
1035 
1036  av_frame_free(&ifp->frame);
1037  av_frame_free(&ifp->opts.fallback);
1038 
1041  av_freep(&ifilter->linklabel);
1042  av_freep(&ifp->opts.name);
1044  av_freep(&ifilter->name);
1045  av_freep(&ifilter->input_name);
1046  av_freep(&fg->inputs[j]);
1047  }
1048  av_freep(&fg->inputs);
1049  for (int j = 0; j < fg->nb_outputs; j++) {
1050  OutputFilter *ofilter = fg->outputs[j];
1051  OutputFilterPriv *ofp = ofp_from_ofilter(ofilter);
1052 
1053  av_frame_free(&ofp->fps.last_frame);
1054  av_dict_free(&ofp->sws_opts);
1055  av_dict_free(&ofp->swr_opts);
1056 
1057  av_freep(&ofilter->linklabel);
1058  av_freep(&ofilter->name);
1059  av_freep(&ofilter->output_name);
1060  av_freep(&ofilter->apad);
1063  av_freep(&fg->outputs[j]);
1064  }
1065  av_freep(&fg->outputs);
1066  av_freep(&fg->graph_desc);
1067 
1068  av_frame_free(&fgp->frame);
1069  av_frame_free(&fgp->frame_enc);
1070 
1071  av_freep(pfg);
1072 }
1073 
1074 static const char *fg_item_name(void *obj)
1075 {
1076  const FilterGraphPriv *fgp = obj;
1077 
1078  return fgp->log_name;
1079 }
1080 
1081 static const AVClass fg_class = {
1082  .class_name = "FilterGraph",
1083  .version = LIBAVUTIL_VERSION_INT,
1084  .item_name = fg_item_name,
1085  .category = AV_CLASS_CATEGORY_FILTER,
1086 };
1087 
1088 int fg_create(FilterGraph **pfg, char **graph_desc, Scheduler *sch,
1089  const OutputFilterOptions *opts)
1090 {
1091  FilterGraphPriv *fgp;
1092  FilterGraph *fg;
1093 
1095  AVFilterGraph *graph;
1096  int ret = 0;
1097 
1098  fgp = av_mallocz(sizeof(*fgp));
1099  if (!fgp) {
1100  av_freep(graph_desc);
1101  return AVERROR(ENOMEM);
1102  }
1103  fg = &fgp->fg;
1104 
1105  if (pfg) {
1106  *pfg = fg;
1107  fg->index = -1;
1108  } else {
1110  if (ret < 0) {
1111  av_freep(graph_desc);
1112  av_freep(&fgp);
1113  return ret;
1114  }
1115 
1116  fg->index = nb_filtergraphs - 1;
1117  }
1118 
1119  fg->class = &fg_class;
1120  fg->graph_desc = *graph_desc;
1122  fgp->nb_threads = -1;
1123  fgp->sch = sch;
1124 
1125  *graph_desc = NULL;
1126 
1127  snprintf(fgp->log_name, sizeof(fgp->log_name), "fc#%d", fg->index);
1128 
1129  fgp->frame = av_frame_alloc();
1130  fgp->frame_enc = av_frame_alloc();
1131  if (!fgp->frame || !fgp->frame_enc)
1132  return AVERROR(ENOMEM);
1133 
1134  /* this graph is only used for determining the kinds of inputs
1135  * and outputs we have, and is discarded on exit from this function */
1136  graph = avfilter_graph_alloc();
1137  if (!graph)
1138  return AVERROR(ENOMEM);;
1139  graph->nb_threads = 1;
1140 
1141  ret = graph_parse(fg, graph, fg->graph_desc, &inputs, &outputs,
1143  if (ret < 0)
1144  goto fail;
1145 
1146  for (AVFilterInOut *cur = inputs; cur; cur = cur->next) {
1147  InputFilter *const ifilter = ifilter_alloc(fg);
1148 
1149  if (!ifilter) {
1150  ret = AVERROR(ENOMEM);
1151  goto fail;
1152  }
1153 
1154  ifilter->linklabel = cur->name;
1155  cur->name = NULL;
1156 
1157  ifilter->type = avfilter_pad_get_type(cur->filter_ctx->input_pads,
1158  cur->pad_idx);
1159 
1160  if (ifilter->type != AVMEDIA_TYPE_VIDEO && ifilter->type != AVMEDIA_TYPE_AUDIO) {
1161  av_log(fg, AV_LOG_FATAL, "Only video and audio filters supported "
1162  "currently.\n");
1163  ret = AVERROR(ENOSYS);
1164  goto fail;
1165  }
1166 
1167  ifilter->name = describe_filter_link(fg, cur, 1);
1168  if (!ifilter->name) {
1169  ret = AVERROR(ENOMEM);
1170  goto fail;
1171  }
1172  }
1173 
1174  for (AVFilterInOut *cur = outputs; cur; cur = cur->next) {
1175  const enum AVMediaType type = avfilter_pad_get_type(cur->filter_ctx->output_pads,
1176  cur->pad_idx);
1177  OutputFilter *const ofilter = ofilter_alloc(fg, type);
1178  OutputFilterPriv *ofp;
1179 
1180  if (!ofilter) {
1181  ret = AVERROR(ENOMEM);
1182  goto fail;
1183  }
1184  ofp = ofp_from_ofilter(ofilter);
1185 
1186  ofilter->linklabel = cur->name;
1187  cur->name = NULL;
1188 
1189  ofilter->name = describe_filter_link(fg, cur, 0);
1190  if (!ofilter->name) {
1191  ret = AVERROR(ENOMEM);
1192  goto fail;
1193  }
1194 
1195  // opts should only be needed in this function to fill fields from filtergraphs
1196  // whose output is meant to be treated as if it was stream, e.g. merged HEIF
1197  // tile groups.
1198  if (opts) {
1199  ofp->flags = opts->flags;
1200  ofp->side_data = opts->side_data;
1201  ofp->nb_side_data = opts->nb_side_data;
1202 
1203  ofp->crop_top = opts->crop_top;
1204  ofp->crop_bottom = opts->crop_bottom;
1205  ofp->crop_left = opts->crop_left;
1206  ofp->crop_right = opts->crop_right;
1207 
1210  if (sd)
1211  memcpy(ofp->displaymatrix, sd->data, sizeof(ofp->displaymatrix));
1212  }
1213  }
1214 
1215  if (!fg->nb_outputs) {
1216  av_log(fg, AV_LOG_FATAL, "A filtergraph has zero outputs, this is not supported\n");
1217  ret = AVERROR(ENOSYS);
1218  goto fail;
1219  }
1220 
1221  ret = sch_add_filtergraph(sch, fg->nb_inputs, fg->nb_outputs,
1222  filter_thread, fgp);
1223  if (ret < 0)
1224  goto fail;
1225  fgp->sch_idx = ret;
1226 
1227 fail:
1230  avfilter_graph_free(&graph);
1231 
1232  if (ret < 0)
1233  return ret;
1234 
1235  return 0;
1236 }
1237 
1239  InputStream *ist,
1240  char **graph_desc,
1241  Scheduler *sch, unsigned sched_idx_enc,
1242  const OutputFilterOptions *opts)
1243 {
1244  const enum AVMediaType type = ist->par->codec_type;
1245  FilterGraph *fg;
1246  FilterGraphPriv *fgp;
1247  int ret;
1248 
1249  ret = fg_create(pfg, graph_desc, sch, NULL);
1250  if (ret < 0)
1251  return ret;
1252  fg = *pfg;
1253  fgp = fgp_from_fg(fg);
1254 
1255  fgp->is_simple = 1;
1256 
1257  snprintf(fgp->log_name, sizeof(fgp->log_name), "%cf%s",
1258  av_get_media_type_string(type)[0], opts->name);
1259 
1260  if (fg->nb_inputs != 1 || fg->nb_outputs != 1) {
1261  av_log(fg, AV_LOG_ERROR, "Simple filtergraph '%s' was expected "
1262  "to have exactly 1 input and 1 output. "
1263  "However, it had %d input(s) and %d output(s). Please adjust, "
1264  "or use a complex filtergraph (-filter_complex) instead.\n",
1265  *graph_desc, fg->nb_inputs, fg->nb_outputs);
1266  return AVERROR(EINVAL);
1267  }
1268  if (fg->outputs[0]->type != type) {
1269  av_log(fg, AV_LOG_ERROR, "Filtergraph has a %s output, cannot connect "
1270  "it to %s output stream\n",
1273  return AVERROR(EINVAL);
1274  }
1275 
1276  ret = ifilter_bind_ist(fg->inputs[0], ist, opts->vs);
1277  if (ret < 0)
1278  return ret;
1279 
1280  ret = ofilter_bind_enc(fg->outputs[0], sched_idx_enc, opts);
1281  if (ret < 0)
1282  return ret;
1283 
1284  if (opts->nb_threads >= 0)
1285  fgp->nb_threads = opts->nb_threads;
1286 
1287  return 0;
1288 }
1289 
1290 static int fg_complex_bind_input(FilterGraph *fg, InputFilter *ifilter, int commit)
1291 {
1292  InputFilterPriv *ifp = ifp_from_ifilter(ifilter);
1293  InputStream *ist = NULL;
1294  enum AVMediaType type = ifilter->type;
1296  const char *spec;
1297  char *p;
1298  int i, ret;
1299 
1300  if (ifilter->linklabel && !strncmp(ifilter->linklabel, "dec:", 4)) {
1301  // bind to a standalone decoder
1302  int dec_idx;
1303 
1304  dec_idx = strtol(ifilter->linklabel + 4, &p, 0);
1305  if (dec_idx < 0 || dec_idx >= nb_decoders) {
1306  av_log(fg, AV_LOG_ERROR, "Invalid decoder index %d in filtergraph description %s\n",
1307  dec_idx, fg->graph_desc);
1308  return AVERROR(EINVAL);
1309  }
1310 
1311  if (type == AVMEDIA_TYPE_VIDEO) {
1312  spec = *p == ':' ? p + 1 : p;
1313  ret = view_specifier_parse(&spec, &vs);
1314  if (ret < 0)
1315  return ret;
1316  }
1317 
1318  ret = ifilter_bind_dec(ifp, decoders[dec_idx], &vs);
1319  if (ret < 0)
1320  av_log(fg, AV_LOG_ERROR, "Error binding a decoder to filtergraph input %s\n",
1321  ifilter->name);
1322  return ret;
1323  } else if (ifilter->linklabel) {
1325  AVFormatContext *s;
1326  AVStream *st = NULL;
1327  int file_idx;
1328 
1329  // try finding an unbound filtergraph output with this label
1330  for (int i = 0; i < nb_filtergraphs; i++) {
1331  FilterGraph *fg_src = filtergraphs[i];
1332 
1333  if (fg == fg_src)
1334  continue;
1335 
1336  for (int j = 0; j < fg_src->nb_outputs; j++) {
1337  OutputFilter *ofilter = fg_src->outputs[j];
1338 
1339  if (!ofilter->bound && ofilter->linklabel &&
1340  !strcmp(ofilter->linklabel, ifilter->linklabel)) {
1341  if (commit) {
1342  av_log(fg, AV_LOG_VERBOSE,
1343  "Binding input with label '%s' to filtergraph output %d:%d\n",
1344  ifilter->linklabel, i, j);
1345 
1346  ret = ifilter_bind_fg(ifp, fg_src, j);
1347  if (ret < 0) {
1348  av_log(fg, AV_LOG_ERROR, "Error binding filtergraph input %s\n",
1349  ifilter->linklabel);
1350  return ret;
1351  }
1352  } else
1353  ofp_from_ofilter(ofilter)->needed = 1;
1354  return 0;
1355  }
1356  }
1357  }
1358 
1359  // bind to an explicitly specified demuxer stream
1360  file_idx = strtol(ifilter->linklabel, &p, 0);
1361  if (file_idx < 0 || file_idx >= nb_input_files) {
1362  av_log(fg, AV_LOG_FATAL, "Invalid file index %d in filtergraph description %s.\n",
1363  file_idx, fg->graph_desc);
1364  return AVERROR(EINVAL);
1365  }
1366  s = input_files[file_idx]->ctx;
1367 
1368  ret = stream_specifier_parse(&ss, *p == ':' ? p + 1 : p, 1, fg);
1369  if (ret < 0) {
1370  av_log(fg, AV_LOG_ERROR, "Invalid stream specifier: %s\n", p);
1371  return ret;
1372  }
1373 
1374  if (type == AVMEDIA_TYPE_VIDEO) {
1375  spec = ss.remainder ? ss.remainder : "";
1376  ret = view_specifier_parse(&spec, &vs);
1377  if (ret < 0) {
1379  return ret;
1380  }
1381  }
1382 
1383  for (i = 0; i < s->nb_streams; i++) {
1384  enum AVMediaType stream_type = s->streams[i]->codecpar->codec_type;
1385  if (stream_type != type &&
1386  !(stream_type == AVMEDIA_TYPE_SUBTITLE &&
1387  type == AVMEDIA_TYPE_VIDEO /* sub2video hack */))
1388  continue;
1389  if (stream_specifier_match(&ss, s, s->streams[i], fg)) {
1390  st = s->streams[i];
1391  break;
1392  }
1393  }
1395  if (!st) {
1396  av_log(fg, AV_LOG_FATAL, "Stream specifier '%s' in filtergraph description %s "
1397  "matches no streams.\n", p, fg->graph_desc);
1398  return AVERROR(EINVAL);
1399  }
1400  ist = input_files[file_idx]->streams[st->index];
1401 
1402  if (commit)
1403  av_log(fg, AV_LOG_VERBOSE,
1404  "Binding input with label '%s' to input stream %d:%d\n",
1405  ifilter->linklabel, ist->file->index, ist->index);
1406  } else {
1407  // try finding an unbound filtergraph output
1408  for (int i = 0; i < nb_filtergraphs; i++) {
1409  FilterGraph *fg_src = filtergraphs[i];
1410 
1411  if (fg == fg_src)
1412  continue;
1413 
1414  for (int j = 0; j < fg_src->nb_outputs; j++) {
1415  OutputFilter *ofilter = fg_src->outputs[j];
1416 
1417  if (!ofilter->bound) {
1418  if (commit) {
1419  av_log(fg, AV_LOG_VERBOSE,
1420  "Binding unlabeled filtergraph input to filtergraph output %d:%d\n", i, j);
1421 
1422  ret = ifilter_bind_fg(ifp, fg_src, j);
1423  if (ret < 0) {
1424  av_log(fg, AV_LOG_ERROR, "Error binding filtergraph input %d:%d\n", i, j);
1425  return ret;
1426  }
1427  } else
1428  ofp_from_ofilter(ofilter)->needed = 1;
1429  return 0;
1430  }
1431  }
1432  }
1433 
1434  ist = ist_find_unused(type);
1435  if (!ist) {
1436  av_log(fg, AV_LOG_FATAL,
1437  "Cannot find an unused %s input stream to feed the "
1438  "unlabeled input pad %s.\n",
1439  av_get_media_type_string(type), ifilter->name);
1440  return AVERROR(EINVAL);
1441  }
1442 
1443  if (commit)
1444  av_log(fg, AV_LOG_VERBOSE,
1445  "Binding unlabeled input %d to input stream %d:%d\n",
1446  ifilter->index, ist->file->index, ist->index);
1447  }
1448  av_assert0(ist);
1449 
1450  if (commit) {
1451  ret = ifilter_bind_ist(ifilter, ist, &vs);
1452  if (ret < 0) {
1453  av_log(fg, AV_LOG_ERROR,
1454  "Error binding an input stream to complex filtergraph input %s.\n",
1455  ifilter->name);
1456  return ret;
1457  }
1458  }
1459 
1460  return 0;
1461 }
1462 
1463 static int bind_inputs(FilterGraph *fg, int commit)
1464 {
1465  // bind filtergraph inputs to input streams or other filtergraphs
1466  for (int i = 0; i < fg->nb_inputs; i++) {
1468  int ret;
1469 
1470  if (ifp->bound)
1471  continue;
1472 
1473  ret = fg_complex_bind_input(fg, &ifp->ifilter, commit);
1474  if (ret < 0)
1475  return ret;
1476  }
1477 
1478  return 0;
1479 }
1480 
1482 {
1483  int ret;
1484 
1485  for (int i = 0; i < nb_filtergraphs; i++) {
1486  ret = bind_inputs(filtergraphs[i], 0);
1487  if (ret < 0)
1488  return ret;
1489  }
1490 
1491  // check that all outputs were bound
1492  for (int i = nb_filtergraphs - 1; i >= 0; i--) {
1493  FilterGraph *fg = filtergraphs[i];
1495 
1496  for (int j = 0; j < fg->nb_outputs; j++) {
1497  OutputFilter *output = fg->outputs[j];
1498  if (!ofp_from_ofilter(output)->needed) {
1499  if (!fg->is_internal) {
1500  av_log(fg, AV_LOG_FATAL,
1501  "Filter '%s' has output %d (%s) unconnected\n",
1502  output->name, j,
1503  output->linklabel ? (const char *)output->linklabel : "unlabeled");
1504  return AVERROR(EINVAL);
1505  }
1506 
1507  av_log(fg, AV_LOG_DEBUG,
1508  "Internal filter '%s' has output %d (%s) unconnected. Removing graph\n",
1509  output->name, j,
1510  output->linklabel ? (const char *)output->linklabel : "unlabeled");
1511  sch_remove_filtergraph(fgp->sch, fgp->sch_idx);
1512  fg_free(&filtergraphs[i]);
1513  nb_filtergraphs--;
1514  if (nb_filtergraphs > 0)
1515  memmove(&filtergraphs[i],
1516  &filtergraphs[i + 1],
1517  (nb_filtergraphs - i) * sizeof(*filtergraphs));
1518  break;
1519  }
1520  }
1521  }
1522 
1523  for (int i = 0; i < nb_filtergraphs; i++) {
1524  ret = bind_inputs(filtergraphs[i], 1);
1525  if (ret < 0)
1526  return ret;
1527  }
1528 
1529  return 0;
1530 }
1531 
1532 static int insert_trim(void *logctx, int64_t start_time, int64_t duration,
1533  AVFilterContext **last_filter, int *pad_idx,
1534  const char *filter_name)
1535 {
1536  AVFilterGraph *graph = (*last_filter)->graph;
1538  const AVFilter *trim;
1539  enum AVMediaType type = avfilter_pad_get_type((*last_filter)->output_pads, *pad_idx);
1540  const char *name = (type == AVMEDIA_TYPE_VIDEO) ? "trim" : "atrim";
1541  int ret = 0;
1542 
1543  if (duration == INT64_MAX && start_time == AV_NOPTS_VALUE)
1544  return 0;
1545 
1546  trim = avfilter_get_by_name(name);
1547  if (!trim) {
1548  av_log(logctx, AV_LOG_ERROR, "%s filter not present, cannot limit "
1549  "recording time.\n", name);
1550  return AVERROR_FILTER_NOT_FOUND;
1551  }
1552 
1553  ctx = avfilter_graph_alloc_filter(graph, trim, filter_name);
1554  if (!ctx)
1555  return AVERROR(ENOMEM);
1556 
1557  if (duration != INT64_MAX) {
1558  ret = av_opt_set_int(ctx, "durationi", duration,
1560  }
1561  if (ret >= 0 && start_time != AV_NOPTS_VALUE) {
1562  ret = av_opt_set_int(ctx, "starti", start_time,
1564  }
1565  if (ret < 0) {
1566  av_log(ctx, AV_LOG_ERROR, "Error configuring the %s filter", name);
1567  return ret;
1568  }
1569 
1571  if (ret < 0)
1572  return ret;
1573 
1574  ret = avfilter_link(*last_filter, *pad_idx, ctx, 0);
1575  if (ret < 0)
1576  return ret;
1577 
1578  *last_filter = ctx;
1579  *pad_idx = 0;
1580  return 0;
1581 }
1582 
1583 static int insert_filter(AVFilterContext **last_filter, int *pad_idx,
1584  const char *filter_name, const char *args)
1585 {
1586  AVFilterGraph *graph = (*last_filter)->graph;
1587  const AVFilter *filter = avfilter_get_by_name(filter_name);
1589  int ret;
1590 
1591  if (!filter)
1592  return AVERROR_BUG;
1593 
1595  filter,
1596  filter_name, args, NULL, graph);
1597  if (ret < 0)
1598  return ret;
1599 
1600  ret = avfilter_link(*last_filter, *pad_idx, ctx, 0);
1601  if (ret < 0)
1602  return ret;
1603 
1604  *last_filter = ctx;
1605  *pad_idx = 0;
1606  return 0;
1607 }
1608 
1610  OutputFilter *ofilter, AVFilterInOut *out)
1611 {
1612  OutputFilterPriv *ofp = ofp_from_ofilter(ofilter);
1613  AVFilterContext *last_filter = out->filter_ctx;
1614  AVBPrint bprint;
1615  int pad_idx = out->pad_idx;
1616  int ret;
1617  char name[255];
1618 
1619  snprintf(name, sizeof(name), "out_%s", ofilter->output_name);
1621  avfilter_get_by_name("buffersink"),
1622  name, NULL, NULL, graph);
1623 
1624  if (ret < 0)
1625  return ret;
1626 
1627  if (ofp->flags & OFILTER_FLAG_CROP) {
1628  char crop_buf[64];
1629  snprintf(crop_buf, sizeof(crop_buf), "w=iw-%u-%u:h=ih-%u-%u:x=%u:y=%u",
1630  ofp->crop_left, ofp->crop_right,
1631  ofp->crop_top, ofp->crop_bottom,
1632  ofp->crop_left, ofp->crop_top);
1633  ret = insert_filter(&last_filter, &pad_idx, "crop", crop_buf);
1634  if (ret < 0)
1635  return ret;
1636  }
1637 
1638  if (ofp->flags & OFILTER_FLAG_AUTOROTATE) {
1639  int32_t *displaymatrix = ofp->displaymatrix;
1640  double theta;
1641 
1642  theta = get_rotation(displaymatrix);
1643 
1644  if (fabs(theta - 90) < 1.0) {
1645  ret = insert_filter(&last_filter, &pad_idx, "transpose",
1646  displaymatrix[3] > 0 ? "cclock_flip" : "clock");
1647  } else if (fabs(theta - 180) < 1.0) {
1648  if (displaymatrix[0] < 0) {
1649  ret = insert_filter(&last_filter, &pad_idx, "hflip", NULL);
1650  if (ret < 0)
1651  return ret;
1652  }
1653  if (displaymatrix[4] < 0) {
1654  ret = insert_filter(&last_filter, &pad_idx, "vflip", NULL);
1655  }
1656  } else if (fabs(theta - 270) < 1.0) {
1657  ret = insert_filter(&last_filter, &pad_idx, "transpose",
1658  displaymatrix[3] < 0 ? "clock_flip" : "cclock");
1659  } else if (fabs(theta) > 1.0) {
1660  char rotate_buf[64];
1661  snprintf(rotate_buf, sizeof(rotate_buf), "%f*PI/180", theta);
1662  ret = insert_filter(&last_filter, &pad_idx, "rotate", rotate_buf);
1663  } else if (fabs(theta) < 1.0) {
1664  if (displaymatrix && displaymatrix[4] < 0) {
1665  ret = insert_filter(&last_filter, &pad_idx, "vflip", NULL);
1666  }
1667  }
1668  if (ret < 0)
1669  return ret;
1670 
1672  }
1673 
1674  if ((ofp->width || ofp->height) && (ofp->flags & OFILTER_FLAG_AUTOSCALE) &&
1675  // skip add scale for hardware format
1676  !(ofp->format != AV_PIX_FMT_NONE &&
1678  char args[255];
1680  const AVDictionaryEntry *e = NULL;
1681 
1682  snprintf(args, sizeof(args), "%d:%d",
1683  ofp->width, ofp->height);
1684 
1685  while ((e = av_dict_iterate(ofp->sws_opts, e))) {
1686  av_strlcatf(args, sizeof(args), ":%s=%s", e->key, e->value);
1687  }
1688 
1689  snprintf(name, sizeof(name), "scaler_out_%s", ofilter->output_name);
1691  name, args, NULL, graph)) < 0)
1692  return ret;
1693  if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
1694  return ret;
1695 
1696  last_filter = filter;
1697  pad_idx = 0;
1698  }
1699 
1701  ofp->format != AV_PIX_FMT_NONE || !ofp->pix_fmts);
1703  choose_pix_fmts(ofp, &bprint);
1704  choose_color_spaces(ofp, &bprint);
1705  choose_color_ranges(ofp, &bprint);
1706  choose_alpha_modes(ofp, &bprint);
1707  if (!av_bprint_is_complete(&bprint))
1708  return AVERROR(ENOMEM);
1709 
1710  if (bprint.len) {
1712 
1714  avfilter_get_by_name("format"),
1715  "format", bprint.str, NULL, graph);
1716  av_bprint_finalize(&bprint, NULL);
1717  if (ret < 0)
1718  return ret;
1719  if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
1720  return ret;
1721 
1722  last_filter = filter;
1723  pad_idx = 0;
1724  }
1725 
1726  snprintf(name, sizeof(name), "trim_out_%s", ofilter->output_name);
1727  ret = insert_trim(fgp, ofp->trim_start_us, ofp->trim_duration_us,
1728  &last_filter, &pad_idx, name);
1729  if (ret < 0)
1730  return ret;
1731 
1732 
1733  if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
1734  return ret;
1735 
1736  return 0;
1737 }
1738 
1740  OutputFilter *ofilter, AVFilterInOut *out)
1741 {
1742  OutputFilterPriv *ofp = ofp_from_ofilter(ofilter);
1743  AVFilterContext *last_filter = out->filter_ctx;
1744  int pad_idx = out->pad_idx;
1745  AVBPrint args;
1746  char name[255];
1747  int ret;
1748 
1749  snprintf(name, sizeof(name), "out_%s", ofilter->output_name);
1751  avfilter_get_by_name("abuffersink"),
1752  name, NULL, NULL, graph);
1753  if (ret < 0)
1754  return ret;
1755 
1756 #define AUTO_INSERT_FILTER(opt_name, filter_name, arg) do { \
1757  AVFilterContext *filt_ctx; \
1758  \
1759  av_log(ofilter, AV_LOG_INFO, opt_name " is forwarded to lavfi " \
1760  "similarly to -af " filter_name "=%s.\n", arg); \
1761  \
1762  ret = avfilter_graph_create_filter(&filt_ctx, \
1763  avfilter_get_by_name(filter_name), \
1764  filter_name, arg, NULL, graph); \
1765  if (ret < 0) \
1766  goto fail; \
1767  \
1768  ret = avfilter_link(last_filter, pad_idx, filt_ctx, 0); \
1769  if (ret < 0) \
1770  goto fail; \
1771  \
1772  last_filter = filt_ctx; \
1773  pad_idx = 0; \
1774 } while (0)
1776 
1777  choose_sample_fmts(ofp, &args);
1778  choose_sample_rates(ofp, &args);
1779  choose_channel_layouts(ofp, &args);
1780  if (!av_bprint_is_complete(&args)) {
1781  ret = AVERROR(ENOMEM);
1782  goto fail;
1783  }
1784  if (args.len) {
1786 
1787  snprintf(name, sizeof(name), "format_out_%s", ofilter->output_name);
1789  avfilter_get_by_name("aformat"),
1790  name, args.str, NULL, graph);
1791  if (ret < 0)
1792  goto fail;
1793 
1794  ret = avfilter_link(last_filter, pad_idx, format, 0);
1795  if (ret < 0)
1796  goto fail;
1797 
1798  last_filter = format;
1799  pad_idx = 0;
1800  }
1801 
1802  if (ofilter->apad)
1803  AUTO_INSERT_FILTER("-apad", "apad", ofilter->apad);
1804 
1805  snprintf(name, sizeof(name), "trim for output %s", ofilter->output_name);
1806  ret = insert_trim(fgp, ofp->trim_start_us, ofp->trim_duration_us,
1807  &last_filter, &pad_idx, name);
1808  if (ret < 0)
1809  goto fail;
1810 
1811  if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
1812  goto fail;
1813 fail:
1814  av_bprint_finalize(&args, NULL);
1815 
1816  return ret;
1817 }
1818 
1820  OutputFilter *ofilter, AVFilterInOut *out)
1821 {
1822  switch (ofilter->type) {
1823  case AVMEDIA_TYPE_VIDEO: return configure_output_video_filter(fgp, graph, ofilter, out);
1824  case AVMEDIA_TYPE_AUDIO: return configure_output_audio_filter(fgp, graph, ofilter, out);
1825  default: av_assert0(0); return 0;
1826  }
1827 }
1828 
1830 {
1831  ifp->sub2video.last_pts = INT64_MIN;
1832  ifp->sub2video.end_pts = INT64_MIN;
1833 
1834  /* sub2video structure has been (re-)initialized.
1835  Mark it as such so that the system will be
1836  initialized with the first received heartbeat. */
1837  ifp->sub2video.initialize = 1;
1838 }
1839 
1841  InputFilter *ifilter, AVFilterInOut *in)
1842 {
1843  InputFilterPriv *ifp = ifp_from_ifilter(ifilter);
1844 
1845  AVFilterContext *last_filter;
1846  const AVFilter *buffer_filt = avfilter_get_by_name("buffer");
1847  const AVPixFmtDescriptor *desc;
1848  char name[255];
1849  int ret, pad_idx = 0;
1851  if (!par)
1852  return AVERROR(ENOMEM);
1853 
1854  if (ifp->type_src == AVMEDIA_TYPE_SUBTITLE)
1855  sub2video_prepare(ifp);
1856 
1857  snprintf(name, sizeof(name), "graph %d input from stream %s", fg->index,
1858  ifp->opts.name);
1859 
1860  ifilter->filter = avfilter_graph_alloc_filter(graph, buffer_filt, name);
1861  if (!ifilter->filter) {
1862  ret = AVERROR(ENOMEM);
1863  goto fail;
1864  }
1865 
1866  par->format = ifp->format;
1867  par->time_base = ifp->time_base;
1868  par->frame_rate = ifp->opts.framerate;
1869  par->width = ifp->width;
1870  par->height = ifp->height;
1871  par->sample_aspect_ratio = ifp->sample_aspect_ratio.den > 0 ?
1872  ifp->sample_aspect_ratio : (AVRational){ 0, 1 };
1873  par->color_space = ifp->color_space;
1874  par->color_range = ifp->color_range;
1875  par->alpha_mode = ifp->alpha_mode;
1876  par->hw_frames_ctx = ifp->hw_frames_ctx;
1877  par->side_data = ifp->side_data;
1878  par->nb_side_data = ifp->nb_side_data;
1879 
1880  ret = av_buffersrc_parameters_set(ifilter->filter, par);
1881  if (ret < 0)
1882  goto fail;
1883  av_freep(&par);
1884 
1885  ret = avfilter_init_dict(ifilter->filter, NULL);
1886  if (ret < 0)
1887  goto fail;
1888 
1889  last_filter = ifilter->filter;
1890 
1892  av_assert0(desc);
1893 
1894  if ((ifp->opts.flags & IFILTER_FLAG_CROP)) {
1895  char crop_buf[64];
1896  snprintf(crop_buf, sizeof(crop_buf), "w=iw-%u-%u:h=ih-%u-%u:x=%u:y=%u",
1897  ifp->opts.crop_left, ifp->opts.crop_right,
1898  ifp->opts.crop_top, ifp->opts.crop_bottom,
1899  ifp->opts.crop_left, ifp->opts.crop_top);
1900  ret = insert_filter(&last_filter, &pad_idx, "crop", crop_buf);
1901  if (ret < 0)
1902  return ret;
1903  }
1904 
1905  // TODO: insert hwaccel enabled filters like transpose_vaapi into the graph
1906  ifp->displaymatrix_applied = 0;
1907  if ((ifp->opts.flags & IFILTER_FLAG_AUTOROTATE) &&
1908  !(desc->flags & AV_PIX_FMT_FLAG_HWACCEL)) {
1909  int32_t *displaymatrix = ifp->displaymatrix;
1910  double theta;
1911 
1912  theta = get_rotation(displaymatrix);
1913 
1914  if (fabs(theta - 90) < 1.0) {
1915  ret = insert_filter(&last_filter, &pad_idx, "transpose",
1916  displaymatrix[3] > 0 ? "cclock_flip" : "clock");
1917  } else if (fabs(theta - 180) < 1.0) {
1918  if (displaymatrix[0] < 0) {
1919  ret = insert_filter(&last_filter, &pad_idx, "hflip", NULL);
1920  if (ret < 0)
1921  return ret;
1922  }
1923  if (displaymatrix[4] < 0) {
1924  ret = insert_filter(&last_filter, &pad_idx, "vflip", NULL);
1925  }
1926  } else if (fabs(theta - 270) < 1.0) {
1927  ret = insert_filter(&last_filter, &pad_idx, "transpose",
1928  displaymatrix[3] < 0 ? "clock_flip" : "cclock");
1929  } else if (fabs(theta) > 1.0) {
1930  char rotate_buf[64];
1931  snprintf(rotate_buf, sizeof(rotate_buf), "%f*PI/180", theta);
1932  ret = insert_filter(&last_filter, &pad_idx, "rotate", rotate_buf);
1933  } else if (fabs(theta) < 1.0) {
1934  if (displaymatrix && displaymatrix[4] < 0) {
1935  ret = insert_filter(&last_filter, &pad_idx, "vflip", NULL);
1936  }
1937  }
1938  if (ret < 0)
1939  return ret;
1940 
1941  ifp->displaymatrix_applied = 1;
1942  }
1943 
1944  snprintf(name, sizeof(name), "trim_in_%s", ifp->opts.name);
1945  ret = insert_trim(fg, ifp->opts.trim_start_us, ifp->opts.trim_end_us,
1946  &last_filter, &pad_idx, name);
1947  if (ret < 0)
1948  return ret;
1949 
1950  if ((ret = avfilter_link(last_filter, 0, in->filter_ctx, in->pad_idx)) < 0)
1951  return ret;
1952  return 0;
1953 fail:
1954  av_freep(&par);
1955 
1956  return ret;
1957 }
1958 
1960  InputFilter *ifilter, AVFilterInOut *in)
1961 {
1962  InputFilterPriv *ifp = ifp_from_ifilter(ifilter);
1963  AVFilterContext *last_filter;
1964  AVBufferSrcParameters *par;
1965  const AVFilter *abuffer_filt = avfilter_get_by_name("abuffer");
1966  AVBPrint args;
1967  char name[255];
1968  int ret, pad_idx = 0;
1969 
1971  av_bprintf(&args, "time_base=%d/%d:sample_rate=%d:sample_fmt=%s",
1972  ifp->time_base.num, ifp->time_base.den,
1973  ifp->sample_rate,
1975  if (av_channel_layout_check(&ifp->ch_layout) &&
1977  av_bprintf(&args, ":channel_layout=");
1979  } else
1980  av_bprintf(&args, ":channels=%d", ifp->ch_layout.nb_channels);
1981  snprintf(name, sizeof(name), "graph_%d_in_%s", fg->index, ifp->opts.name);
1982 
1983  if ((ret = avfilter_graph_create_filter(&ifilter->filter, abuffer_filt,
1984  name, args.str, NULL,
1985  graph)) < 0)
1986  return ret;
1988  if (!par)
1989  return AVERROR(ENOMEM);
1990  par->side_data = ifp->side_data;
1991  par->nb_side_data = ifp->nb_side_data;
1992  ret = av_buffersrc_parameters_set(ifilter->filter, par);
1993  av_free(par);
1994  if (ret < 0)
1995  return ret;
1996  last_filter = ifilter->filter;
1997 
1998  snprintf(name, sizeof(name), "trim for input stream %s", ifp->opts.name);
1999  ret = insert_trim(fg, ifp->opts.trim_start_us, ifp->opts.trim_end_us,
2000  &last_filter, &pad_idx, name);
2001  if (ret < 0)
2002  return ret;
2003 
2004  if ((ret = avfilter_link(last_filter, 0, in->filter_ctx, in->pad_idx)) < 0)
2005  return ret;
2006 
2007  return 0;
2008 }
2009 
2011  InputFilter *ifilter, AVFilterInOut *in)
2012 {
2013  switch (ifilter->type) {
2014  case AVMEDIA_TYPE_VIDEO: return configure_input_video_filter(fg, graph, ifilter, in);
2015  case AVMEDIA_TYPE_AUDIO: return configure_input_audio_filter(fg, graph, ifilter, in);
2016  default: av_assert0(0); return 0;
2017  }
2018 }
2019 
2021 {
2022  for (int i = 0; i < fg->nb_outputs; i++)
2023  fg->outputs[i]->filter = NULL;
2024  for (int i = 0; i < fg->nb_inputs; i++)
2025  fg->inputs[i]->filter = NULL;
2026  avfilter_graph_free(&fgt->graph);
2027 }
2028 
2030 {
2031  return f->nb_inputs == 0 &&
2032  (!strcmp(f->filter->name, "buffer") ||
2033  !strcmp(f->filter->name, "abuffer"));
2034 }
2035 
2036 static int graph_is_meta(AVFilterGraph *graph)
2037 {
2038  for (unsigned i = 0; i < graph->nb_filters; i++) {
2039  const AVFilterContext *f = graph->filters[i];
2040 
2041  /* in addition to filters flagged as meta, also
2042  * disregard sinks and buffersources (but not other sources,
2043  * since they introduce data we are not aware of)
2044  */
2045  if (!((f->filter->flags & AVFILTER_FLAG_METADATA_ONLY) ||
2046  f->nb_outputs == 0 ||
2048  return 0;
2049  }
2050  return 1;
2051 }
2052 
2053 static int sub2video_frame(InputFilter *ifilter, AVFrame *frame, int buffer);
2054 
2056 {
2057  FilterGraphPriv *fgp = fgp_from_fg(fg);
2058  AVBufferRef *hw_device;
2059  AVFilterInOut *inputs, *outputs, *cur;
2060  int ret = AVERROR_BUG, i, simple = filtergraph_is_simple(fg);
2061  int have_input_eof = 0;
2062  const char *graph_desc = fg->graph_desc;
2063 
2064  cleanup_filtergraph(fg, fgt);
2065  fgt->graph = avfilter_graph_alloc();
2066  if (!fgt->graph)
2067  return AVERROR(ENOMEM);
2068 
2069  if (simple) {
2070  OutputFilterPriv *ofp = ofp_from_ofilter(fg->outputs[0]);
2071 
2072  if (filter_nbthreads) {
2073  ret = av_opt_set(fgt->graph, "threads", filter_nbthreads, 0);
2074  if (ret < 0)
2075  goto fail;
2076  } else if (fgp->nb_threads >= 0) {
2077  ret = av_opt_set_int(fgt->graph, "threads", fgp->nb_threads, 0);
2078  if (ret < 0)
2079  return ret;
2080  }
2081 
2082  if (av_dict_count(ofp->sws_opts)) {
2084  &fgt->graph->scale_sws_opts,
2085  '=', ':');
2086  if (ret < 0)
2087  goto fail;
2088  }
2089 
2090  if (av_dict_count(ofp->swr_opts)) {
2091  char *args;
2092  ret = av_dict_get_string(ofp->swr_opts, &args, '=', ':');
2093  if (ret < 0)
2094  goto fail;
2095  av_opt_set(fgt->graph, "aresample_swr_opts", args, 0);
2096  av_free(args);
2097  }
2098  } else {
2100  }
2101 
2102  if (filter_buffered_frames) {
2103  ret = av_opt_set_int(fgt->graph, "max_buffered_frames", filter_buffered_frames, 0);
2104  if (ret < 0)
2105  return ret;
2106  }
2107 
2108  hw_device = hw_device_for_filter();
2109 
2110  ret = graph_parse(fg, fgt->graph, graph_desc, &inputs, &outputs, hw_device);
2111  if (ret < 0)
2112  goto fail;
2113 
2114  for (cur = inputs, i = 0; cur; cur = cur->next, i++)
2115  if ((ret = configure_input_filter(fg, fgt->graph, fg->inputs[i], cur)) < 0) {
2118  goto fail;
2119  }
2121 
2122  for (cur = outputs, i = 0; cur; cur = cur->next, i++) {
2123  ret = configure_output_filter(fgp, fgt->graph, fg->outputs[i], cur);
2124  if (ret < 0) {
2126  goto fail;
2127  }
2128  }
2130 
2131  if (fgp->disable_conversions)
2133  if ((ret = avfilter_graph_config(fgt->graph, NULL)) < 0)
2134  goto fail;
2135 
2136  fgp->is_meta = graph_is_meta(fgt->graph);
2137 
2138  /* limit the lists of allowed formats to the ones selected, to
2139  * make sure they stay the same if the filtergraph is reconfigured later */
2140  for (int i = 0; i < fg->nb_outputs; i++) {
2141  const AVFrameSideData *const *sd;
2142  int nb_sd;
2143  OutputFilter *ofilter = fg->outputs[i];
2144  OutputFilterPriv *ofp = ofp_from_ofilter(ofilter);
2145  AVFilterContext *sink = ofilter->filter;
2146 
2147  ofp->format = av_buffersink_get_format(sink);
2148 
2149  ofp->width = av_buffersink_get_w(sink);
2150  ofp->height = av_buffersink_get_h(sink);
2154 
2155  // If the timing parameters are not locked yet, get the tentative values
2156  // here but don't lock them. They will only be used if no output frames
2157  // are ever produced.
2158  if (!ofp->tb_out_locked) {
2160  if (ofp->fps.framerate.num <= 0 && ofp->fps.framerate.den <= 0 &&
2161  fr.num > 0 && fr.den > 0)
2162  ofp->fps.framerate = fr;
2163  ofp->tb_out = av_buffersink_get_time_base(sink);
2164  }
2166 
2169  ret = av_buffersink_get_ch_layout(sink, &ofp->ch_layout);
2170  if (ret < 0)
2171  goto fail;
2172  sd = av_buffersink_get_side_data(sink, &nb_sd);
2173  if (nb_sd)
2174  for (int j = 0; j < nb_sd; j++) {
2177  if (ret < 0) {
2179  goto fail;
2180  }
2181  }
2182  }
2183 
2184  for (int i = 0; i < fg->nb_inputs; i++) {
2185  InputFilter *ifilter = fg->inputs[i];
2187  AVFrame *tmp;
2188  while (av_fifo_read(ifp->frame_queue, &tmp, 1) >= 0) {
2189  if (ifp->type_src == AVMEDIA_TYPE_SUBTITLE) {
2190  sub2video_frame(&ifp->ifilter, tmp, !fgt->graph);
2191  } else {
2192  if (ifp->type_src == AVMEDIA_TYPE_VIDEO) {
2193  if (ifp->displaymatrix_applied)
2195  }
2196  ret = av_buffersrc_add_frame(ifilter->filter, tmp);
2197  }
2198  av_frame_free(&tmp);
2199  if (ret < 0)
2200  goto fail;
2201  }
2202  }
2203 
2204  /* send the EOFs for the finished inputs */
2205  for (int i = 0; i < fg->nb_inputs; i++) {
2206  InputFilter *ifilter = fg->inputs[i];
2207  if (fgt->eof_in[i]) {
2208  ret = av_buffersrc_add_frame(ifilter->filter, NULL);
2209  if (ret < 0)
2210  goto fail;
2211  have_input_eof = 1;
2212  }
2213  }
2214 
2215  if (have_input_eof) {
2216  // make sure the EOF propagates to the end of the graph
2218  if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
2219  goto fail;
2220  }
2221 
2222  return 0;
2223 fail:
2224  cleanup_filtergraph(fg, fgt);
2225  return ret;
2226 }
2227 
2229 {
2230  InputFilterPriv *ifp = ifp_from_ifilter(ifilter);
2231  AVFrameSideData *sd;
2232  int ret;
2233 
2234  ret = av_buffer_replace(&ifp->hw_frames_ctx, frame->hw_frames_ctx);
2235  if (ret < 0)
2236  return ret;
2237 
2238  ifp->time_base = (ifilter->type == AVMEDIA_TYPE_AUDIO) ? (AVRational){ 1, frame->sample_rate } :
2239  (ifp->opts.flags & IFILTER_FLAG_CFR) ? av_inv_q(ifp->opts.framerate) :
2240  frame->time_base;
2241 
2242  ifp->format = frame->format;
2243 
2244  ifp->width = frame->width;
2245  ifp->height = frame->height;
2246  ifp->sample_aspect_ratio = frame->sample_aspect_ratio;
2247  ifp->color_space = frame->colorspace;
2248  ifp->color_range = frame->color_range;
2249  ifp->alpha_mode = frame->alpha_mode;
2250 
2251  ifp->sample_rate = frame->sample_rate;
2252  ret = av_channel_layout_copy(&ifp->ch_layout, &frame->ch_layout);
2253  if (ret < 0)
2254  return ret;
2255 
2257  for (int i = 0; i < frame->nb_side_data; i++) {
2258  const AVSideDataDescriptor *desc = av_frame_side_data_desc(frame->side_data[i]->type);
2259 
2260  if (!(desc->props & AV_SIDE_DATA_PROP_GLOBAL))
2261  continue;
2262 
2264  &ifp->nb_side_data,
2265  frame->side_data[i], 0);
2266  if (ret < 0)
2267  return ret;
2268  }
2269 
2271  if (sd) {
2272  memcpy(ifp->displaymatrix, sd->data, sizeof(ifp->displaymatrix));
2273  if (ifp->opts.flags & IFILTER_FLAG_AUTOROTATE)
2275  }
2276  ifp->displaymatrix_present = !!sd;
2277 
2278  /* Copy downmix related side data to InputFilterPriv so it may be propagated
2279  * to the filter chain even though it's not "global", as filters like aresample
2280  * require this information during init and not when remixing a frame */
2282  if (sd) {
2284  &ifp->nb_side_data, sd, 0);
2285  if (ret < 0)
2286  return ret;
2287  memcpy(&ifp->downmixinfo, sd->data, sizeof(ifp->downmixinfo));
2288  }
2289  ifp->downmixinfo_present = !!sd;
2290 
2291  return 0;
2292 }
2293 
2295 {
2296  const OutputFilterPriv *ofp = ofp_from_ofilter(ofilter);
2297  InputFilterPriv *ifp = ifp_from_ifilter(ifilter);
2298 
2299  if (!ifp->opts.framerate.num) {
2300  ifp->opts.framerate = ofp->fps.framerate;
2301  if (ifp->opts.framerate.num > 0 && ifp->opts.framerate.den > 0)
2302  ifp->opts.flags |= IFILTER_FLAG_CFR;
2303  }
2304 
2305  for (int i = 0; i < ofp->nb_side_data; i++) {
2308  if (ret < 0)
2309  return ret;
2310  }
2311 
2312  return 0;
2313 }
2314 
2316 {
2317  const FilterGraphPriv *fgp = cfgp_from_cfg(fg);
2318  return fgp->is_simple;
2319 }
2320 
2321 static void send_command(FilterGraph *fg, AVFilterGraph *graph,
2322  double time, const char *target,
2323  const char *command, const char *arg, int all_filters)
2324 {
2325  int ret;
2326 
2327  if (!graph)
2328  return;
2329 
2330  if (time < 0) {
2331  char response[4096];
2332  ret = avfilter_graph_send_command(graph, target, command, arg,
2333  response, sizeof(response),
2334  all_filters ? 0 : AVFILTER_CMD_FLAG_ONE);
2335  fprintf(stderr, "Command reply for stream %d: ret:%d res:\n%s",
2336  fg->index, ret, response);
2337  } else if (!all_filters) {
2338  fprintf(stderr, "Queuing commands only on filters supporting the specific command is unsupported\n");
2339  } else {
2340  ret = avfilter_graph_queue_command(graph, target, command, arg, 0, time);
2341  if (ret < 0)
2342  fprintf(stderr, "Queuing command failed with error %s\n", av_err2str(ret));
2343  }
2344 }
2345 
2346 static int choose_input(const FilterGraph *fg, const FilterGraphThread *fgt)
2347 {
2348  int nb_requests, nb_requests_max = -1;
2349  int best_input = -1;
2350 
2351  for (int i = 0; i < fg->nb_inputs; i++) {
2352  InputFilter *ifilter = fg->inputs[i];
2353 
2354  if (fgt->eof_in[i])
2355  continue;
2356 
2357  nb_requests = av_buffersrc_get_nb_failed_requests(ifilter->filter);
2358  if (nb_requests > nb_requests_max) {
2359  nb_requests_max = nb_requests;
2360  best_input = i;
2361  }
2362  }
2363 
2364  av_assert0(best_input >= 0);
2365 
2366  return best_input;
2367 }
2368 
2370 {
2371  OutputFilter *ofilter = &ofp->ofilter;
2372  FPSConvContext *fps = &ofp->fps;
2373  AVRational tb = (AVRational){ 0, 0 };
2374  AVRational fr;
2375  const FrameData *fd;
2376 
2377  fd = frame_data_c(frame);
2378 
2379  // apply -enc_time_base
2380  if (ofp->enc_timebase.num == ENC_TIME_BASE_DEMUX &&
2381  (fd->dec.tb.num <= 0 || fd->dec.tb.den <= 0)) {
2382  av_log(ofp, AV_LOG_ERROR,
2383  "Demuxing timebase not available - cannot use it for encoding\n");
2384  return AVERROR(EINVAL);
2385  }
2386 
2387  switch (ofp->enc_timebase.num) {
2388  case 0: break;
2389  case ENC_TIME_BASE_DEMUX: tb = fd->dec.tb; break;
2390  case ENC_TIME_BASE_FILTER: tb = frame->time_base; break;
2391  default: tb = ofp->enc_timebase; break;
2392  }
2393 
2394  if (ofilter->type == AVMEDIA_TYPE_AUDIO) {
2395  tb = tb.num ? tb : (AVRational){ 1, frame->sample_rate };
2396  goto finish;
2397  }
2398 
2399  fr = fps->framerate;
2400  if (!fr.num) {
2401  AVRational fr_sink = av_buffersink_get_frame_rate(ofilter->filter);
2402  if (fr_sink.num > 0 && fr_sink.den > 0)
2403  fr = fr_sink;
2404  }
2405 
2406  if (fps->vsync_method == VSYNC_CFR || fps->vsync_method == VSYNC_VSCFR) {
2407  if (!fr.num && !fps->framerate_max.num) {
2408  fr = (AVRational){25, 1};
2409  av_log(ofp, AV_LOG_WARNING,
2410  "No information "
2411  "about the input framerate is available. Falling "
2412  "back to a default value of 25fps. Use the -r option "
2413  "if you want a different framerate.\n");
2414  }
2415 
2416  if (fps->framerate_max.num &&
2417  (av_q2d(fr) > av_q2d(fps->framerate_max) ||
2418  !fr.den))
2419  fr = fps->framerate_max;
2420  }
2421 
2422  if (fr.num > 0) {
2423  if (fps->framerate_supported) {
2424  int idx = av_find_nearest_q_idx(fr, fps->framerate_supported);
2425  fr = fps->framerate_supported[idx];
2426  }
2427  if (fps->framerate_clip) {
2428  av_reduce(&fr.num, &fr.den,
2429  fr.num, fr.den, fps->framerate_clip);
2430  }
2431  }
2432 
2433  if (!(tb.num > 0 && tb.den > 0))
2434  tb = av_inv_q(fr);
2435  if (!(tb.num > 0 && tb.den > 0))
2436  tb = frame->time_base;
2437 
2438  fps->framerate = fr;
2439 finish:
2440  ofp->tb_out = tb;
2441  ofp->tb_out_locked = 1;
2442 
2443  return 0;
2444 }
2445 
2446 static double adjust_frame_pts_to_encoder_tb(void *logctx, AVFrame *frame,
2447  AVRational tb_dst, int64_t start_time)
2448 {
2449  double float_pts = AV_NOPTS_VALUE; // this is identical to frame.pts but with higher precision
2450 
2451  AVRational tb = tb_dst;
2452  AVRational filter_tb = frame->time_base;
2453  const int extra_bits = av_clip(29 - av_log2(tb.den), 0, 16);
2454 
2455  if (frame->pts == AV_NOPTS_VALUE)
2456  goto early_exit;
2457 
2458  tb.den <<= extra_bits;
2459  float_pts = av_rescale_q(frame->pts, filter_tb, tb) -
2461  float_pts /= 1 << extra_bits;
2462  // when float_pts is not exactly an integer,
2463  // avoid exact midpoints to reduce the chance of rounding differences, this
2464  // can be removed in case the fps code is changed to work with integers
2465  if (float_pts != llrint(float_pts))
2466  float_pts += FFSIGN(float_pts) * 1.0 / (1<<17);
2467 
2468  frame->pts = av_rescale_q(frame->pts, filter_tb, tb_dst) -
2470  frame->time_base = tb_dst;
2471 
2472 early_exit:
2473 
2474  if (debug_ts) {
2475  av_log(logctx, AV_LOG_INFO,
2476  "filter -> pts:%s pts_time:%s exact:%f time_base:%d/%d\n",
2477  frame ? av_ts2str(frame->pts) : "NULL",
2478  av_ts2timestr(frame->pts, &tb_dst),
2479  float_pts, tb_dst.num, tb_dst.den);
2480  }
2481 
2482  return float_pts;
2483 }
2484 
2486 {
2487  int64_t max2, min2, m;
2488 
2489  if (a >= b) {
2490  max2 = a;
2491  min2 = b;
2492  } else {
2493  max2 = b;
2494  min2 = a;
2495  }
2496  m = (c >= max2) ? max2 : c;
2497 
2498  return (m >= min2) ? m : min2;
2499 }
2500 
2501 
2502 /* Convert frame timestamps to the encoder timebase and decide how many times
2503  * should this (and possibly previous) frame be repeated in order to conform to
2504  * desired target framerate (if any).
2505  */
2507  int64_t *nb_frames, int64_t *nb_frames_prev)
2508 {
2509  OutputFilter *ofilter = &ofp->ofilter;
2510  FPSConvContext *fps = &ofp->fps;
2511  double delta0, delta, sync_ipts, duration;
2512 
2513  if (!frame) {
2514  *nb_frames_prev = *nb_frames = median3(fps->frames_prev_hist[0],
2515  fps->frames_prev_hist[1],
2516  fps->frames_prev_hist[2]);
2517 
2518  if (!*nb_frames && fps->last_dropped) {
2519  atomic_fetch_add(&ofilter->nb_frames_drop, 1);
2520  fps->last_dropped++;
2521  }
2522 
2523  goto finish;
2524  }
2525 
2526  duration = frame->duration * av_q2d(frame->time_base) / av_q2d(ofp->tb_out);
2527 
2528  sync_ipts = adjust_frame_pts_to_encoder_tb(ofilter->graph, frame,
2529  ofp->tb_out, ofp->ts_offset);
2530  /* delta0 is the "drift" between the input frame and
2531  * where it would fall in the output. */
2532  delta0 = sync_ipts - ofp->next_pts;
2533  delta = delta0 + duration;
2534 
2535  // tracks the number of times the PREVIOUS frame should be duplicated,
2536  // mostly for variable framerate (VFR)
2537  *nb_frames_prev = 0;
2538  /* by default, we output a single frame */
2539  *nb_frames = 1;
2540 
2541  if (delta0 < 0 &&
2542  delta > 0 &&
2545  && fps->vsync_method != VSYNC_DROP
2546 #endif
2547  ) {
2548  if (delta0 < -0.6) {
2549  av_log(ofp, AV_LOG_VERBOSE, "Past duration %f too large\n", -delta0);
2550  } else
2551  av_log(ofp, AV_LOG_DEBUG, "Clipping frame in rate conversion by %f\n", -delta0);
2552  sync_ipts = ofp->next_pts;
2553  duration += delta0;
2554  delta0 = 0;
2555  }
2556 
2557  switch (fps->vsync_method) {
2558  case VSYNC_VSCFR:
2559  if (fps->frame_number == 0 && delta0 >= 0.5) {
2560  av_log(ofp, AV_LOG_DEBUG, "Not duplicating %d initial frames\n", (int)lrintf(delta0));
2561  delta = duration;
2562  delta0 = 0;
2563  ofp->next_pts = llrint(sync_ipts);
2564  }
2566  case VSYNC_CFR:
2567  // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
2568  if (frame_drop_threshold && delta < frame_drop_threshold && fps->frame_number) {
2569  *nb_frames = 0;
2570  } else if (delta < -1.1)
2571  *nb_frames = 0;
2572  else if (delta > 1.1) {
2573  *nb_frames = llrintf(delta);
2574  if (delta0 > 1.1)
2575  *nb_frames_prev = llrintf(delta0 - 0.6);
2576  }
2577  frame->duration = 1;
2578  break;
2579  case VSYNC_VFR:
2580  if (delta <= -0.6)
2581  *nb_frames = 0;
2582  else if (delta > 0.6)
2583  ofp->next_pts = llrint(sync_ipts);
2584  frame->duration = llrint(duration);
2585  break;
2586 #if FFMPEG_OPT_VSYNC_DROP
2587  case VSYNC_DROP:
2588 #endif
2589  case VSYNC_PASSTHROUGH:
2590  ofp->next_pts = llrint(sync_ipts);
2591  frame->duration = llrint(duration);
2592  break;
2593  default:
2594  av_assert0(0);
2595  }
2596 
2597 finish:
2598  memmove(fps->frames_prev_hist + 1,
2599  fps->frames_prev_hist,
2600  sizeof(fps->frames_prev_hist[0]) * (FF_ARRAY_ELEMS(fps->frames_prev_hist) - 1));
2601  fps->frames_prev_hist[0] = *nb_frames_prev;
2602 
2603  if (*nb_frames_prev == 0 && fps->last_dropped) {
2604  atomic_fetch_add(&ofilter->nb_frames_drop, 1);
2605  av_log(ofp, AV_LOG_VERBOSE,
2606  "*** dropping frame %"PRId64" at ts %"PRId64"\n",
2607  fps->frame_number, fps->last_frame->pts);
2608  }
2609  if (*nb_frames > (*nb_frames_prev && fps->last_dropped) + (*nb_frames > *nb_frames_prev)) {
2610  uint64_t nb_frames_dup;
2611  if (*nb_frames > dts_error_threshold * 30) {
2612  av_log(ofp, AV_LOG_ERROR, "%"PRId64" frame duplication too large, skipping\n", *nb_frames - 1);
2613  atomic_fetch_add(&ofilter->nb_frames_drop, 1);
2614  *nb_frames = 0;
2615  return;
2616  }
2617  nb_frames_dup = atomic_fetch_add(&ofilter->nb_frames_dup,
2618  *nb_frames - (*nb_frames_prev && fps->last_dropped) - (*nb_frames > *nb_frames_prev));
2619  av_log(ofp, AV_LOG_VERBOSE, "*** %"PRId64" dup!\n", *nb_frames - 1);
2620  if (nb_frames_dup > fps->dup_warning) {
2621  av_log(ofp, AV_LOG_WARNING, "More than %"PRIu64" frames duplicated\n", fps->dup_warning);
2622  fps->dup_warning *= 10;
2623  }
2624  }
2625 
2626  fps->last_dropped = *nb_frames == *nb_frames_prev && frame;
2627  fps->dropped_keyframe |= fps->last_dropped && (frame->flags & AV_FRAME_FLAG_KEY);
2628 }
2629 
2630 static void close_input(InputFilterPriv *ifp)
2631 {
2633 
2634  if (!ifp->eof) {
2636  ifp->eof = 1;
2637  }
2638 }
2639 
2641 {
2643  int ret;
2644 
2645  // we are finished and no frames were ever seen at this output,
2646  // at least initialize the encoder with a dummy frame
2647  if (!fgt->got_frame) {
2648  AVFrame *frame = fgt->frame;
2649  FrameData *fd;
2650 
2651  frame->time_base = ofp->tb_out;
2652  frame->format = ofp->format;
2653 
2654  frame->width = ofp->width;
2655  frame->height = ofp->height;
2656  frame->sample_aspect_ratio = ofp->sample_aspect_ratio;
2657 
2658  frame->sample_rate = ofp->sample_rate;
2659  if (ofp->ch_layout.nb_channels) {
2660  ret = av_channel_layout_copy(&frame->ch_layout, &ofp->ch_layout);
2661  if (ret < 0)
2662  return ret;
2663  }
2664 
2665  fd = frame_data(frame);
2666  if (!fd)
2667  return AVERROR(ENOMEM);
2668 
2671  ofp->side_data, ofp->nb_side_data, 0);
2672  if (ret < 0)
2673  return ret;
2674 
2675  fd->frame_rate_filter = ofp->fps.framerate;
2676 
2677  av_assert0(!frame->buf[0]);
2678 
2679  av_log(ofp, AV_LOG_WARNING,
2680  "No filtered frames for output stream, trying to "
2681  "initialize anyway.\n");
2682 
2683  ret = sch_filter_send(fgp->sch, fgp->sch_idx, ofp->ofilter.index, frame);
2684  if (ret < 0) {
2686  return ret;
2687  }
2688  }
2689 
2690  fgt->eof_out[ofp->ofilter.index] = 1;
2691 
2692  ret = sch_filter_send(fgp->sch, fgp->sch_idx, ofp->ofilter.index, NULL);
2693  return (ret == AVERROR_EOF) ? 0 : ret;
2694 }
2695 
2697  AVFrame *frame)
2698 {
2700  AVFrame *frame_prev = ofp->fps.last_frame;
2701  enum AVMediaType type = ofp->ofilter.type;
2702 
2703  int64_t nb_frames = !!frame, nb_frames_prev = 0;
2704 
2705  if (type == AVMEDIA_TYPE_VIDEO && (frame || fgt->got_frame))
2706  video_sync_process(ofp, frame, &nb_frames, &nb_frames_prev);
2707 
2708  for (int64_t i = 0; i < nb_frames; i++) {
2709  AVFrame *frame_out;
2710  int ret;
2711 
2712  if (type == AVMEDIA_TYPE_VIDEO) {
2713  AVFrame *frame_in = (i < nb_frames_prev && frame_prev->buf[0]) ?
2714  frame_prev : frame;
2715  if (!frame_in)
2716  break;
2717 
2718  frame_out = fgp->frame_enc;
2719  ret = av_frame_ref(frame_out, frame_in);
2720  if (ret < 0)
2721  return ret;
2722 
2723  frame_out->pts = ofp->next_pts;
2724 
2725  if (ofp->fps.dropped_keyframe) {
2726  frame_out->flags |= AV_FRAME_FLAG_KEY;
2727  ofp->fps.dropped_keyframe = 0;
2728  }
2729  } else {
2730  frame->pts = (frame->pts == AV_NOPTS_VALUE) ? ofp->next_pts :
2731  av_rescale_q(frame->pts, frame->time_base, ofp->tb_out) -
2733 
2734  frame->time_base = ofp->tb_out;
2735  frame->duration = av_rescale_q(frame->nb_samples,
2736  (AVRational){ 1, frame->sample_rate },
2737  ofp->tb_out);
2738 
2739  ofp->next_pts = frame->pts + frame->duration;
2740 
2741  frame_out = frame;
2742  }
2743 
2744  // send the frame to consumers
2745  ret = sch_filter_send(fgp->sch, fgp->sch_idx, ofp->ofilter.index, frame_out);
2746  if (ret < 0) {
2747  av_frame_unref(frame_out);
2748 
2749  if (!fgt->eof_out[ofp->ofilter.index]) {
2750  fgt->eof_out[ofp->ofilter.index] = 1;
2751  fgp->nb_outputs_done++;
2752  }
2753 
2754  return ret == AVERROR_EOF ? 0 : ret;
2755  }
2756 
2757  if (type == AVMEDIA_TYPE_VIDEO) {
2758  ofp->fps.frame_number++;
2759  ofp->next_pts++;
2760 
2761  if (i == nb_frames_prev && frame)
2762  frame->flags &= ~AV_FRAME_FLAG_KEY;
2763  }
2764 
2765  fgt->got_frame = 1;
2766  }
2767 
2768  if (frame && frame_prev) {
2769  av_frame_unref(frame_prev);
2770  av_frame_move_ref(frame_prev, frame);
2771  }
2772 
2773  if (!frame)
2774  return close_output(ofp, fgt);
2775 
2776  return 0;
2777 }
2778 
2780  AVFrame *frame)
2781 {
2784  FrameData *fd;
2785  int ret;
2786 
2789  if (ret == AVERROR_EOF && !fgt->eof_out[ofp->ofilter.index]) {
2790  ret = fg_output_frame(ofp, fgt, NULL);
2791  return (ret < 0) ? ret : 1;
2792  } else if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
2793  return 1;
2794  } else if (ret < 0) {
2795  av_log(ofp, AV_LOG_WARNING,
2796  "Error in retrieving a frame from the filtergraph: %s\n",
2797  av_err2str(ret));
2798  return ret;
2799  }
2800 
2801  if (fgt->eof_out[ofp->ofilter.index]) {
2803  return 0;
2804  }
2805 
2807 
2808  if (debug_ts)
2809  av_log(ofp, AV_LOG_INFO, "filter_raw -> pts:%s pts_time:%s time_base:%d/%d\n",
2810  av_ts2str(frame->pts), av_ts2timestr(frame->pts, &frame->time_base),
2811  frame->time_base.num, frame->time_base.den);
2812 
2813  // Choose the output timebase the first time we get a frame.
2814  if (!ofp->tb_out_locked) {
2815  ret = choose_out_timebase(ofp, frame);
2816  if (ret < 0) {
2817  av_log(ofp, AV_LOG_ERROR, "Could not choose an output time base\n");
2819  return ret;
2820  }
2821  }
2822 
2823  fd = frame_data(frame);
2824  if (!fd) {
2826  return AVERROR(ENOMEM);
2827  }
2828 
2830  if (!fgt->got_frame) {
2832  ofp->side_data, ofp->nb_side_data, 0);
2833  if (ret < 0) {
2835  return ret;
2836  }
2837  }
2838 
2840 
2841  // only use bits_per_raw_sample passed through from the decoder
2842  // if the filtergraph did not touch the frame data
2843  if (!fgp->is_meta)
2844  fd->bits_per_raw_sample = 0;
2845 
2846  if (ofp->ofilter.type == AVMEDIA_TYPE_VIDEO) {
2847  if (!frame->duration) {
2849  if (fr.num > 0 && fr.den > 0)
2850  frame->duration = av_rescale_q(1, av_inv_q(fr), frame->time_base);
2851  }
2852 
2853  fd->frame_rate_filter = ofp->fps.framerate;
2854  }
2855 
2856  ret = fg_output_frame(ofp, fgt, frame);
2858  if (ret < 0)
2859  return ret;
2860 
2861  return 0;
2862 }
2863 
2864 /* retrieve all frames available at filtergraph outputs
2865  * and send them to consumers */
2867  AVFrame *frame)
2868 {
2869  FilterGraphPriv *fgp = fgp_from_fg(fg);
2870 
2871  // graph not configured, just select the input to request
2872  if (!fgt->graph) {
2873  for (int i = 0; i < fg->nb_inputs; i++) {
2875  if (ifp->format < 0 && !fgt->eof_in[i]) {
2876  fgt->next_in = i;
2877  return 0;
2878  }
2879  }
2880 
2881  // This state - graph is not configured, but all inputs are either
2882  // initialized or EOF - should be unreachable because sending EOF to a
2883  // filter without even a fallback format should fail
2884  av_assert0(0);
2885  return AVERROR_BUG;
2886  }
2887 
2888  if (fgp->nb_outputs_done < fg->nb_outputs) {
2889  int ret;
2890 
2891  /* Reap all buffers present in the buffer sinks */
2892  for (int i = 0; i < fg->nb_outputs; i++) {
2894 
2895  ret = 0;
2896  while (!ret) {
2897  ret = fg_output_step(ofp, fgt, frame);
2898  if (ret < 0)
2899  return ret;
2900  }
2901  }
2902 
2903 
2905  if (ret == AVERROR(EAGAIN)) {
2906  fgt->next_in = choose_input(fg, fgt);
2907  return 0;
2908  } else if (ret < 0) {
2909  if (ret == AVERROR_EOF)
2910  av_log(fg, AV_LOG_VERBOSE, "Filtergraph returned EOF, finishing\n");
2911  else
2912  av_log(fg, AV_LOG_ERROR,
2913  "Error requesting a frame from the filtergraph: %s\n",
2914  av_err2str(ret));
2915  return ret;
2916  }
2917  fgt->next_in = fg->nb_inputs;
2918 
2919  // return so that scheduler can rate-control us
2920  return 0;
2921  }
2922 
2923  return AVERROR_EOF;
2924 }
2925 
2927 {
2928  InputFilterPriv *ifp = ifp_from_ifilter(ifilter);
2929  int64_t pts2;
2930 
2931  /* subtitles seem to be usually muxed ahead of other streams;
2932  if not, subtracting a larger time here is necessary */
2933  pts2 = av_rescale_q(pts, tb, ifp->time_base) - 1;
2934 
2935  /* do not send the heartbeat frame if the subtitle is already ahead */
2936  if (pts2 <= ifp->sub2video.last_pts)
2937  return;
2938 
2939  if (pts2 >= ifp->sub2video.end_pts || ifp->sub2video.initialize)
2940  /* if we have hit the end of the current displayed subpicture,
2941  or if we need to initialize the system, update the
2942  overlaid subpicture and its start/end times */
2943  sub2video_update(ifp, pts2 + 1, NULL);
2944  else
2945  sub2video_push_ref(ifp, pts2);
2946 }
2947 
2948 static int sub2video_frame(InputFilter *ifilter, AVFrame *frame, int buffer)
2949 {
2950  InputFilterPriv *ifp = ifp_from_ifilter(ifilter);
2951  int ret;
2952 
2953  if (buffer) {
2954  AVFrame *tmp;
2955 
2956  if (!frame)
2957  return 0;
2958 
2959  tmp = av_frame_alloc();
2960  if (!tmp)
2961  return AVERROR(ENOMEM);
2962 
2964 
2965  ret = av_fifo_write(ifp->frame_queue, &tmp, 1);
2966  if (ret < 0) {
2967  av_frame_free(&tmp);
2968  return ret;
2969  }
2970 
2971  return 0;
2972  }
2973 
2974  // heartbeat frame
2975  if (frame && !frame->buf[0]) {
2976  sub2video_heartbeat(ifilter, frame->pts, frame->time_base);
2977  return 0;
2978  }
2979 
2980  if (!frame) {
2981  if (ifp->sub2video.end_pts < INT64_MAX)
2982  sub2video_update(ifp, INT64_MAX, NULL);
2983 
2984  return av_buffersrc_add_frame(ifilter->filter, NULL);
2985  }
2986 
2987  ifp->width = frame->width ? frame->width : ifp->width;
2988  ifp->height = frame->height ? frame->height : ifp->height;
2989 
2990  sub2video_update(ifp, INT64_MIN, (const AVSubtitle*)frame->buf[0]->data);
2991 
2992  return 0;
2993 }
2994 
2995 static int send_eof(FilterGraphThread *fgt, InputFilter *ifilter,
2996  int64_t pts, AVRational tb)
2997 {
2998  InputFilterPriv *ifp = ifp_from_ifilter(ifilter);
2999  int ret;
3000 
3001  if (fgt->eof_in[ifilter->index])
3002  return 0;
3003 
3004  fgt->eof_in[ifilter->index] = 1;
3005 
3006  if (ifilter->filter) {
3007  pts = av_rescale_q_rnd(pts, tb, ifp->time_base,
3009 
3011  if (ret < 0)
3012  return ret;
3013  } else {
3014  if (ifp->format < 0) {
3015  // the filtergraph was never configured, use the fallback parameters
3016  ifp->format = ifp->opts.fallback->format;
3017  ifp->sample_rate = ifp->opts.fallback->sample_rate;
3018  ifp->width = ifp->opts.fallback->width;
3019  ifp->height = ifp->opts.fallback->height;
3021  ifp->color_space = ifp->opts.fallback->colorspace;
3022  ifp->color_range = ifp->opts.fallback->color_range;
3023  ifp->alpha_mode = ifp->opts.fallback->alpha_mode;
3024  ifp->time_base = ifp->opts.fallback->time_base;
3025 
3027  &ifp->opts.fallback->ch_layout);
3028  if (ret < 0)
3029  return ret;
3030 
3032  ret = clone_side_data(&ifp->side_data, &ifp->nb_side_data,
3033  ifp->opts.fallback->side_data,
3034  ifp->opts.fallback->nb_side_data, 0);
3035  if (ret < 0)
3036  return ret;
3037 
3038  if (ifilter_has_all_input_formats(ifilter->graph)) {
3039  ret = configure_filtergraph(ifilter->graph, fgt);
3040  if (ret < 0) {
3041  av_log(ifilter->graph, AV_LOG_ERROR, "Error initializing filters!\n");
3042  return ret;
3043  }
3044  }
3045  }
3046 
3047  if (ifp->format < 0) {
3048  av_log(ifilter->graph, AV_LOG_ERROR,
3049  "Cannot determine format of input %s after EOF\n",
3050  ifp->opts.name);
3051  return AVERROR_INVALIDDATA;
3052  }
3053  }
3054 
3055  return 0;
3056 }
3057 
3059  VIDEO_CHANGED = (1 << 0),
3060  AUDIO_CHANGED = (1 << 1),
3061  MATRIX_CHANGED = (1 << 2),
3062  DOWNMIX_CHANGED = (1 << 3),
3063  HWACCEL_CHANGED = (1 << 4)
3064 };
3065 
3066 static const char *unknown_if_null(const char *str)
3067 {
3068  return str ? str : "unknown";
3069 }
3070 
3072  InputFilter *ifilter, AVFrame *frame)
3073 {
3074  FilterGraphPriv *fgp = fgp_from_fg(fg);
3075  InputFilterPriv *ifp = ifp_from_ifilter(ifilter);
3076  FrameData *fd;
3077  AVFrameSideData *sd;
3078  int need_reinit = 0, ret;
3079 
3080  /* determine if the parameters for this input changed */
3081  switch (ifilter->type) {
3082  case AVMEDIA_TYPE_AUDIO:
3083  if (ifp->format != frame->format ||
3084  ifp->sample_rate != frame->sample_rate ||
3085  av_channel_layout_compare(&ifp->ch_layout, &frame->ch_layout))
3086  need_reinit |= AUDIO_CHANGED;
3087  break;
3088  case AVMEDIA_TYPE_VIDEO:
3089  if (ifp->format != frame->format ||
3090  ifp->width != frame->width ||
3091  ifp->height != frame->height ||
3092  ifp->color_space != frame->colorspace ||
3093  ifp->color_range != frame->color_range ||
3094  ifp->alpha_mode != frame->alpha_mode)
3095  need_reinit |= VIDEO_CHANGED;
3096  break;
3097  }
3098 
3100  if (!ifp->displaymatrix_present ||
3101  memcmp(sd->data, ifp->displaymatrix, sizeof(ifp->displaymatrix)))
3102  need_reinit |= MATRIX_CHANGED;
3103  } else if (ifp->displaymatrix_present)
3104  need_reinit |= MATRIX_CHANGED;
3105 
3107  if (!ifp->downmixinfo_present ||
3108  memcmp(sd->data, &ifp->downmixinfo, sizeof(ifp->downmixinfo)))
3109  need_reinit |= DOWNMIX_CHANGED;
3110  } else if (ifp->downmixinfo_present)
3111  need_reinit |= DOWNMIX_CHANGED;
3112 
3113  if (need_reinit && fgt->graph && (ifp->opts.flags & IFILTER_FLAG_DROPCHANGED)) {
3114  ifp->nb_dropped++;
3115  av_log_once(fg, AV_LOG_WARNING, AV_LOG_DEBUG, &ifp->drop_warned, "Avoiding reinit; dropping frame pts: %s bound for %s\n", av_ts2str(frame->pts), ifilter->name);
3117  return 0;
3118  }
3119 
3120  if (!(ifp->opts.flags & IFILTER_FLAG_REINIT) && fgt->graph)
3121  need_reinit = 0;
3122 
3123  if (!!ifp->hw_frames_ctx != !!frame->hw_frames_ctx ||
3124  (ifp->hw_frames_ctx && ifp->hw_frames_ctx->data != frame->hw_frames_ctx->data))
3125  need_reinit |= HWACCEL_CHANGED;
3126 
3127  if (need_reinit) {
3129  if (ret < 0)
3130  return ret;
3131 
3132  /* Inputs bound to a filtergraph output will have some fields unset.
3133  * Handle them here */
3134  if (ifp->ofilter_src) {
3136  if (ret < 0)
3137  return ret;
3138  }
3139  }
3140 
3141  /* (re)init the graph if possible, otherwise buffer the frame and return */
3142  if (need_reinit || !fgt->graph) {
3143  AVFrame *tmp = av_frame_alloc();
3144 
3145  if (!tmp)
3146  return AVERROR(ENOMEM);
3147 
3148  if (!ifilter_has_all_input_formats(fg)) {
3150 
3151  ret = av_fifo_write(ifp->frame_queue, &tmp, 1);
3152  if (ret < 0)
3153  av_frame_free(&tmp);
3154 
3155  return ret;
3156  }
3157 
3158  ret = fgt->graph ? read_frames(fg, fgt, tmp) : 0;
3159  av_frame_free(&tmp);
3160  if (ret < 0)
3161  return ret;
3162 
3163  if (fgt->graph) {
3164  AVBPrint reason;
3166  if (need_reinit & AUDIO_CHANGED) {
3167  const char *sample_format_name = av_get_sample_fmt_name(frame->format);
3168  av_bprintf(&reason, "audio parameters changed to %d Hz, ", frame->sample_rate);
3169  av_channel_layout_describe_bprint(&frame->ch_layout, &reason);
3170  av_bprintf(&reason, ", %s, ", unknown_if_null(sample_format_name));
3171  }
3172  if (need_reinit & VIDEO_CHANGED) {
3173  const char *pixel_format_name = av_get_pix_fmt_name(frame->format);
3174  const char *color_space_name = av_color_space_name(frame->colorspace);
3175  const char *color_range_name = av_color_range_name(frame->color_range);
3176  const char *alpha_mode = av_alpha_mode_name(frame->alpha_mode);
3177  av_bprintf(&reason, "video parameters changed to %s(%s, %s), %dx%d, %s alpha, ",
3178  unknown_if_null(pixel_format_name), unknown_if_null(color_range_name),
3179  unknown_if_null(color_space_name), frame->width, frame->height,
3180  unknown_if_null(alpha_mode));
3181  }
3182  if (need_reinit & MATRIX_CHANGED)
3183  av_bprintf(&reason, "display matrix changed, ");
3184  if (need_reinit & DOWNMIX_CHANGED)
3185  av_bprintf(&reason, "downmix medatata changed, ");
3186  if (need_reinit & HWACCEL_CHANGED)
3187  av_bprintf(&reason, "hwaccel changed, ");
3188  if (reason.len > 1)
3189  reason.str[reason.len - 2] = '\0'; // remove last comma
3190  av_log(fg, AV_LOG_INFO, "Reconfiguring filter graph%s%s\n", reason.len ? " because " : "", reason.str);
3191  } else {
3192  /* Choke all input to avoid buffering excessive frames while the
3193  * initial filter graph is being configured, and before we have a
3194  * preferred input */
3195  sch_filter_choke_inputs(fgp->sch, fgp->sch_idx);
3196  }
3197 
3198  ret = configure_filtergraph(fg, fgt);
3199  if (ret < 0) {
3200  av_log(fg, AV_LOG_ERROR, "Error reinitializing filters!\n");
3201  return ret;
3202  }
3203  }
3204 
3205  frame->pts = av_rescale_q(frame->pts, frame->time_base, ifp->time_base);
3206  frame->duration = av_rescale_q(frame->duration, frame->time_base, ifp->time_base);
3207  frame->time_base = ifp->time_base;
3208 
3209  if (ifp->displaymatrix_applied)
3211 
3212  fd = frame_data(frame);
3213  if (!fd)
3214  return AVERROR(ENOMEM);
3216 
3219  if (ret < 0) {
3221  if (ret != AVERROR_EOF)
3222  av_log(fg, AV_LOG_ERROR, "Error while filtering: %s\n", av_err2str(ret));
3223  return ret;
3224  }
3225 
3226  return 0;
3227 }
3228 
3229 static void fg_thread_set_name(const FilterGraph *fg)
3230 {
3231  char name[16];
3232  if (filtergraph_is_simple(fg)) {
3233  OutputFilterPriv *ofp = ofp_from_ofilter(fg->outputs[0]);
3234  snprintf(name, sizeof(name), "%cf%s",
3236  ofp->ofilter.output_name);
3237  } else {
3238  snprintf(name, sizeof(name), "fc%d", fg->index);
3239  }
3240 
3242 }
3243 
3245 {
3246  if (fgt->frame_queue_out) {
3247  AVFrame *frame;
3248  while (av_fifo_read(fgt->frame_queue_out, &frame, 1) >= 0)
3249  av_frame_free(&frame);
3251  }
3252 
3253  av_frame_free(&fgt->frame);
3254  av_freep(&fgt->eof_in);
3255  av_freep(&fgt->eof_out);
3256 
3257  avfilter_graph_free(&fgt->graph);
3258 
3259  memset(fgt, 0, sizeof(*fgt));
3260 }
3261 
3262 static int fg_thread_init(FilterGraphThread *fgt, const FilterGraph *fg)
3263 {
3264  memset(fgt, 0, sizeof(*fgt));
3265 
3266  fgt->frame = av_frame_alloc();
3267  if (!fgt->frame)
3268  goto fail;
3269 
3270  fgt->eof_in = av_calloc(fg->nb_inputs, sizeof(*fgt->eof_in));
3271  if (!fgt->eof_in)
3272  goto fail;
3273 
3274  fgt->eof_out = av_calloc(fg->nb_outputs, sizeof(*fgt->eof_out));
3275  if (!fgt->eof_out)
3276  goto fail;
3277 
3279  if (!fgt->frame_queue_out)
3280  goto fail;
3281 
3282  return 0;
3283 
3284 fail:
3285  fg_thread_uninit(fgt);
3286  return AVERROR(ENOMEM);
3287 }
3288 
3289 static int filter_thread(void *arg)
3290 {
3291  FilterGraphPriv *fgp = arg;
3292  FilterGraph *fg = &fgp->fg;
3293 
3294  FilterGraphThread fgt;
3295  int ret = 0, input_status = 0;
3296 
3297  ret = fg_thread_init(&fgt, fg);
3298  if (ret < 0)
3299  goto finish;
3300 
3301  fg_thread_set_name(fg);
3302 
3303  // if we have all input parameters the graph can now be configured
3305  ret = configure_filtergraph(fg, &fgt);
3306  if (ret < 0) {
3307  av_log(fg, AV_LOG_ERROR, "Error configuring filter graph: %s\n",
3308  av_err2str(ret));
3309  goto finish;
3310  }
3311  }
3312 
3313  while (1) {
3314  InputFilter *ifilter;
3315  InputFilterPriv *ifp = NULL;
3316  enum FrameOpaque o;
3317  unsigned input_idx = fgt.next_in;
3318 
3319  input_status = sch_filter_receive(fgp->sch, fgp->sch_idx,
3320  &input_idx, fgt.frame);
3321  if (input_status == AVERROR_EOF) {
3322  av_log(fg, AV_LOG_VERBOSE, "Filtering thread received EOF\n");
3323  break;
3324  } else if (input_status == AVERROR(EAGAIN)) {
3325  // should only happen when we didn't request any input
3326  av_assert0(input_idx == fg->nb_inputs);
3327  goto read_frames;
3328  }
3329  av_assert0(input_status >= 0);
3330 
3331  o = (intptr_t)fgt.frame->opaque;
3332 
3333  // message on the control stream
3334  if (input_idx == fg->nb_inputs) {
3335  FilterCommand *fc;
3336 
3337  av_assert0(o == FRAME_OPAQUE_SEND_COMMAND && fgt.frame->buf[0]);
3338 
3339  fc = (FilterCommand*)fgt.frame->buf[0]->data;
3340  send_command(fg, fgt.graph, fc->time, fc->target, fc->command, fc->arg,
3341  fc->all_filters);
3342  av_frame_unref(fgt.frame);
3343  continue;
3344  }
3345 
3346  // we received an input frame or EOF
3347  ifilter = fg->inputs[input_idx];
3348  ifp = ifp_from_ifilter(ifilter);
3349 
3350  if (ifp->type_src == AVMEDIA_TYPE_SUBTITLE) {
3351  int hb_frame = input_status >= 0 && o == FRAME_OPAQUE_SUB_HEARTBEAT;
3352  ret = sub2video_frame(ifilter, (fgt.frame->buf[0] || hb_frame) ? fgt.frame : NULL,
3353  !fgt.graph);
3354  } else if (fgt.frame->buf[0]) {
3355  ret = send_frame(fg, &fgt, ifilter, fgt.frame);
3356  } else {
3358  ret = send_eof(&fgt, ifilter, fgt.frame->pts, fgt.frame->time_base);
3359  }
3360  av_frame_unref(fgt.frame);
3361  if (ret == AVERROR_EOF) {
3362  av_log(fg, AV_LOG_VERBOSE, "Input %u no longer accepts new data\n",
3363  input_idx);
3364  close_input(ifp);
3365  continue;
3366  }
3367  if (ret < 0)
3368  goto finish;
3369 
3370 read_frames:
3371  // retrieve all newly available frames
3372  ret = read_frames(fg, &fgt, fgt.frame);
3373  if (ret == AVERROR_EOF) {
3374  av_log(fg, AV_LOG_VERBOSE, "All consumers returned EOF\n");
3375  if (ifp && ifp->opts.flags & IFILTER_FLAG_DROPCHANGED)
3376  av_log(fg, AV_LOG_INFO, "Total changed input frames dropped : %"PRId64"\n", ifp->nb_dropped);
3377  break;
3378  } else if (ret < 0) {
3379  av_log(fg, AV_LOG_ERROR, "Error sending frames to consumers: %s\n",
3380  av_err2str(ret));
3381  goto finish;
3382  }
3383 
3384  // ensure all inputs no longer accepting data are closed
3385  for (int i = 0; fgt.graph && i < fg->nb_inputs; i++) {
3388  close_input(ifp);
3389  }
3390  }
3391 
3392  for (unsigned i = 0; i < fg->nb_outputs; i++) {
3394 
3395  if (fgt.eof_out[i] || !fgt.graph)
3396  continue;
3397 
3398  ret = fg_output_frame(ofp, &fgt, NULL);
3399  if (ret < 0)
3400  goto finish;
3401  }
3402 
3403 finish:
3404 
3406  print_filtergraph(fg, fgt.graph);
3407 
3408  // EOF is normal termination
3409  if (ret == AVERROR_EOF)
3410  ret = 0;
3411 
3412  fg_thread_uninit(&fgt);
3413 
3414  return ret;
3415 }
3416 
3417 void fg_send_command(FilterGraph *fg, double time, const char *target,
3418  const char *command, const char *arg, int all_filters)
3419 {
3420  FilterGraphPriv *fgp = fgp_from_fg(fg);
3421  AVBufferRef *buf;
3422  FilterCommand *fc;
3423 
3424  fc = av_mallocz(sizeof(*fc));
3425  if (!fc)
3426  return;
3427 
3428  buf = av_buffer_create((uint8_t*)fc, sizeof(*fc), filter_command_free, NULL, 0);
3429  if (!buf) {
3430  av_freep(&fc);
3431  return;
3432  }
3433 
3434  fc->target = av_strdup(target);
3435  fc->command = av_strdup(command);
3436  fc->arg = av_strdup(arg);
3437  if (!fc->target || !fc->command || !fc->arg) {
3438  av_buffer_unref(&buf);
3439  return;
3440  }
3441 
3442  fc->time = time;
3443  fc->all_filters = all_filters;
3444 
3445  fgp->frame->buf[0] = buf;
3446  fgp->frame->opaque = (void*)(intptr_t)FRAME_OPAQUE_SEND_COMMAND;
3447 
3448  sch_filter_command(fgp->sch, fgp->sch_idx, fgp->frame);
3449 }
AV_OPT_SEARCH_CHILDREN
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition: opt.h:605
InputFilterPriv::nb_dropped
uint64_t nb_dropped
Definition: ffmpeg_filter.c:118
SCH_FILTER_OUT
#define SCH_FILTER_OUT(filter, output)
Definition: ffmpeg_sched.h:129
AVSubtitle
Definition: avcodec.h:2100
AVBufferSrcParameters::side_data
AVFrameSideData ** side_data
Definition: buffersrc.h:124
AVBufferSrcParameters::color_space
enum AVColorSpace color_space
Video only, the YUV colorspace and range.
Definition: buffersrc.h:121
configure_input_filter
static int configure_input_filter(FilterGraph *fg, AVFilterGraph *graph, InputFilter *ifilter, AVFilterInOut *in)
Definition: ffmpeg_filter.c:2010
FilterGraphThread::next_in
unsigned next_in
Definition: ffmpeg_filter.c:91
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:203
av_gettime_relative
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
Definition: time.c:56
AVFILTER_CMD_FLAG_ONE
#define AVFILTER_CMD_FLAG_ONE
Stop once a filter understood the command (for target=all for example), fast filters are favored auto...
Definition: avfilter.h:469
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
AVFrame::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: frame.h:717
AV_BPRINT_SIZE_UNLIMITED
#define AV_BPRINT_SIZE_UNLIMITED
av_buffersink_get_ch_layout
int av_buffersink_get_ch_layout(const AVFilterContext *ctx, AVChannelLayout *out)
Definition: buffersink.c:367
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
av_buffersink_get_sample_aspect_ratio
AVRational av_buffersink_get_sample_aspect_ratio(const AVFilterContext *ctx)
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
extra_bits
#define extra_bits(eb)
Definition: intrax8.c:120
OutputFilter::graph
struct FilterGraph * graph
Definition: ffmpeg.h:393
av_clip
#define av_clip
Definition: common.h:100
sch_filter_send
int sch_filter_send(Scheduler *sch, unsigned fg_idx, unsigned out_idx, AVFrame *frame)
Called by filtergraph tasks to send a filtered frame or EOF to consumers.
Definition: ffmpeg_sched.c:2682
OutputFilter::class
const AVClass * class
Definition: ffmpeg.h:391
view_specifier_parse
int view_specifier_parse(const char **pspec, ViewSpecifier *vs)
Definition: ffmpeg_opt.c:309
VSYNC_VFR
@ VSYNC_VFR
Definition: ffmpeg.h:70
av_bprint_is_complete
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
Definition: bprint.h:218
r
const char * r
Definition: vf_curves.c:127
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:109
AVSubtitle::rects
AVSubtitleRect ** rects
Definition: avcodec.h:2105
opt.h
choose_input
static int choose_input(const FilterGraph *fg, const FilterGraphThread *fgt)
Definition: ffmpeg_filter.c:2346
get_rotation
double get_rotation(const int32_t *displaymatrix)
Definition: cmdutils.c:1553
FrameData::nb_side_data
int nb_side_data
Definition: ffmpeg.h:744
FilterGraphPriv::frame
AVFrame * frame
Definition: ffmpeg_filter.c:61
read_binary
static int read_binary(void *logctx, const char *path, uint8_t **data, int *len)
Definition: ffmpeg_filter.c:442
FilterGraphPriv::sch
Scheduler * sch
Definition: ffmpeg_filter.c:65
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:53
FilterGraphThread::got_frame
int got_frame
Definition: ffmpeg_filter.c:93
AVFilterGraph::nb_threads
int nb_threads
Maximum number of threads used by filters in this graph.
Definition: avfilter.h:615
InputFilterPriv::ch_layout
AVChannelLayout ch_layout
Definition: ffmpeg_filter.c:130
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:988
FrameData
Definition: ffmpeg.h:722
send_command
static void send_command(FilterGraph *fg, AVFilterGraph *graph, double time, const char *target, const char *command, const char *arg, int all_filters)
Definition: ffmpeg_filter.c:2321
InputFilterPriv::last_pts
int64_t last_pts
Definition: ffmpeg_filter.c:151
avfilter_graph_segment_create_filters
int avfilter_graph_segment_create_filters(AVFilterGraphSegment *seg, int flags)
Create filters specified in a graph segment.
Definition: graphparser.c:516
InputFilterOptions::crop_right
unsigned crop_right
Definition: ffmpeg.h:291
OutputFilter::apad
char * apad
Definition: ffmpeg.h:406
out
static FILE * out
Definition: movenc.c:55
av_frame_get_buffer
int av_frame_get_buffer(AVFrame *frame, int align)
Allocate new buffer(s) for audio or video data.
Definition: frame.c:206
av_bprint_init
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:69
av_frame_get_side_data
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition: frame.c:659
clone_side_data
static int clone_side_data(AVFrameSideData ***dst, int *nb_dst, AVFrameSideData *const *src, int nb_src, unsigned int flags)
Wrapper calling av_frame_side_data_clone() in a loop for all source entries.
Definition: ffmpeg_utils.h:50
FilterGraph::graph_desc
const char * graph_desc
Definition: ffmpeg.h:428
OutputFilterPriv::sample_fmts
enum AVSampleFormat * sample_fmts
Definition: ffmpeg_filter.c:227
atomic_fetch_add
#define atomic_fetch_add(object, operand)
Definition: stdatomic.h:137
sample_fmts
static enum AVSampleFormat sample_fmts[]
Definition: adpcmenc.c:933
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3456
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
FilterGraph::inputs
InputFilter ** inputs
Definition: ffmpeg.h:418
av_buffersink_get_frame_flags
int attribute_align_arg av_buffersink_get_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flags)
Get a frame with filtered data from sink and put it in frame.
Definition: buffersink.c:155
AVBufferSrcParameters::nb_side_data
int nb_side_data
Definition: buffersrc.h:125
InputFilterOptions::crop_bottom
unsigned crop_bottom
Definition: ffmpeg.h:289
av_dict_count
int av_dict_count(const AVDictionary *m)
Get number of entries in dictionary.
Definition: dict.c:37
AVFrame::nb_side_data
int nb_side_data
Definition: frame.h:664
ifilter_parameters_from_frame
static int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame)
Definition: ffmpeg_filter.c:2228
stream_specifier_parse
int stream_specifier_parse(StreamSpecifier *ss, const char *spec, int allow_remainder, void *logctx)
Parse a stream specifier string into a form suitable for matching.
Definition: cmdutils.c:1011
ofilter_class
static const AVClass ofilter_class
Definition: ffmpeg_filter.c:646
HWACCEL_CHANGED
@ HWACCEL_CHANGED
Definition: ffmpeg_filter.c:3063
frame_drop_threshold
float frame_drop_threshold
Definition: ffmpeg_opt.c:62
close_input
static void close_input(InputFilterPriv *ifp)
Definition: ffmpeg_filter.c:2630
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:263
ist_filter_add
int ist_filter_add(InputStream *ist, InputFilter *ifilter, int is_simple, const ViewSpecifier *vs, InputFilterOptions *opts, SchedulerNode *src)
Definition: ffmpeg_demux.c:1048
InputFilterPriv::time_base
AVRational time_base
Definition: ffmpeg_filter.c:132
int64_t
long long int64_t
Definition: coverity.c:34
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:226
configure_output_filter
static int configure_output_filter(FilterGraphPriv *fgp, AVFilterGraph *graph, OutputFilter *ofilter, AVFilterInOut *out)
Definition: ffmpeg_filter.c:1819
av_alpha_mode_name
const char * av_alpha_mode_name(enum AVAlphaMode mode)
Definition: pixdesc.c:3921
FilterCommand::arg
char * arg
Definition: ffmpeg_filter.c:256
AVSubtitleRect
Definition: avcodec.h:2073
av_asprintf
char * av_asprintf(const char *fmt,...)
Definition: avstring.c:115
AVSubtitle::num_rects
unsigned num_rects
Definition: avcodec.h:2104
dec_filter_add
int dec_filter_add(Decoder *dec, InputFilter *ifilter, InputFilterOptions *opts, const ViewSpecifier *vs, SchedulerNode *src)
Definition: ffmpeg_dec.c:1766
OutputFilterPriv::crop_left
unsigned crop_left
Definition: ffmpeg_filter.c:205
fg_free
void fg_free(FilterGraph **pfg)
Definition: ffmpeg_filter.c:1015
FPSConvContext::frames_prev_hist
int64_t frames_prev_hist[3]
Definition: ffmpeg_filter.c:171
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:64
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:64
AVFrame::opaque
void * opaque
Frame owner's private data.
Definition: frame.h:604
AVFrame::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: frame.h:728
InputFile::index
int index
Definition: ffmpeg.h:532
sample_rates
static const int sample_rates[]
Definition: dcaenc.h:34
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:466
AVFilterInOut::next
struct AVFilterInOut * next
next input/input in the list, NULL if this is the last
Definition: avfilter.h:757
pixdesc.h
AVFrame::pts
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:568
AVFrame::width
int width
Definition: frame.h:538
FilterGraphPriv::log_name
char log_name[32]
Definition: ffmpeg_filter.c:48
StreamSpecifier
Definition: cmdutils.h:113
ofilter_bind_enc
int ofilter_bind_enc(OutputFilter *ofilter, unsigned sched_idx_enc, const OutputFilterOptions *opts)
Definition: ffmpeg_filter.c:812
AVOption
AVOption.
Definition: opt.h:429
InputFilterPriv::ofilter_src
OutputFilter * ofilter_src
Definition: ffmpeg_filter.c:109
fg_output_frame
static int fg_output_frame(OutputFilterPriv *ofp, FilterGraphThread *fgt, AVFrame *frame)
Definition: ffmpeg_filter.c:2696
b
#define b
Definition: input.c:43
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:191
FilterGraph::index
int index
Definition: ffmpeg.h:416
OutputFilter::index
int index
Definition: ffmpeg.h:395
InputFilterPriv::sample_rate
int sample_rate
Definition: ffmpeg_filter.c:129
data
const char data[16]
Definition: mxf.c:149
InputFilter::index
int index
Definition: ffmpeg.h:376
FPSConvContext::last_dropped
int last_dropped
Definition: ffmpeg_filter.c:175
OutputFilterPriv::ts_offset
int64_t ts_offset
Definition: ffmpeg_filter.c:241
cleanup_filtergraph
static void cleanup_filtergraph(FilterGraph *fg, FilterGraphThread *fgt)
Definition: ffmpeg_filter.c:2020
OutputFilterPriv::alpha_mode
enum AVAlphaMode alpha_mode
Definition: ffmpeg_filter.c:201
ffmpeg.h
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
filter
void(* filter)(uint8_t *src, int stride, int qscale)
Definition: h263dsp.c:29
AVFILTER_AUTO_CONVERT_NONE
@ AVFILTER_AUTO_CONVERT_NONE
all automatic conversions disabled
Definition: avfilter.h:719
FilterGraph::nb_inputs
int nb_inputs
Definition: ffmpeg.h:419
VIDEO_CHANGED
@ VIDEO_CHANGED
Definition: ffmpeg_filter.c:3059
AV_FRAME_DATA_DISPLAYMATRIX
@ AV_FRAME_DATA_DISPLAYMATRIX
This side data contains a 3x3 transformation matrix describing an affine transformation that needs to...
Definition: frame.h:85
ViewSpecifier
Definition: ffmpeg.h:129
AVDictionary
Definition: dict.c:32
AVFrame::flags
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
Definition: frame.h:710
ofp_from_ofilter
static OutputFilterPriv * ofp_from_ofilter(OutputFilter *ofilter)
Definition: ffmpeg_filter.c:248
AVChannelLayout::order
enum AVChannelOrder order
Channel order used in this layout.
Definition: channel_layout.h:324
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
av_frame_side_data_clone
int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd, const AVFrameSideData *src, unsigned int flags)
Add a new side data entry to an array based on existing side data, taking a reference towards the con...
Definition: side_data.c:253
IFILTER_FLAG_AUTOROTATE
@ IFILTER_FLAG_AUTOROTATE
Definition: ffmpeg.h:268
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
configure_output_audio_filter
static int configure_output_audio_filter(FilterGraphPriv *fgp, AVFilterGraph *graph, OutputFilter *ofilter, AVFilterInOut *out)
Definition: ffmpeg_filter.c:1739
AVFrame::buf
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition: frame.h:643
AVBufferSrcParameters::height
int height
Definition: buffersrc.h:87
avio_size
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:326
av_strlcatf
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
Definition: avstring.c:103
fg_output_step
static int fg_output_step(OutputFilterPriv *ofp, FilterGraphThread *fgt, AVFrame *frame)
Definition: ffmpeg_filter.c:2779
FilterGraphPriv
Definition: ffmpeg_filter.c:44
av_channel_layout_describe_bprint
int av_channel_layout_describe_bprint(const AVChannelLayout *channel_layout, AVBPrint *bp)
bprint variant of av_channel_layout_describe().
Definition: channel_layout.c:600
FilterGraphThread::eof_in
uint8_t * eof_in
Definition: ffmpeg_filter.c:96
avfilter_graph_free
void avfilter_graph_free(AVFilterGraph **graph)
Free a graph, destroy its links, and set *graph to NULL.
Definition: avfiltergraph.c:119
configure_filtergraph
static int configure_filtergraph(FilterGraph *fg, FilterGraphThread *fgt)
Definition: ffmpeg_filter.c:2055
OutputFilterPriv::log_name
char log_name[32]
Definition: ffmpeg_filter.c:190
AUTO_INSERT_FILTER
#define AUTO_INSERT_FILTER(opt_name, filter_name, arg)
stream_specifier_uninit
void stream_specifier_uninit(StreamSpecifier *ss)
Definition: cmdutils.c:1002
InputStream
Definition: ffmpeg.h:483
filter_nbthreads
char * filter_nbthreads
Definition: ffmpeg_opt.c:76
debug_ts
int debug_ts
Definition: ffmpeg_opt.c:70
OutputFilterOptions
Definition: ffmpeg.h:311
InputFilterOptions::trim_start_us
int64_t trim_start_us
Definition: ffmpeg.h:276
InputFilterOptions::flags
unsigned flags
Definition: ffmpeg.h:297
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)
A convenience wrapper that allocates and initializes a filter in a single step.
Definition: avfiltergraph.c:140
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:167
finish
static void finish(void)
Definition: movenc.c:374
AV_OPT_TYPE_BINARY
@ AV_OPT_TYPE_BINARY
Underlying C type is a uint8_t* that is either NULL or points to an array allocated with the av_mallo...
Definition: opt.h:286
av_color_space_name
const char * av_color_space_name(enum AVColorSpace space)
Definition: pixdesc.c:3856
FRAME_OPAQUE_SUB_HEARTBEAT
@ FRAME_OPAQUE_SUB_HEARTBEAT
Definition: ffmpeg.h:89
OutputFilterPriv
Definition: ffmpeg_filter.c:186
FrameData::dec
struct FrameData::@6 dec
fg_thread_uninit
static void fg_thread_uninit(FilterGraphThread *fgt)
Definition: ffmpeg_filter.c:3244
filter_opt_apply
static int filter_opt_apply(void *logctx, AVFilterContext *f, const char *key, const char *val)
Definition: ffmpeg_filter.c:491
InputFilter::type
enum AVMediaType type
Definition: ffmpeg.h:379
AVBufferSrcParameters::sample_aspect_ratio
AVRational sample_aspect_ratio
Video only, the sample (pixel) aspect ratio.
Definition: buffersrc.h:92
av_fifo_write
int av_fifo_write(AVFifo *f, const void *buf, size_t nb_elems)
Write data into a FIFO.
Definition: fifo.c:188
AV_BUFFERSRC_FLAG_KEEP_REF
@ AV_BUFFERSRC_FLAG_KEEP_REF
Keep a reference to the frame.
Definition: buffersrc.h:53
sub2video_push_ref
static void sub2video_push_ref(InputFilterPriv *ifp, int64_t pts)
Definition: ffmpeg_filter.c:327
avfilter_graph_alloc
AVFilterGraph * avfilter_graph_alloc(void)
Allocate a filter graph.
Definition: avfiltergraph.c:85
AV_PIX_FMT_FLAG_HWACCEL
#define AV_PIX_FMT_FLAG_HWACCEL
Pixel format is an HW accelerated format.
Definition: pixdesc.h:128
FFSIGN
#define FFSIGN(a)
Definition: common.h:75
print_filtergraph
int print_filtergraph(FilterGraph *fg, AVFilterGraph *graph)
Definition: graphprint.c:948
samplefmt.h
OutputFilterPriv::side_data
AVFrameSideData ** side_data
Definition: ffmpeg_filter.c:208
AVERROR_OPTION_NOT_FOUND
#define AVERROR_OPTION_NOT_FOUND
Option not found.
Definition: error.h:63
avfilter_graph_segment_free
void avfilter_graph_segment_free(AVFilterGraphSegment **seg)
Free the provided AVFilterGraphSegment and everything associated with it.
Definition: graphparser.c:276
sub2video_get_blank_frame
static int sub2video_get_blank_frame(InputFilterPriv *ifp)
Definition: ffmpeg_filter.c:273
AV_BPRINT_SIZE_AUTOMATIC
#define AV_BPRINT_SIZE_AUTOMATIC
ifilter_has_all_input_formats
static int ifilter_has_all_input_formats(FilterGraph *fg)
Definition: ffmpeg_filter.c:616
AVFrame::alpha_mode
enum AVAlphaMode alpha_mode
Indicates how the alpha channel of the video is to be handled.
Definition: frame.h:821
val
static double val(void *priv, double ch)
Definition: aeval.c:77
AVFrame::ch_layout
AVChannelLayout ch_layout
Channel layout of the audio data.
Definition: frame.h:809
SCH_ENC
#define SCH_ENC(encoder)
Definition: ffmpeg_sched.h:123
configure_input_video_filter
static int configure_input_video_filter(FilterGraph *fg, AVFilterGraph *graph, InputFilter *ifilter, AVFilterInOut *in)
Definition: ffmpeg_filter.c:1840
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
avfilter_graph_segment_parse
int avfilter_graph_segment_parse(AVFilterGraph *graph, const char *graph_str, int flags, AVFilterGraphSegment **seg)
Parse a textual filtergraph description into an intermediate form.
Definition: graphparser.c:460
AVDownmixInfo
This structure describes optional metadata relevant to a downmix procedure.
Definition: downmix_info.h:58
pts
static int64_t pts
Definition: transcode_aac.c:649
av_opt_set
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
Definition: opt.c:825
graph_is_meta
static int graph_is_meta(AVFilterGraph *graph)
Definition: ffmpeg_filter.c:2036
median3
static int64_t median3(int64_t a, int64_t b, int64_t c)
Definition: ffmpeg_filter.c:2485
FilterGraphThread::frame
AVFrame * frame
Definition: ffmpeg_filter.c:83
ss
#define ss(width, name, subs,...)
Definition: cbs_vp9.c:202
FrameData::tb
AVRational tb
Definition: ffmpeg.h:732
OutputFilterPriv::sws_opts
AVDictionary * sws_opts
Definition: ffmpeg_filter.c:220
fgp_from_fg
static FilterGraphPriv * fgp_from_fg(FilterGraph *fg)
Definition: ffmpeg_filter.c:69
OutputFilterPriv::sample_rate
int sample_rate
Definition: ffmpeg_filter.c:197
av_reduce
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition: rational.c:35
FPSConvContext::dropped_keyframe
int dropped_keyframe
Definition: ffmpeg_filter.c:176
AVRational::num
int num
Numerator.
Definition: rational.h:59
OutputFilter::bound
int bound
Definition: ffmpeg.h:403
LATENCY_PROBE_FILTER_PRE
@ LATENCY_PROBE_FILTER_PRE
Definition: ffmpeg.h:103
InputFilterOptions::trim_end_us
int64_t trim_end_us
Definition: ffmpeg.h:277
AVFilterPad
A filter pad used for either input or output.
Definition: filters.h:40
sch_add_filtergraph
int sch_add_filtergraph(Scheduler *sch, unsigned nb_inputs, unsigned nb_outputs, SchThreadFunc func, void *ctx)
Add a filtergraph to the scheduler.
Definition: ffmpeg_sched.c:875
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:52
sub2video_heartbeat
static void sub2video_heartbeat(InputFilter *ifilter, int64_t pts, AVRational tb)
Definition: ffmpeg_filter.c:2926
avfilter_inout_free
void avfilter_inout_free(AVFilterInOut **inout)
Free the supplied list of AVFilterInOut and set *inout to NULL.
Definition: graphparser.c:76
OutputFilterPriv::nb_side_data
int nb_side_data
Definition: ffmpeg_filter.c:209
avassert.h
OutputFilterPriv::trim_start_us
int64_t trim_start_us
Definition: ffmpeg_filter.c:238
FrameData::frame_rate_filter
AVRational frame_rate_filter
Definition: ffmpeg.h:735
InputFilterPriv::nb_side_data
int nb_side_data
Definition: ffmpeg_filter.c:135
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
send_eof
static int send_eof(FilterGraphThread *fgt, InputFilter *ifilter, int64_t pts, AVRational tb)
Definition: ffmpeg_filter.c:2995
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
InputFilterPriv
Definition: ffmpeg_filter.c:100
av_fifo_read
int av_fifo_read(AVFifo *f, void *buf, size_t nb_elems)
Read data from a FIFO.
Definition: fifo.c:240
AV_FRAME_FLAG_KEY
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition: frame.h:681
av_buffersink_get_frame_rate
AVRational av_buffersink_get_frame_rate(const AVFilterContext *ctx)
Definition: buffersink.c:347
ifilter_alloc
static InputFilter * ifilter_alloc(FilterGraph *fg)
Definition: ffmpeg_filter.c:986
AVFilterChain::filters
AVFilterParams ** filters
Definition: avfilter.h:933
filter_command_free
static void filter_command_free(void *opaque, uint8_t *data)
Definition: ffmpeg_filter.c:262
VSYNC_VSCFR
@ VSYNC_VSCFR
Definition: ffmpeg.h:71
llrintf
#define llrintf(x)
Definition: libm.h:401
s
#define s(width, name)
Definition: cbs_vp9.c:198
ifilter_bind_ist
static int ifilter_bind_ist(InputFilter *ifilter, InputStream *ist, const ViewSpecifier *vs)
Definition: ffmpeg_filter.c:680
FilterGraphPriv::frame_enc
AVFrame * frame_enc
Definition: ffmpeg_filter.c:63
DOWNMIX_CHANGED
@ DOWNMIX_CHANGED
Definition: ffmpeg_filter.c:3062
InputFilterPriv::frame
AVFrame * frame
Definition: ffmpeg_filter.c:106
FilterGraph::outputs
OutputFilter ** outputs
Definition: ffmpeg.h:420
ofilter_item_name
static const char * ofilter_item_name(void *obj)
Definition: ffmpeg_filter.c:640
AVDictionaryEntry::key
char * key
Definition: dict.h:91
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
VIEW_SPECIFIER_TYPE_NONE
@ VIEW_SPECIFIER_TYPE_NONE
Definition: ffmpeg.h:118
AV_CHANNEL_ORDER_UNSPEC
@ AV_CHANNEL_ORDER_UNSPEC
Only the channel count is specified, without any further information about the channel order.
Definition: channel_layout.h:119
ifilter_bind_dec
static int ifilter_bind_dec(InputFilterPriv *ifp, Decoder *dec, const ViewSpecifier *vs)
Definition: ffmpeg_filter.c:739
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
OutputFilter::linklabel
uint8_t * linklabel
Definition: ffmpeg.h:404
InputFilter
Definition: ffmpeg.h:373
FilterGraphPriv::nb_outputs_done
unsigned nb_outputs_done
Definition: ffmpeg_filter.c:56
fc
#define fc(width, name, range_min, range_max)
Definition: cbs_av1.c:494
av_buffersink_get_format
int av_buffersink_get_format(const AVFilterContext *ctx)
av_buffersink_get_time_base
AVRational av_buffersink_get_time_base(const AVFilterContext *ctx)
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:296
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
OFILTER_FLAG_AUTOSCALE
@ OFILTER_FLAG_AUTOSCALE
Definition: ffmpeg.h:306
print_graphs_file
char * print_graphs_file
Definition: ffmpeg_opt.c:81
InputFilter::linklabel
uint8_t * linklabel
Definition: ffmpeg.h:387
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
AVSubtitle::pts
int64_t pts
Same as packet pts, in AV_TIME_BASE.
Definition: avcodec.h:2106
fg_thread_init
static int fg_thread_init(FilterGraphThread *fgt, const FilterGraph *fg)
Definition: ffmpeg_filter.c:3262
InputFilterOptions::name
uint8_t * name
Definition: ffmpeg.h:279
InputFilterOptions::crop_top
unsigned crop_top
Definition: ffmpeg.h:288
InputFilter::graph
struct FilterGraph * graph
Definition: ffmpeg.h:374
AV_SIDE_DATA_PROP_GLOBAL
@ AV_SIDE_DATA_PROP_GLOBAL
The side data type can be used in stream-global structures.
Definition: frame.h:335
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:51
key
const char * key
Definition: hwcontext_opencl.c:189
color_range
color_range
Definition: vf_selectivecolor.c:43
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
InputFilterPriv::sub2video
struct InputFilterPriv::@10 sub2video
AV_ROUND_NEAR_INF
@ AV_ROUND_NEAR_INF
Round to nearest and halfway cases away from zero.
Definition: mathematics.h:135
fsize
static int64_t fsize(FILE *f)
Definition: audiomatch.c:29
OutputFilterPriv::fps
FPSConvContext fps
Definition: ffmpeg_filter.c:243
av_buffersink_get_alpha_mode
enum AVAlphaMode av_buffersink_get_alpha_mode(const AVFilterContext *ctx)
fg_item_name
static const char * fg_item_name(void *obj)
Definition: ffmpeg_filter.c:1074
AV_ROUND_PASS_MINMAX
@ AV_ROUND_PASS_MINMAX
Flag telling rescaling functions to pass INT64_MIN/MAX through unchanged, avoiding special cases for ...
Definition: mathematics.h:159
command
static int command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
Definition: vf_drawtext.c:1196
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
arg
const char * arg
Definition: jacosubdec.c:65
OutputFilterPriv::ch_layouts
const AVChannelLayout * ch_layouts
Definition: ffmpeg_filter.c:229
if
if(ret)
Definition: filter_design.txt:179
OutputFilterPriv::width
int width
Definition: ffmpeg_filter.c:196
InputFilterOptions::crop_left
unsigned crop_left
Definition: ffmpeg.h:290
av_color_range_name
const char * av_color_range_name(enum AVColorRange range)
Definition: pixdesc.c:3772
AVBufferSrcParameters::alpha_mode
enum AVAlphaMode alpha_mode
Video only, the alpha mode.
Definition: buffersrc.h:130
AVFormatContext
Format I/O context.
Definition: avformat.h:1314
fail
#define fail
Definition: test.h:478
avfilter_get_by_name
const AVFilter * avfilter_get_by_name(const char *name)
Get a filter definition matching the given name.
Definition: allfilters.c:656
opts
static AVDictionary * opts
Definition: movenc.c:51
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:770
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
OutputFilter::name
uint8_t * name
Definition: ffmpeg.h:394
fabs
static __device__ float fabs(float a)
Definition: cuda_runtime.h:182
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:1434
OutputFilterPriv::crop_right
unsigned crop_right
Definition: ffmpeg_filter.c:206
OutputFilterPriv::enc_timebase
AVRational enc_timebase
Definition: ffmpeg_filter.c:237
avfilter_graph_segment_apply
int avfilter_graph_segment_apply(AVFilterGraphSegment *seg, int flags, AVFilterInOut **inputs, AVFilterInOut **outputs)
Apply all filter/link descriptions from a graph segment to the associated filtergraph.
Definition: graphparser.c:882
InputFilterPriv::color_space
enum AVColorSpace color_space
Definition: ffmpeg_filter.c:125
NULL
#define NULL
Definition: coverity.c:32
av_opt_set_bin
int av_opt_set_bin(void *obj, const char *name, const uint8_t *val, int len, int search_flags)
Definition: opt.c:885
set_channel_layout
static int set_channel_layout(OutputFilterPriv *f, const AVChannelLayout *layouts_allowed, const AVChannelLayout *layout_requested)
Definition: ffmpeg_filter.c:772
OutputFilterPriv::ch_layout
AVChannelLayout ch_layout
Definition: ffmpeg_filter.c:198
AVFilterParams
Parameters describing a filter to be created in a filtergraph.
Definition: avfilter.h:865
format
New swscale design to change SwsGraph is what coordinates multiple passes These can include cascaded scaling error diffusion and so on Or we could have separate passes for the vertical and horizontal scaling In between each SwsPass lies a fully allocated image buffer Graph passes may have different levels of e g we can have a single threaded error diffusion pass following a multi threaded scaling pass SwsGraph is internally recreated whenever the image format
Definition: swscale-v2.txt:14
FPSConvContext::dup_warning
uint64_t dup_warning
Definition: ffmpeg_filter.c:173
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:139
InputStream::st
AVStream * st
Definition: ffmpeg.h:491
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:162
InputFilterPriv::displaymatrix_present
int displaymatrix_present
Definition: ffmpeg_filter.c:141
Decoder
Definition: ffmpeg.h:469
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
OFILTER_FLAG_AUDIO_24BIT
@ OFILTER_FLAG_AUDIO_24BIT
Definition: ffmpeg.h:305
AVFilterChain::nb_filters
size_t nb_filters
Definition: avfilter.h:934
av_frame_side_data_remove
void av_frame_side_data_remove(AVFrameSideData ***sd, int *nb_sd, enum AVFrameSideDataType type)
Remove and free all side data instances of the given type from an array.
Definition: side_data.c:107
AVFilterGraph::filters
AVFilterContext ** filters
Definition: avfilter.h:591
ofilter_bind_ifilter
static int ofilter_bind_ifilter(OutputFilter *ofilter, InputFilterPriv *ifp, const OutputFilterOptions *opts)
Definition: ffmpeg_filter.c:927
av_fallthrough
#define av_fallthrough
Definition: attributes.h:67
OutputFilterPriv::sample_aspect_ratio
AVRational sample_aspect_ratio
Definition: ffmpeg_filter.c:218
ofilter_alloc
static OutputFilter * ofilter_alloc(FilterGraph *fg, enum AVMediaType type)
Definition: ffmpeg_filter.c:654
close_output
static int close_output(OutputFilterPriv *ofp, FilterGraphThread *fgt)
Definition: ffmpeg_filter.c:2640
FilterGraphThread::frame_queue_out
AVFifo * frame_queue_out
Definition: ffmpeg_filter.c:88
FilterGraphPriv::sch_idx
unsigned sch_idx
Definition: ffmpeg_filter.c:66
FrameData::wallclock
int64_t wallclock[LATENCY_PROBE_NB]
Definition: ffmpeg.h:739
avfilter_graph_request_oldest
int avfilter_graph_request_oldest(AVFilterGraph *graph)
Request a frame on the oldest sink link.
Definition: avfiltergraph.c:1567
time.h
AVFilterGraphSegment::chains
AVFilterChain ** chains
A list of filter chain contained in this segment.
Definition: avfilter.h:957
stream_specifier_match
unsigned stream_specifier_match(const StreamSpecifier *ss, const AVFormatContext *s, const AVStream *st, void *logctx)
Definition: cmdutils.c:1226
attributes.h
AVFilterGraph
Definition: avfilter.h:589
AV_FRAME_SIDE_DATA_FLAG_REPLACE
#define AV_FRAME_SIDE_DATA_FLAG_REPLACE
Don't add a new entry if another of the same type exists.
Definition: frame.h:1092
InputFilterPriv::downmixinfo_present
int downmixinfo_present
Definition: ffmpeg_filter.c:145
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:244
InputFilterOptions
Definition: ffmpeg.h:275
AVPixFmtDescriptor::flags
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
Definition: pixdesc.h:94
fg_create_simple
int fg_create_simple(FilterGraph **pfg, InputStream *ist, char **graph_desc, Scheduler *sch, unsigned sched_idx_enc, const OutputFilterOptions *opts)
Definition: ffmpeg_filter.c:1238
InputFilterPriv::sample_aspect_ratio
AVRational sample_aspect_ratio
Definition: ffmpeg_filter.c:124
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:743
FilterGraph::nb_outputs
int nb_outputs
Definition: ffmpeg.h:421
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
av_opt_set_int
int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
Definition: opt.c:870
InputStream::par
AVCodecParameters * par
Codec parameters - to be used by the decoding/streamcopy code.
Definition: ffmpeg.h:499
av_buffer_create
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
Definition: buffer.c:55
input_files
InputFile ** input_files
Definition: ffmpeg.c:108
AV_CLASS_CATEGORY_FILTER
@ AV_CLASS_CATEGORY_FILTER
Definition: log.h:36
Scheduler
Definition: ffmpeg_sched.c:278
FilterGraphPriv::fg
FilterGraph fg
Definition: ffmpeg_filter.c:45
FilterGraphPriv::nb_threads
int nb_threads
Definition: ffmpeg_filter.c:58
OutputFilterPriv::ofilter
OutputFilter ofilter
Definition: ffmpeg_filter.c:187
FilterGraph
Definition: ffmpeg.h:414
AVFilterGraphSegment
A parsed representation of a filtergraph segment.
Definition: avfilter.h:946
OutputFilterPriv::crop_bottom
unsigned crop_bottom
Definition: ffmpeg_filter.c:204
ENC_TIME_BASE_DEMUX
@ ENC_TIME_BASE_DEMUX
Definition: ffmpeg.h:78
InputFilterOptions::sub2video_width
int sub2video_width
Definition: ffmpeg.h:293
InputFilter::filter
AVFilterContext * filter
Definition: ffmpeg.h:381
AVBufferSrcParameters::frame_rate
AVRational frame_rate
Video only, the frame rate of the input video.
Definition: buffersrc.h:100
AVFilterInOut::pad_idx
int pad_idx
index of the filt_ctx pad to use for linking
Definition: avfilter.h:754
AVAlphaMode
AVAlphaMode
Correlation between the alpha channel and color values.
Definition: pixfmt.h:810
av_buffersrc_close
int av_buffersrc_close(AVFilterContext *ctx, int64_t pts, unsigned flags)
Close the buffer source after EOF.
Definition: buffersrc.c:291
AVFilterGraph::scale_sws_opts
char * scale_sws_opts
sws options to use for the auto-inserted scale filters
Definition: avfilter.h:594
filtergraph_is_simple
int filtergraph_is_simple(const FilterGraph *fg)
Definition: ffmpeg_filter.c:2315
VideoSyncMethod
VideoSyncMethod
Definition: ffmpeg.h:66
av_opt_find
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:1985
FrameData::side_data
AVFrameSideData ** side_data
Definition: ffmpeg.h:743
IFILTER_FLAG_REINIT
@ IFILTER_FLAG_REINIT
Definition: ffmpeg.h:269
f
f
Definition: af_crystalizer.c:122
OutputFilter::output_name
char * output_name
Definition: ffmpeg.h:399
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
av_ts2timestr
#define av_ts2timestr(ts, tb)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: timestamp.h:83
filter_thread
static int filter_thread(void *arg)
Definition: ffmpeg_filter.c:3289
AVMediaType
AVMediaType
Definition: avutil.h:198
InputFilterPriv::hw_frames_ctx
AVBufferRef * hw_frames_ctx
Definition: ffmpeg_filter.c:139
AVFifo
Definition: fifo.c:35
FRAME_OPAQUE_SEND_COMMAND
@ FRAME_OPAQUE_SEND_COMMAND
Definition: ffmpeg.h:91
FilterGraphThread
Definition: ffmpeg_filter.c:80
av_frame_ref
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition: frame.c:278
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:235
InputFilterPriv::displaymatrix
int32_t displaymatrix[9]
Definition: ffmpeg_filter.c:143
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition: channel_layout.h:319
OutputFilterPriv::color_ranges
enum AVColorRange * color_ranges
Definition: ffmpeg_filter.c:232
FilterGraphThread::graph
AVFilterGraph * graph
Definition: ffmpeg_filter.c:81
av_buffersrc_parameters_alloc
AVBufferSrcParameters * av_buffersrc_parameters_alloc(void)
Allocate a new AVBufferSrcParameters instance.
Definition: buffersrc.c:108
AVFilterInOut::filter_ctx
AVFilterContext * filter_ctx
filter context associated to this input/output
Definition: avfilter.h:751
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
av_err2str
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:122
AVFrame::sample_rate
int sample_rate
Sample rate of the audio data.
Definition: frame.h:629
av_buffersrc_get_status
int av_buffersrc_get_status(AVFilterContext *ctx)
Returns 0 or a negative AVERROR code.
Definition: buffersrc.c:300
OutputFilterPriv::tb_out_locked
int tb_out_locked
Definition: ffmpeg_filter.c:216
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:424
avfilter_link
int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad)
Link two filters together.
Definition: avfilter.c:149
sch_filter_choke_inputs
void sch_filter_choke_inputs(Scheduler *sch, unsigned fg_idx)
Called by filtergraph tasks to choke all filter inputs, preventing them from receiving more frames un...
Definition: ffmpeg_sched.c:2745
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:328
AVFILTER_FLAG_HWDEVICE
#define AVFILTER_FLAG_HWDEVICE
The filter can create hardware frames using AVFilterContext.hw_device_ctx.
Definition: avfilter.h:188
InputFilterPriv::color_range
enum AVColorRange color_range
Definition: ffmpeg_filter.c:126
OutputFilterPriv::displaymatrix
int32_t displaymatrix[9]
Definition: ffmpeg_filter.c:235
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:56
MATRIX_CHANGED
@ MATRIX_CHANGED
Definition: ffmpeg_filter.c:3061
FilterCommand::time
double time
Definition: ffmpeg_filter.c:258
InputFilterPriv::initialize
unsigned int initialize
marks if sub2video_update should force an initialization
Definition: ffmpeg_filter.c:155
InputFilterPriv::displaymatrix_applied
int displaymatrix_applied
Definition: ffmpeg_filter.c:142
avfilter_graph_queue_command
int avfilter_graph_queue_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, int flags, double ts)
Queue a command for one or more filter instances.
Definition: avfiltergraph.c:1484
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
AVFrame::time_base
AVRational time_base
Time base for the timestamps in this frame.
Definition: frame.h:583
AVFrameSideData::data
uint8_t * data
Definition: frame.h:323
AVFrame::format
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition: frame.h:553
FilterGraphPriv::disable_conversions
int disable_conversions
Definition: ffmpeg_filter.c:54
frame_data
FrameData * frame_data(AVFrame *frame)
Get our axiliary frame data attached to the frame, allocating it if needed.
Definition: ffmpeg.c:477
AVSubtitle::end_display_time
uint32_t end_display_time
Definition: avcodec.h:2103
FilterGraphThread::eof_out
uint8_t * eof_out
Definition: ffmpeg_filter.c:97
allocate_array_elem
void * allocate_array_elem(void *ptr, size_t elem_size, int *nb_elems)
Atomically add a new element to an array of pointers, i.e.
Definition: cmdutils.c:1540
FPSConvContext::vsync_method
enum VideoSyncMethod vsync_method
Definition: ffmpeg_filter.c:178
av_frame_remove_side_data
void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type)
Remove and free all side data instances of the given type.
Definition: frame.c:725
OutputFilter::filter
AVFilterContext * filter
Definition: ffmpeg.h:397
InputFilterPriv::width
int width
Definition: ffmpeg_filter.c:123
AVBufferSrcParameters::time_base
AVRational time_base
The timebase to be used for the timestamps on the input frames.
Definition: buffersrc.h:82
AV_PIX_FMT_RGB32
#define AV_PIX_FMT_RGB32
Definition: pixfmt.h:511
filter_is_buffersrc
static int filter_is_buffersrc(const AVFilterContext *f)
Definition: ffmpeg_filter.c:2029
fg_finalise_bindings
int fg_finalise_bindings(void)
Definition: ffmpeg_filter.c:1481
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
AUDIO_CHANGED
@ AUDIO_CHANGED
Definition: ffmpeg_filter.c:3060
sch_filter_receive
int sch_filter_receive(Scheduler *sch, unsigned fg_idx, unsigned *in_idx, AVFrame *frame)
Called by filtergraph tasks to obtain frames for filtering.
Definition: ffmpeg_sched.c:2604
fg_complex_bind_input
static int fg_complex_bind_input(FilterGraph *fg, InputFilter *ifilter, int commit)
Definition: ffmpeg_filter.c:1290
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:233
unknown_if_null
static const char * unknown_if_null(const char *str)
Definition: ffmpeg_filter.c:3066
InputFilterOptions::sub2video_height
int sub2video_height
Definition: ffmpeg.h:294
decoders
Decoder ** decoders
Definition: ffmpeg.c:117
OutputFilterPriv::log_parent
void * log_parent
Definition: ffmpeg_filter.c:189
nb_decoders
int nb_decoders
Definition: ffmpeg.c:118
OutputFilter::type
enum AVMediaType type
Definition: ffmpeg.h:408
read_frames
static int read_frames(FilterGraph *fg, FilterGraphThread *fgt, AVFrame *frame)
Definition: ffmpeg_filter.c:2866
av_channel_layout_compare
int av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1)
Check whether two channel layouts are semantically the same, i.e.
Definition: channel_layout.c:811
SUBTITLE_BITMAP
@ SUBTITLE_BITMAP
A bitmap, pict will be set.
Definition: avcodec.h:2056
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
send_frame
static int send_frame(FilterGraph *fg, FilterGraphThread *fgt, InputFilter *ifilter, AVFrame *frame)
Definition: ffmpeg_filter.c:3071
avfilter_init_str
int avfilter_init_str(AVFilterContext *filter, const char *args)
Initialize a filter with the supplied parameters.
Definition: avfilter.c:960
buffersink.h
av_buffersink_get_side_data
const AVFrameSideData *const * av_buffersink_get_side_data(const AVFilterContext *ctx, int *nb_side_data)
Definition: buffersink.c:380
av_channel_layout_default
void av_channel_layout_default(AVChannelLayout *ch_layout, int nb_channels)
Get the default channel layout for a given number of channels.
Definition: channel_layout.c:841
av_find_nearest_q_idx
int av_find_nearest_q_idx(AVRational q, const AVRational *q_list)
Find the value in a list of rationals nearest a given reference rational.
Definition: rational.c:140
OutputFilterPriv::color_range
enum AVColorRange color_range
Definition: ffmpeg_filter.c:200
av_buffersink_get_w
int av_buffersink_get_w(const AVFilterContext *ctx)
FilterCommand::all_filters
int all_filters
Definition: ffmpeg_filter.c:259
FPSConvContext::framerate_clip
int framerate_clip
Definition: ffmpeg_filter.c:183
bprint.h
FPSConvContext::frame_number
int64_t frame_number
Definition: ffmpeg_filter.c:167
filter_buffered_frames
int filter_buffered_frames
Definition: ffmpeg_opt.c:78
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:122
graph_opts_apply
static int graph_opts_apply(void *logctx, AVFilterGraphSegment *seg)
Definition: ffmpeg_filter.c:547
FPSConvContext
Definition: ffmpeg_filter.c:164
lrintf
#define lrintf(x)
Definition: libm_mips.h:72
av_malloc
#define av_malloc(s)
Definition: ops_asmgen.c:44
AVBufferSrcParameters::width
int width
Video only, the display dimensions of the input frames.
Definition: buffersrc.h:87
FrameData::bits_per_raw_sample
int bits_per_raw_sample
Definition: ffmpeg.h:737
av_frame_side_data_free
void av_frame_side_data_free(AVFrameSideData ***sd, int *nb_sd)
Free all side data entries and their contents, then zeroes out the values which the pointers are poin...
Definition: side_data.c:138
fg_send_command
void fg_send_command(FilterGraph *fg, double time, const char *target, const char *command, const char *arg, int all_filters)
Definition: ffmpeg_filter.c:3417
downmix_info.h
sch_remove_filtergraph
void sch_remove_filtergraph(Scheduler *sch, int idx)
Definition: ffmpeg_sched.c:485
FilterGraphPriv::is_simple
int is_simple
Definition: ffmpeg_filter.c:50
InputFilterOptions::fallback
AVFrame * fallback
Definition: ffmpeg.h:299
av_buffersrc_add_frame_flags
int attribute_align_arg av_buffersrc_add_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flags)
Add a frame to the buffer source.
Definition: buffersrc.c:210
VSYNC_CFR
@ VSYNC_CFR
Definition: ffmpeg.h:69
src2
const pixel * src2
Definition: h264pred_template.c:421
configure_input_audio_filter
static int configure_input_audio_filter(FilterGraph *fg, AVFilterGraph *graph, InputFilter *ifilter, AVFilterInOut *in)
Definition: ffmpeg_filter.c:1959
AVColorSpace
AVColorSpace
YUV colorspace type.
Definition: pixfmt.h:700
FPSConvContext::framerate_max
AVRational framerate_max
Definition: ffmpeg_filter.c:181
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:58
needed
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is needed
Definition: filter_design.txt:212
AVSampleFormat
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:55
OutputFilterPriv::crop_top
unsigned crop_top
Definition: ffmpeg_filter.c:203
delta
float delta
Definition: vorbis_enc_data.h:430
print_graphs
int print_graphs
Definition: ffmpeg_opt.c:80
FRAME_OPAQUE_EOF
@ FRAME_OPAQUE_EOF
Definition: ffmpeg.h:90
InputFile::ctx
AVFormatContext * ctx
Definition: ffmpeg.h:534
av_frame_move_ref
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
Definition: frame.c:523
cfgp_from_cfg
static const FilterGraphPriv * cfgp_from_cfg(const FilterGraph *fg)
Definition: ffmpeg_filter.c:74
graph_parse
static int graph_parse(void *logctx, AVFilterGraph *graph, const char *desc, AVFilterInOut **inputs, AVFilterInOut **outputs, AVBufferRef *hw_device)
Definition: ffmpeg_filter.c:571
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:496
InputFilterPriv::eof
int eof
Definition: ffmpeg_filter.c:115
ifilter_parameters_from_ofilter
static int ifilter_parameters_from_ofilter(InputFilter *ifilter, OutputFilter *ofilter)
Definition: ffmpeg_filter.c:2294
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
av_buffer_replace
int av_buffer_replace(AVBufferRef **pdst, const AVBufferRef *src)
Ensure dst refers to the same data as src.
Definition: buffer.c:233
IFILTER_FLAG_DROPCHANGED
@ IFILTER_FLAG_DROPCHANGED
Definition: ffmpeg.h:272
AVFrame::side_data
AVFrameSideData ** side_data
Definition: frame.h:663
len
int len
Definition: vorbis_enc_data.h:426
SchedulerNode
Definition: ffmpeg_sched.h:103
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:703
filtergraphs
FilterGraph ** filtergraphs
Definition: ffmpeg.c:114
int_cb
const AVIOInterruptCB int_cb
Definition: ffmpeg.c:312
OutputFilterPriv::color_space
enum AVColorSpace color_space
Definition: ffmpeg_filter.c:199
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
OFILTER_FLAG_CROP
@ OFILTER_FLAG_CROP
Definition: ffmpeg.h:308
outputs
static const AVFilterPad outputs[]
Definition: af_aap.c:310
sch_connect
int sch_connect(Scheduler *sch, SchedulerNode src, SchedulerNode dst)
Definition: ffmpeg_sched.c:973
FFMPEG_OPT_VSYNC_DROP
#define FFMPEG_OPT_VSYNC_DROP
Definition: ffmpeg.h:60
av_buffersink_get_h
int av_buffersink_get_h(const AVFilterContext *ctx)
OutputFilterPriv::needed
int needed
Definition: ffmpeg_filter.c:192
sch_filter_command
int sch_filter_command(Scheduler *sch, unsigned fg_idx, AVFrame *frame)
Definition: ffmpeg_sched.c:2735
AVFilter
Filter definition.
Definition: avfilter.h:216
video_sync_process
static void video_sync_process(OutputFilterPriv *ofp, AVFrame *frame, int64_t *nb_frames, int64_t *nb_frames_prev)
Definition: ffmpeg_filter.c:2506
ifp_from_ifilter
static InputFilterPriv * ifp_from_ifilter(InputFilter *ifilter)
Definition: ffmpeg_filter.c:159
OFILTER_FLAG_AUTOROTATE
@ OFILTER_FLAG_AUTOROTATE
Definition: ffmpeg.h:307
AV_BUFFERSINK_FLAG_NO_REQUEST
#define AV_BUFFERSINK_FLAG_NO_REQUEST
Tell av_buffersink_get_buffer_ref() not to request a frame from its input.
Definition: buffersink.h:92
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:747
AV_LOG_FATAL
#define AV_LOG_FATAL
Something went wrong and recovery is not possible.
Definition: log.h:204
pixfmt.h
AVClass::class_name
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:81
AVALPHA_MODE_UNSPECIFIED
@ AVALPHA_MODE_UNSPECIFIED
Unknown alpha handling, or no alpha channel.
Definition: pixfmt.h:811
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:265
InputFilter::name
uint8_t * name
Definition: ffmpeg.h:375
VSYNC_DROP
@ VSYNC_DROP
Definition: ffmpeg.h:73
av_channel_layout_check
int av_channel_layout_check(const AVChannelLayout *channel_layout)
Check whether a channel layout is valid, i.e.
Definition: channel_layout.c:785
FPSConvContext::last_frame
AVFrame * last_frame
Definition: ffmpeg_filter.c:165
InputFile::streams
InputStream ** streams
Definition: ffmpeg.h:548
insert_filter
static int insert_filter(AVFilterContext **last_filter, int *pad_idx, const char *filter_name, const char *args)
Definition: ffmpeg_filter.c:1583
OutputFilterPriv::next_pts
int64_t next_pts
Definition: ffmpeg_filter.c:242
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:122
ReinitReason
ReinitReason
Definition: ffmpeg_filter.c:3058
av_fifo_alloc2
AVFifo * av_fifo_alloc2(size_t nb_elems, size_t elem_size, unsigned int flags)
Allocate and initialize an AVFifo with a given element size.
Definition: fifo.c:47
AVOption::type
enum AVOptionType type
Definition: opt.h:445
AVFrame::sample_aspect_ratio
AVRational sample_aspect_ratio
Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
Definition: frame.h:563
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:993
av_dynarray_add_nofree
int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem)
Add an element to a dynamic array.
Definition: mem.c:315
AVBufferSrcParameters::color_range
enum AVColorRange color_range
Definition: buffersrc.h:122
FrameOpaque
FrameOpaque
Definition: ffmpeg.h:88
OutputFilterPriv::swr_opts
AVDictionary * swr_opts
Definition: ffmpeg_filter.c:221
av_get_media_type_string
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.
Definition: utils.c:28
AVFrame::height
int height
Definition: frame.h:538
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:753
IFILTER_FLAG_CROP
@ IFILTER_FLAG_CROP
Definition: ffmpeg.h:271
DEF_CHOOSE_FORMAT
#define DEF_CHOOSE_FORMAT(name, type, var, supported_list, none, printf_format, get_name)
Definition: ffmpeg_filter.c:384
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)
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:628
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
InputFilterPriv::bound
int bound
Definition: ffmpeg_filter.c:116
avfilter_init_dict
int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options)
Initialize a filter with the supplied dictionary of options.
Definition: avfilter.c:919
AVRational::den
int den
Denominator.
Definition: rational.h:60
InputStream::file
struct InputFile * file
Definition: ffmpeg.h:487
AVFilterChain
A filterchain is a list of filter specifications.
Definition: avfilter.h:932
InputFilterPriv::frame_queue
AVFifo * frame_queue
Definition: ffmpeg_filter.c:137
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
avfilter.h
InputFilterPriv::type_src
enum AVMediaType type_src
Definition: ffmpeg_filter.c:113
av_channel_layout_uninit
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
Definition: channel_layout.c:443
FilterGraphPriv::is_meta
int is_meta
Definition: ffmpeg_filter.c:53
insert_trim
static int insert_trim(void *logctx, int64_t start_time, int64_t duration, AVFilterContext **last_filter, int *pad_idx, const char *filter_name)
Definition: ffmpeg_filter.c:1532
IFILTER_FLAG_CFR
@ IFILTER_FLAG_CFR
Definition: ffmpeg.h:270
AVFILTER_FLAG_METADATA_ONLY
#define AVFILTER_FLAG_METADATA_ONLY
The filter is a "metadata" filter - it does not modify the frame data in any way.
Definition: avfilter.h:183
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:615
ifilter_bind_fg
static int ifilter_bind_fg(InputFilterPriv *ifp, FilterGraph *fg_src, int out_idx)
Definition: ffmpeg_filter.c:949
choose_out_timebase
static int choose_out_timebase(OutputFilterPriv *ofp, AVFrame *frame)
Definition: ffmpeg_filter.c:2369
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
OutputFilterPriv::flags
unsigned flags
Definition: ffmpeg_filter.c:245
OutputFilterPriv::sample_rates
const int * sample_rates
Definition: ffmpeg_filter.c:230
AVSideDataDescriptor
This struct describes the properties of a side data type.
Definition: frame.h:369
AVERROR_FILTER_NOT_FOUND
#define AVERROR_FILTER_NOT_FOUND
Filter not found.
Definition: error.h:60
sub2video_copy_rect
static void sub2video_copy_rect(uint8_t *dst, int dst_linesize, int w, int h, AVSubtitleRect *r)
Definition: ffmpeg_filter.c:296
InputFilterPriv::side_data
AVFrameSideData ** side_data
Definition: ffmpeg_filter.c:134
AVFilterGraphSegment::nb_chains
size_t nb_chains
Definition: avfilter.h:958
OutputFilterPriv::alpha_modes
enum AVAlphaMode * alpha_modes
Definition: ffmpeg_filter.c:233
AVFilterContext
An instance of a filter.
Definition: avfilter.h:274
FilterGraph::class
const AVClass * class
Definition: ffmpeg.h:415
av_channel_layout_copy
int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src)
Make a copy of a channel layout.
Definition: channel_layout.c:450
OutputFilter
Definition: ffmpeg.h:390
InputFilterPriv::drop_warned
int drop_warned
Definition: ffmpeg_filter.c:117
av_log_once
void av_log_once(void *avcl, int initial_level, int subsequent_level, int *state, const char *fmt,...)
Definition: log.c:451
sub2video_frame
static int sub2video_frame(InputFilter *ifilter, AVFrame *frame, int buffer)
Definition: ffmpeg_filter.c:2948
InputFilterPriv::ifilter
InputFilter ifilter
Definition: ffmpeg_filter.c:101
AVIO_FLAG_READ
#define AVIO_FLAG_READ
read-only
Definition: avio.h:617
desc
const char * desc
Definition: libsvtav1.c:83
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
configure_output_video_filter
static int configure_output_video_filter(FilterGraphPriv *fgp, AVFilterGraph *graph, OutputFilter *ofilter, AVFilterInOut *out)
Definition: ffmpeg_filter.c:1609
ViewSpecifier::type
enum ViewSpecifierType type
Definition: ffmpeg.h:130
av_buffersrc_get_nb_failed_requests
unsigned av_buffersrc_get_nb_failed_requests(AVFilterContext *buffer_src)
Get the number of failed requests.
Definition: buffersrc.c:352
OutputFilterPriv::color_spaces
enum AVColorSpace * color_spaces
Definition: ffmpeg_filter.c:231
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
avio_open2
int avio_open2(AVIOContext **s, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options)
Create and initialize a AVIOContext for accessing the resource indicated by url.
Definition: avio.c:497
av_buffersink_get_colorspace
enum AVColorSpace av_buffersink_get_colorspace(const AVFilterContext *ctx)
av_strdup
#define av_strdup(s)
Definition: ops_asmgen.c:47
adjust_frame_pts_to_encoder_tb
static double adjust_frame_pts_to_encoder_tb(void *logctx, AVFrame *frame, AVRational tb_dst, int64_t start_time)
Definition: ffmpeg_filter.c:2446
OutputFilter::nb_frames_drop
atomic_uint_least64_t nb_frames_drop
Definition: ffmpeg.h:411
auto_conversion_filters
int auto_conversion_filters
Definition: ffmpeg_opt.c:83
llrint
#define llrint(x)
Definition: libm.h:396
AVFrameSideData
Structure to hold side data for an AVFrame.
Definition: frame.h:321
bind_inputs
static int bind_inputs(FilterGraph *fg, int commit)
Definition: ffmpeg_filter.c:1463
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
w
uint8_t w
Definition: llvidencdsp.c:39
InputStream::index
int index
Definition: ffmpeg.h:489
sch_filter_receive_finish
void sch_filter_receive_finish(Scheduler *sch, unsigned fg_idx, unsigned in_idx)
Called by filter tasks to signal that a filter input will no longer accept input.
Definition: ffmpeg_sched.c:2655
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVDictionaryEntry
Definition: dict.h:90
ENC_TIME_BASE_FILTER
@ ENC_TIME_BASE_FILTER
Definition: ffmpeg.h:79
FilterCommand::target
char * target
Definition: ffmpeg_filter.c:254
OutputFilterPriv::pix_fmts
enum AVPixelFormat * pix_fmts
Definition: ffmpeg_filter.c:226
av_frame_side_data_desc
const AVSideDataDescriptor * av_frame_side_data_desc(enum AVFrameSideDataType type)
Definition: side_data.c:67
fg_class
static const AVClass fg_class
Definition: ffmpeg_filter.c:1081
fg_create
int fg_create(FilterGraph **pfg, char **graph_desc, Scheduler *sch, const OutputFilterOptions *opts)
Create a new filtergraph in the global filtergraph list.
Definition: ffmpeg_filter.c:1088
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_dict_set
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:86
av_dict_get_string
int av_dict_get_string(const AVDictionary *m, char **buffer, const char key_val_sep, const char pairs_sep)
Get dictionary entries as a string.
Definition: dict.c:260
OFILTER_FLAG_DISABLE_CONVERT
@ OFILTER_FLAG_DISABLE_CONVERT
Definition: ffmpeg.h:303
av_dict_copy
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
Definition: dict.c:247
Decoder::type
enum AVMediaType type
Definition: ffmpeg.h:472
AVFormatContext::name
char * name
Name of this format context, only used for logging purposes.
Definition: avformat.h:1944
InputFilterPriv::format
int format
Definition: ffmpeg_filter.c:121
InputFilterPriv::end_pts
int64_t end_pts
Definition: ffmpeg_filter.c:152
nb_filtergraphs
int nb_filtergraphs
Definition: ffmpeg.c:115
av_frame_side_data_get
static const AVFrameSideData * av_frame_side_data_get(AVFrameSideData *const *sd, const int nb_sd, enum AVFrameSideDataType type)
Wrapper around av_frame_side_data_get_c() to workaround the limitation that for any type T the conver...
Definition: frame.h:1190
int32_t
int32_t
Definition: audioconvert.c:56
InputFilterPriv::alpha_mode
enum AVAlphaMode alpha_mode
Definition: ffmpeg_filter.c:127
sub2video_update
static void sub2video_update(InputFilterPriv *ifp, int64_t heartbeat_pts, const AVSubtitle *sub)
Definition: ffmpeg_filter.c:343
timestamp.h
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
avio_close
int avio_close(AVIOContext *s)
Close the resource accessed by the AVIOContext s and free it.
Definition: avio.c:622
OutputFilterPriv::format
int format
Definition: ffmpeg_filter.c:195
av_strlcpy
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
Definition: avstring.c:85
avfilter_graph_send_command
int avfilter_graph_send_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, char *res, int res_len, int flags)
Send a command to one or more filter instances.
Definition: avfiltergraph.c:1454
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
graphprint.h
InputFilterPriv::opts
InputFilterOptions opts
Definition: ffmpeg_filter.c:103
dts_error_threshold
float dts_error_threshold
Definition: ffmpeg_opt.c:57
OutputFilterPriv::trim_duration_us
int64_t trim_duration_us
Definition: ffmpeg_filter.c:239
read_file_to_string
char * read_file_to_string(const char *filename)
Definition: cmdutils.c:1571
av_fifo_freep2
void av_fifo_freep2(AVFifo **f)
Free an AVFifo and reset pointer to NULL.
Definition: fifo.c:286
InputFilterPriv::downmixinfo
AVDownmixInfo downmixinfo
Definition: ffmpeg_filter.c:146
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
av_ts2str
#define av_ts2str(ts)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: timestamp.h:54
h
h
Definition: vp9dsp_template.c:2070
av_bprint_chars
void av_bprint_chars(AVBPrint *buf, char c, unsigned n)
Append char c n times to a print buffer.
Definition: bprint.c:130
hw_device_for_filter
AVBufferRef * hw_device_for_filter(void)
Get a hardware device to be used with this filtergraph.
Definition: ffmpeg_hw.c:298
AVDictionaryEntry::value
char * value
Definition: dict.h:92
AVFilterGraph::nb_filters
unsigned nb_filters
Definition: avfilter.h:592
avstring.h
AVColorRange
AVColorRange
Visual content value range.
Definition: pixfmt.h:742
frame_data_c
const FrameData * frame_data_c(AVFrame *frame)
Definition: ffmpeg.c:483
AV_BUFFERSRC_FLAG_PUSH
@ AV_BUFFERSRC_FLAG_PUSH
Immediately push the frame to the output.
Definition: buffersrc.h:46
OutputFilterPriv::tb_out
AVRational tb_out
Definition: ffmpeg_filter.c:213
AVFilterInOut
A linked-list of the inputs/outputs of the filter chain.
Definition: avfilter.h:746
VSYNC_PASSTHROUGH
@ VSYNC_PASSTHROUGH
Definition: ffmpeg.h:68
OutputFilterPriv::height
int height
Definition: ffmpeg_filter.c:196
AV_FRAME_DATA_DOWNMIX_INFO
@ AV_FRAME_DATA_DOWNMIX_INFO
Metadata relevant to a downmix procedure.
Definition: frame.h:73
snprintf
#define snprintf
Definition: snprintf.h:34
SCH_FILTER_IN
#define SCH_FILTER_IN(filter, input)
Definition: ffmpeg_sched.h:126
FPSConvContext::framerate
AVRational framerate
Definition: ffmpeg_filter.c:180
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
buffersrc.h
fg_thread_set_name
static void fg_thread_set_name(const FilterGraph *fg)
Definition: ffmpeg_filter.c:3229
ist_find_unused
InputStream * ist_find_unused(enum AVMediaType type)
Find an unused input stream of given type.
Definition: ffmpeg_demux.c:176
sub2video_prepare
static void sub2video_prepare(InputFilterPriv *ifp)
Definition: ffmpeg_filter.c:1829
FilterGraph::is_internal
int is_internal
Definition: ffmpeg.h:426
av_rescale_q_rnd
int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, enum AVRounding rnd)
Rescale a 64-bit integer by 2 rational numbers with specified rounding.
Definition: mathematics.c:134
av_dict_iterate
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
Definition: dict.c:42
AVSubtitle::start_display_time
uint32_t start_display_time
Definition: avcodec.h:2102
FilterCommand::command
char * command
Definition: ffmpeg_filter.c:255
src
#define src
Definition: vp8dsp.c:248
FilterCommand
Definition: ffmpeg_filter.c:253
duration
static int64_t duration
Definition: ffplay.c:329
AV_FIFO_FLAG_AUTO_GROW
#define AV_FIFO_FLAG_AUTO_GROW
Automatically resize the FIFO on writes, so that the data fits.
Definition: fifo.h:63
InputFilterPriv::height
int height
Definition: ffmpeg_filter.c:123
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:3376
OutputFilter::nb_frames_dup
atomic_uint_least64_t nb_frames_dup
Definition: ffmpeg.h:410
filter_complex_nbthreads
int filter_complex_nbthreads
Definition: ffmpeg_opt.c:77
InputFilterOptions::framerate
AVRational framerate
Definition: ffmpeg.h:286
av_buffersink_get_color_range
enum AVColorRange av_buffersink_get_color_range(const AVFilterContext *ctx)
ff_thread_setname
static int ff_thread_setname(const char *name)
Definition: thread.h:216
InputFilter::input_name
char * input_name
Definition: ffmpeg.h:383
LATENCY_PROBE_FILTER_POST
@ LATENCY_PROBE_FILTER_POST
Definition: ffmpeg.h:104
FPSConvContext::framerate_supported
const AVRational * framerate_supported
Definition: ffmpeg_filter.c:182