FFmpeg
Loading...
Searching...
No Matches
avfiltergraph.c
Go to the documentation of this file.
1/*
2 * filter graphs
3 * Copyright (c) 2008 Vitor Sessak
4 * Copyright (c) 2007 Bobby Bingham
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23#include "config.h"
24
25#include <string.h>
26
27#include "libavutil/avassert.h"
28#include "libavutil/bprint.h"
30#include "libavutil/imgutils.h"
31#include "libavutil/mem.h"
32#include "libavutil/opt.h"
33#include "libavutil/pixdesc.h"
34
35
36#include "avfilter.h"
37#include "avfilter_internal.h"
38#include "buffersink.h"
39#include "filters.h"
40#include "formats.h"
41#include "framequeue.h"
42#include "video.h"
43
44#define OFFSET(x) offsetof(AVFilterGraph, x)
45#define F AV_OPT_FLAG_FILTERING_PARAM
46#define V AV_OPT_FLAG_VIDEO_PARAM
47#define A AV_OPT_FLAG_AUDIO_PARAM
48static const AVOption filtergraph_options[] = {
49 { "thread_type", "Allowed thread types", OFFSET(thread_type), AV_OPT_TYPE_FLAGS,
50 { .i64 = AVFILTER_THREAD_SLICE }, 0, INT_MAX, F|V|A, .unit = "thread_type" },
51 { "slice", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVFILTER_THREAD_SLICE }, .flags = F|V|A, .unit = "thread_type" },
52 { "threads", "Maximum number of threads", OFFSET(nb_threads), AV_OPT_TYPE_INT,
53 { .i64 = 0 }, 0, INT_MAX, F|V|A, .unit = "threads"},
54 {"auto", "autodetect a suitable number of threads to use", 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, .flags = F|V|A, .unit = "threads"},
55 {"scale_sws_opts" , "default scale filter options" , OFFSET(scale_sws_opts) ,
56 AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, F|V },
57 {"aresample_swr_opts" , "default aresample filter options" , OFFSET(aresample_swr_opts) ,
58 AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, F|A },
59 {"max_buffered_frames" , "maximum number of buffered frames allowed", OFFSET(max_buffered_frames),
60 AV_OPT_TYPE_UINT, {.i64 = 0}, 0, UINT_MAX, F|V|A },
61 { NULL },
62};
63
64static const AVClass filtergraph_class = {
65 .class_name = "AVFilterGraph",
66 .item_name = av_default_item_name,
67 .version = LIBAVUTIL_VERSION_INT,
68 .option = filtergraph_options,
69 .category = AV_CLASS_CATEGORY_FILTER,
70};
71
72#if !HAVE_THREADS
76
78{
79 graph->p.thread_type = 0;
80 graph->p.nb_threads = 1;
81 return 0;
82}
83#endif
84
86{
87 FFFilterGraph *graph = av_mallocz(sizeof(*graph));
88 AVFilterGraph *ret;
89
90 if (!graph)
91 return NULL;
92
93 ret = &graph->p;
97
98 return ret;
99}
100
102{
103 int i, j;
104 for (i = 0; i < graph->nb_filters; i++) {
105 if (graph->filters[i] == filter) {
107 graph->filters[graph->nb_filters - 1]);
108 graph->nb_filters--;
109 filter->graph = NULL;
110 for (j = 0; j<filter->nb_outputs; j++)
111 if (filter->outputs[j])
112 ff_filter_link(filter->outputs[j])->graph = NULL;
113
114 return;
115 }
116 }
117}
118
120{
121 AVFilterGraph *graph = *graphp;
122 FFFilterGraph *graphi = fffiltergraph(graph);
123
124 if (!graph)
125 return;
126
127 while (graph->nb_filters)
128 avfilter_free(graph->filters[0]);
129
130 ff_graph_thread_free(graphi);
131
132 av_freep(&graphi->sink_links);
133
134 av_opt_free(graph);
135
136 av_freep(&graph->filters);
137 av_freep(graphp);
138}
139
141 const char *name, const char *args, void *opaque,
142 AVFilterGraph *graph_ctx)
143{
144 int ret;
145
146 *filt_ctx = avfilter_graph_alloc_filter(graph_ctx, filt, name);
147 if (!*filt_ctx)
148 return AVERROR(ENOMEM);
149
150 ret = avfilter_init_str(*filt_ctx, args);
151 if (ret < 0)
152 goto fail;
153
154 return 0;
155
156fail:
157 avfilter_free(*filt_ctx);
158 *filt_ctx = NULL;
159 return ret;
160}
161
166
168 const AVFilter *filter,
169 const char *name)
170{
172 FFFilterGraph *graphi = fffiltergraph(graph);
173
174 if (graph->thread_type && !graphi->thread_execute) {
175 if (graph->execute) {
176 graphi->thread_execute = graph->execute;
177 } else {
178 int ret = ff_graph_thread_init(graphi);
179 if (ret < 0) {
180 av_log(graph, AV_LOG_ERROR, "Error initializing threading: %s.\n", av_err2str(ret));
181 return NULL;
182 }
183 }
184 }
185
186 filters = av_realloc_array(graph->filters, graph->nb_filters + 1, sizeof(*filters));
187 if (!filters)
188 return NULL;
189 graph->filters = filters;
190
192 if (!s)
193 return NULL;
194
195 graph->filters[graph->nb_filters++] = s;
196
197 s->graph = graph;
198
199 return s;
200}
201
202/**
203 * Check for the validity of graph.
204 *
205 * A graph is considered valid if all its input and output pads are
206 * connected.
207 *
208 * @return >= 0 in case of success, a negative value otherwise
209 */
210static int graph_check_validity(AVFilterGraph *graph, void *log_ctx)
211{
213 int i, j;
214
215 for (i = 0; i < graph->nb_filters; i++) {
216 const AVFilterPad *pad;
217 filt = graph->filters[i];
218
219 for (j = 0; j < filt->nb_inputs; j++) {
220 if (!filt->inputs[j] || !filt->inputs[j]->src) {
221 pad = &filt->input_pads[j];
222 av_log(log_ctx, AV_LOG_ERROR,
223 "Input pad \"%s\" with type %s of the filter instance \"%s\" of %s not connected to any source\n",
224 pad->name, av_get_media_type_string(pad->type), filt->name, filt->filter->name);
225 return AVERROR(EINVAL);
226 }
227 }
228
229 for (j = 0; j < filt->nb_outputs; j++) {
230 if (!filt->outputs[j] || !filt->outputs[j]->dst) {
231 pad = &filt->output_pads[j];
232 av_log(log_ctx, AV_LOG_ERROR,
233 "Output pad \"%s\" with type %s of the filter instance \"%s\" of %s not connected to any destination\n",
234 pad->name, av_get_media_type_string(pad->type), filt->name, filt->filter->name);
235 return AVERROR(EINVAL);
236 }
237 }
238 }
239
240 return 0;
241}
242
243/**
244 * Configure all the links of graphctx.
245 *
246 * @return >= 0 in case of success, a negative value otherwise
247 */
248static int graph_config_links(AVFilterGraph *graph, void *log_ctx)
249{
251 int i, ret;
252
253 for (i = 0; i < graph->nb_filters; i++) {
254 filt = graph->filters[i];
255
256 if (!filt->nb_outputs) {
257 if ((ret = ff_filter_config_links(filt)))
258 return ret;
259 }
260 }
261
262 return 0;
263}
264
265static int graph_check_links(AVFilterGraph *graph, void *log_ctx)
266{
268 AVFilterLink *l;
269 unsigned i, j;
270 int ret;
271
272 for (i = 0; i < graph->nb_filters; i++) {
273 f = graph->filters[i];
274 for (j = 0; j < f->nb_outputs; j++) {
275 l = f->outputs[j];
276 if (l->type == AVMEDIA_TYPE_VIDEO) {
277 ret = av_image_check_size2(l->w, l->h, INT64_MAX, l->format, 0, f);
278 if (ret < 0)
279 return ret;
280 }
281 }
282 }
283 return 0;
284}
285
287{
288 int i;
289
290 for (i = 0; i < graph->nb_filters; i++)
291 if (graph->filters[i]->name && !strcmp(name, graph->filters[i]->name))
292 return graph->filters[i];
293
294 return NULL;
295}
296
298{
299 int ret;
300
301 switch (link->type) {
302
304 if ((ret = ff_formats_check_pixel_formats(log, cfg->formats)) < 0 ||
305 (ret = ff_formats_check_color_spaces(log, cfg->color_spaces)) < 0 ||
306 (ret = ff_formats_check_color_ranges(log, cfg->color_ranges)) < 0 ||
307 (ret = ff_formats_check_alpha_modes(log, cfg->alpha_modes)) < 0 ||
308 (ret = ff_formats_check_chroma_locations(log, cfg->chroma_locations)) < 0)
309 return ret;
310 break;
311
313 if ((ret = ff_formats_check_sample_formats(log, cfg->formats)) < 0 ||
314 (ret = ff_formats_check_sample_rates(log, cfg->samplerates)) < 0 ||
315 (ret = ff_formats_check_channel_layouts(log, cfg->channel_layouts)) < 0)
316 return ret;
317 break;
318
319 default:
320 av_assert0(!"reached");
321 }
322 return 0;
323}
324
325/**
326 * Check the validity of the formats / etc. lists set by query_formats().
327 *
328 * In particular, check they do not contain any redundant element.
329 */
331{
332 unsigned i;
333 int ret;
334
335 for (i = 0; i < ctx->nb_inputs; i++) {
336 ret = filter_link_check_formats(ctx, ctx->inputs[i], &ctx->inputs[i]->outcfg);
337 if (ret < 0)
338 return ret;
339 }
340 for (i = 0; i < ctx->nb_outputs; i++) {
341 ret = filter_link_check_formats(ctx, ctx->outputs[i], &ctx->outputs[i]->incfg);
342 if (ret < 0)
343 return ret;
344 }
345 return 0;
346}
347
349{
350 const FFFilter *const filter = fffilter(ctx->filter);
351 int ret;
352
353 if (filter->formats_state == FF_FILTER_FORMATS_QUERY_FUNC) {
354 if ((ret = filter->formats.query_func(ctx)) < 0) {
355 if (ret != AVERROR(EAGAIN))
356 av_log(ctx, AV_LOG_ERROR, "Query format failed for '%s': %s\n",
357 ctx->name, av_err2str(ret));
358 return ret;
359 }
360 } else if (filter->formats_state == FF_FILTER_FORMATS_QUERY_FUNC2) {
361 AVFilterFormatsConfig *cfg_in_stack[64], *cfg_out_stack[64];
362 AVFilterFormatsConfig **cfg_in_dyn = NULL, **cfg_out_dyn = NULL;
363 AVFilterFormatsConfig **cfg_in, **cfg_out;
364
365 if (ctx->nb_inputs > FF_ARRAY_ELEMS(cfg_in_stack)) {
366 cfg_in_dyn = av_malloc_array(ctx->nb_inputs, sizeof(*cfg_in_dyn));
367 if (!cfg_in_dyn)
368 return AVERROR(ENOMEM);
369 cfg_in = cfg_in_dyn;
370 } else
371 cfg_in = ctx->nb_inputs ? cfg_in_stack : NULL;
372
373 for (unsigned i = 0; i < ctx->nb_inputs; i++) {
374 AVFilterLink *l = ctx->inputs[i];
375 cfg_in[i] = &l->outcfg;
376 }
377
378 if (ctx->nb_outputs > FF_ARRAY_ELEMS(cfg_out_stack)) {
379 cfg_out_dyn = av_malloc_array(ctx->nb_outputs, sizeof(*cfg_out_dyn));
380 if (!cfg_out_dyn) {
381 av_freep(&cfg_in_dyn);
382 return AVERROR(ENOMEM);
383 }
384 cfg_out = cfg_out_dyn;
385 } else
386 cfg_out = ctx->nb_outputs ? cfg_out_stack : NULL;
387
388 for (unsigned i = 0; i < ctx->nb_outputs; i++) {
389 AVFilterLink *l = ctx->outputs[i];
390 cfg_out[i] = &l->incfg;
391 }
392
393 ret = filter->formats.query_func2(ctx, cfg_in, cfg_out);
394 av_freep(&cfg_in_dyn);
395 av_freep(&cfg_out_dyn);
396 if (ret < 0) {
397 if (ret != AVERROR(EAGAIN))
398 av_log(ctx, AV_LOG_ERROR, "Query format failed for '%s': %s\n",
399 ctx->name, av_err2str(ret));
400 return ret;
401 }
402 }
403
404 if (filter->formats_state == FF_FILTER_FORMATS_QUERY_FUNC ||
405 filter->formats_state == FF_FILTER_FORMATS_QUERY_FUNC2) {
407 if (ret < 0)
408 return ret;
409 }
410
412}
413
415{
416 int i;
417
418 for (i = 0; i < f->nb_inputs; i++) {
419 if (!f->inputs[i]->outcfg.formats)
420 return 0;
421 if (f->inputs[i]->type == AVMEDIA_TYPE_VIDEO &&
422 !(f->inputs[i]->outcfg.color_ranges &&
423 f->inputs[i]->outcfg.color_spaces &&
424 f->inputs[i]->outcfg.alpha_modes &&
425 f->inputs[i]->outcfg.chroma_locations))
426 return 0;
427 if (f->inputs[i]->type == AVMEDIA_TYPE_AUDIO &&
428 !(f->inputs[i]->outcfg.samplerates &&
429 f->inputs[i]->outcfg.channel_layouts))
430 return 0;
431 }
432 for (i = 0; i < f->nb_outputs; i++) {
433 if (!f->outputs[i]->incfg.formats)
434 return 0;
435 if (f->outputs[i]->type == AVMEDIA_TYPE_VIDEO &&
436 !(f->outputs[i]->incfg.color_ranges &&
437 f->outputs[i]->incfg.color_spaces &&
438 f->outputs[i]->incfg.alpha_modes &&
439 f->outputs[i]->incfg.chroma_locations))
440 return 0;
441 if (f->outputs[i]->type == AVMEDIA_TYPE_AUDIO &&
442 !(f->outputs[i]->incfg.samplerates &&
443 f->outputs[i]->incfg.channel_layouts))
444 return 0;
445 }
446 return 1;
447}
448
449static void print_link_formats(void *log_ctx, int level, const AVFilterLink *l,
450 const AVFilterFormatsMerger *mergers[],
451 int nb_mergers)
452{
453 if (av_log_get_level() < level)
454 return;
455
456 AVBPrint bp;
458
459 av_log(log_ctx, level, "Link '%s.%s' -> '%s.%s':\n",
460 l->src->name, l->srcpad->name, l->dst->name, l->dstpad->name);
461
462 for (unsigned i = 0; i < nb_mergers; i++) {
463 const AVFilterFormatsMerger *m = mergers[i];
464 av_log(log_ctx, level, " %s:\n", m->name);
465 m->print_list(&bp, FF_FIELD_AT(void *, m->offset, l->incfg));
466 if (av_bprint_is_complete(&bp))
467 av_log(log_ctx, level, " src: %s\n", bp.str);
468 av_bprint_clear(&bp);
469
470 m->print_list(&bp, FF_FIELD_AT(void *, m->offset, l->outcfg));
471 if (av_bprint_is_complete(&bp))
472 av_log(log_ctx, level, " dst: %s\n", bp.str);
473 av_bprint_clear(&bp);
474 }
475
477}
478
479static void print_filter_formats(void *log_ctx, int level, const AVFilterContext *f)
480{
481 if (av_log_get_level() < level)
482 return;
483
484 AVBPrint bp;
486
487 av_log(log_ctx, level, "Filter '%s' formats:\n", f->name);
488 for (int i = 0; i < f->nb_inputs; i++) {
489 const AVFilterLink *in = f->inputs[i];
491 av_log(log_ctx, level, " in[%d] '%s':\n", i, f->input_pads[i].name);
492
493 for (unsigned i = 0; i < neg->nb_mergers; i++) {
494 const AVFilterFormatsMerger *m = &neg->mergers[i];
495 m->print_list(&bp, FF_FIELD_AT(void *, m->offset, in->outcfg));
496 if (av_bprint_is_complete(&bp))
497 av_log(log_ctx, level, " %s: %s\n", m->name, bp.str);
498 av_bprint_clear(&bp);
499 }
500 }
501
502 for (int i = 0; i < f->nb_outputs; i++) {
503 const AVFilterLink *out = f->outputs[i];
505 av_log(log_ctx, level, " out[%d] '%s':\n", i, f->output_pads[i].name);
506
507 for (unsigned i = 0; i < neg->nb_mergers; i++) {
508 const AVFilterFormatsMerger *m = &neg->mergers[i];
509 m->print_list(&bp, FF_FIELD_AT(void *, m->offset, out->incfg));
510 if (av_bprint_is_complete(&bp))
511 av_log(log_ctx, level, " %s: %s\n", m->name, bp.str);
512 av_bprint_clear(&bp);
513 }
514 }
515
517}
518
519/**
520 * Perform one round of query_formats() and merging formats lists on the
521 * filter graph.
522 * @return >=0 if all links formats lists could be queried and merged;
523 * AVERROR(EAGAIN) some progress was made in the queries or merging
524 * and a later call may succeed;
525 * AVERROR(EIO) (may be changed) plus a log message if no progress
526 * was made and the negotiation is stuck;
527 * a negative error code if some other error happened
528 */
529static int query_formats(AVFilterGraph *graph, void *log_ctx)
530{
531 int i, j, k, ret;
532 int converter_count = 0;
533 int count_queried = 0; /* successful calls to query_formats() */
534 int count_merged = 0; /* successful merge of formats lists */
535 int count_already_merged = 0; /* lists already merged */
536 int count_delayed = 0; /* lists that need to be merged later */
537
538 for (i = 0; i < graph->nb_filters; i++) {
539 AVFilterContext *f = graph->filters[i];
540 if (formats_declared(f))
541 continue;
542 ret = filter_query_formats(f);
543 if (ret < 0 && ret != AVERROR(EAGAIN))
544 return ret;
545 /* note: EAGAIN could indicate a partial success, not counted yet */
546 if (ret >= 0) {
548 count_queried++;
549 }
550 }
551
552 /* go through and merge as many format lists as possible */
553retry:
554 for (i = 0; i < graph->nb_filters; i++) {
555 AVFilterContext *filter = graph->filters[i];
556
557 for (j = 0; j < filter->nb_inputs; j++) {
558 AVFilterLink *link = filter->inputs[j];
559 const AVFilterNegotiation *neg;
560 AVFilterContext *conv[4];
561 const AVFilterFormatsMerger *mergers[4]; /* triggered mergers */
562 const char *conv_filters[4], *conv_opts[4] = {0};
563 unsigned neg_step, num_conv = 0, num_mergers = 0;
564
565 if (!link)
566 continue;
567
568 neg = ff_filter_get_negotiation(link);
569 av_assert0(neg);
570 for (neg_step = 0; neg_step < neg->nb_mergers; neg_step++) {
571 const AVFilterFormatsMerger *m = &neg->mergers[neg_step];
572 void *a = FF_FIELD_AT(void *, m->offset, link->incfg);
573 void *b = FF_FIELD_AT(void *, m->offset, link->outcfg);
574 if (a && b && a != b && !m->can_merge(a, b)) {
575 for (k = 0; k < num_conv; k++) {
576 if (!strcmp(conv_filters[k], m->conversion_filter))
577 break;
578 }
579 if (k == num_conv) {
580 av_assert1(num_conv < FF_ARRAY_ELEMS(conv_filters));
581 conv_filters[num_conv] = m->conversion_filter;
583 conv_opts[num_conv] = FF_FIELD_AT(char *, m->conversion_opts_offset, *graph);
584 num_conv++;
585 }
586 av_assert1(num_mergers < FF_ARRAY_ELEMS(mergers));
587 mergers[num_mergers++] = m;
588 }
589 }
590 for (neg_step = 0; neg_step < neg->nb_mergers; neg_step++) {
591 const AVFilterFormatsMerger *m = &neg->mergers[neg_step];
592 void *a = FF_FIELD_AT(void *, m->offset, link->incfg);
593 void *b = FF_FIELD_AT(void *, m->offset, link->outcfg);
594 if (!(a && b)) {
595 count_delayed++;
596 } else if (a == b) {
597 count_already_merged++;
598 } else if (!num_conv) {
599 count_merged++;
600 ret = m->merge(a, b);
601 if (ret < 0)
602 return ret;
603 if (!ret) {
604 mergers[num_mergers++] = m;
605 conv_filters[num_conv] = m->conversion_filter;
607 conv_opts[num_conv] = FF_FIELD_AT(char *, m->conversion_opts_offset, *graph);
608 num_conv++;
609 }
610 }
611 }
612
613 /**
614 * Couldn't merge format lists; auto-insert conversion filters
615 * in reverse order to keep the order consistent with the list
616 * of mergers, since they are prepended onto the existing link
617 */
618 for (k = num_conv - 1; k >= 0; k--) {
619 const AVFilter *filter;
620 char inst_name[30];
621
622 if (fffiltergraph(graph)->disable_auto_convert) {
623 av_log(log_ctx, AV_LOG_ERROR,
624 "The filters '%s' and '%s' do not have a common format "
625 "and automatic conversion is disabled.\n",
626 link->src->name, link->dst->name);
627 print_link_formats(log_ctx, AV_LOG_ERROR, link, mergers, num_mergers);
628 return AVERROR(EINVAL);
629 }
630
631 if (!(filter = avfilter_get_by_name(conv_filters[k]))) {
632 av_log(log_ctx, AV_LOG_ERROR,
633 "'%s' filter not present, cannot convert formats.\n",
634 conv_filters[k]);
635 print_link_formats(log_ctx, AV_LOG_ERROR, link, mergers, num_mergers);
636 return AVERROR(EINVAL);
637 }
638 snprintf(inst_name, sizeof(inst_name), "auto_%s_%d",
639 conv_filters[k], converter_count++);
640 ret = avfilter_graph_create_filter(&conv[k], filter, inst_name,
641 conv_opts[k], NULL, graph);
642 if (ret < 0)
643 return ret;
644 if ((ret = avfilter_insert_filter(link, conv[k], 0, 0)) < 0)
645 return ret;
646
647 if ((ret = filter_query_formats(conv[k])) < 0)
648 return ret;
649 }
650
651 /* preemptively settle formats of auto filters */
652 for (k = 0; k < num_conv; k++) {
653 AVFilterLink *inlink = conv[k]->inputs[0];
654 AVFilterLink *outlink = conv[k]->outputs[0];
655 av_assert0( inlink->incfg.formats->refcount > 0);
656 av_assert0( inlink->outcfg.formats->refcount > 0);
657 av_assert0(outlink->incfg.formats->refcount > 0);
658 av_assert0(outlink->outcfg.formats->refcount > 0);
659 if (outlink->type == AVMEDIA_TYPE_VIDEO) {
660 av_assert0( inlink-> incfg.color_spaces->refcount > 0);
661 av_assert0( inlink->outcfg.color_spaces->refcount > 0);
662 av_assert0(outlink-> incfg.color_spaces->refcount > 0);
663 av_assert0(outlink->outcfg.color_spaces->refcount > 0);
664 av_assert0( inlink-> incfg.color_ranges->refcount > 0);
665 av_assert0( inlink->outcfg.color_ranges->refcount > 0);
666 av_assert0(outlink-> incfg.color_ranges->refcount > 0);
667 av_assert0(outlink->outcfg.color_ranges->refcount > 0);
668 av_assert0( inlink-> incfg.alpha_modes->refcount > 0);
669 av_assert0( inlink->outcfg.alpha_modes->refcount > 0);
670 av_assert0(outlink-> incfg.alpha_modes->refcount > 0);
671 av_assert0(outlink->outcfg.alpha_modes->refcount > 0);
672 av_assert0( inlink-> incfg.chroma_locations->refcount > 0);
674 av_assert0(outlink-> incfg.chroma_locations->refcount > 0);
676 } else if (outlink->type == AVMEDIA_TYPE_AUDIO) {
677 av_assert0( inlink-> incfg.samplerates->refcount > 0);
678 av_assert0( inlink->outcfg.samplerates->refcount > 0);
679 av_assert0(outlink-> incfg.samplerates->refcount > 0);
680 av_assert0(outlink->outcfg.samplerates->refcount > 0);
681 av_assert0( inlink-> incfg.channel_layouts->refcount > 0);
683 av_assert0(outlink-> incfg.channel_layouts->refcount > 0);
685 }
686
687#define MERGE(merger, link) \
688 ((merger)->merge(FF_FIELD_AT(void *, (merger)->offset, (link)->incfg), \
689 FF_FIELD_AT(void *, (merger)->offset, (link)->outcfg)))
690
691 for (neg_step = 0; neg_step < neg->nb_mergers; neg_step++) {
692 const AVFilterFormatsMerger *m = &neg->mergers[neg_step];
693 if (strcmp(m->conversion_filter, conv_filters[k]))
694 continue;
695 if ((ret = MERGE(m, inlink)) <= 0 ||
696 (ret = MERGE(m, outlink)) <= 0) {
697 if (ret < 0)
698 return ret;
699 av_log(log_ctx, AV_LOG_ERROR,
700 "Impossible to convert between the formats supported by the filter "
701 "'%s' and the filter '%s'\n", link->src->name, link->dst->name);
702 print_link_formats(log_ctx, AV_LOG_ERROR, inlink, &m, 1);
703 print_link_formats(log_ctx, AV_LOG_ERROR, outlink, &m, 1);
704 return AVERROR(ENOSYS);
705 } else {
706 count_merged += 2;
707 }
708 }
709 }
710
711 /* if there is an auto filter, we may need another round to fully
712 * settle formats due to possible cross-incompatibilities between
713 * the auto filters themselves, or between the auto filters and
714 * a different attribute of the filter they are modifying */
715 if (num_conv)
716 goto retry;
717 }
718 }
719
720 av_log(graph, AV_LOG_DEBUG, "query_formats: "
721 "%d queried, %d merged, %d already done, %d delayed\n",
722 count_queried, count_merged, count_already_merged, count_delayed);
723 if (count_delayed) {
724 AVBPrint bp;
725
726 /* if count_queried > 0, one filter at least did set its formats,
727 that will give additional information to its neighbour;
728 if count_merged > 0, one pair of formats lists at least was merged,
729 that will give additional information to all connected filters;
730 in both cases, progress was made and a new round must be done */
731 if (count_queried || count_merged)
732 return AVERROR(EAGAIN);
734 for (i = 0; i < graph->nb_filters; i++)
735 if (!formats_declared(graph->filters[i]))
736 av_bprintf(&bp, "%s%s", bp.len ? ", " : "",
737 graph->filters[i]->name);
738 av_log(graph, AV_LOG_ERROR,
739 "The following filters could not choose their formats: %s\n"
740 "Consider inserting the (a)format filter near their input or "
741 "output.\n", bp.str);
742 return AVERROR(EIO);
743 }
744 return 0;
745}
746
747static int get_fmt_score(enum AVSampleFormat dst_fmt, enum AVSampleFormat src_fmt)
748{
749 int score = 0;
750
751 if (av_sample_fmt_is_planar(dst_fmt) != av_sample_fmt_is_planar(src_fmt))
752 score ++;
753
754 if (av_get_bytes_per_sample(dst_fmt) < av_get_bytes_per_sample(src_fmt)) {
755 score += 100 * (av_get_bytes_per_sample(src_fmt) - av_get_bytes_per_sample(dst_fmt));
756 }else
757 score += 10 * (av_get_bytes_per_sample(dst_fmt) - av_get_bytes_per_sample(src_fmt));
758
761 score += 20;
762
765 score += 2;
766
767 return score;
768}
769
771 enum AVSampleFormat src_fmt)
772{
773 int score1, score2;
774
775 score1 = get_fmt_score(dst_fmt1, src_fmt);
776 score2 = get_fmt_score(dst_fmt2, src_fmt);
777
778 return score1 < score2 ? dst_fmt1 : dst_fmt2;
779}
780
782{
784 if (!desc)
785 return 0;
786 if (desc->nb_components < 3)
787 return 0; /* Grayscale is explicitly full-range in swscale */
789 return !(desc->flags & (AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_PAL |
791}
792
793
795{
796 switch (fmt) {
802 return 1;
803 default:
804 return 0;
805 }
806}
807
809{
810 if (!link || !link->incfg.formats)
811 return 0;
812
813 if (link->type == AVMEDIA_TYPE_VIDEO) {
814 if(ref && ref->type == AVMEDIA_TYPE_VIDEO){
815 //FIXME: This should check for AV_PIX_FMT_FLAG_ALPHA after PAL8 pixel format without alpha is implemented
816 int has_alpha= av_pix_fmt_desc_get(ref->format)->nb_components % 2 == 0;
818 int i;
819 for (i = 0; i < link->incfg.formats->nb_formats; i++) {
820 enum AVPixelFormat p = link->incfg.formats->formats[i];
821 best= av_find_best_pix_fmt_of_2(best, p, ref->format, has_alpha, NULL);
822 }
823 av_log(link->src,AV_LOG_DEBUG, "picking %s out of %d ref:%s alpha:%d\n",
825 av_get_pix_fmt_name(ref->format), has_alpha);
826 link->incfg.formats->formats[0] = best;
827 }
828 } else if (link->type == AVMEDIA_TYPE_AUDIO) {
829 if(ref && ref->type == AVMEDIA_TYPE_AUDIO){
831 int i;
832 for (i = 0; i < link->incfg.formats->nb_formats; i++) {
833 enum AVSampleFormat p = link->incfg.formats->formats[i];
834 best = find_best_sample_fmt_of_2(best, p, ref->format);
835 }
836 av_log(link->src,AV_LOG_DEBUG, "picking %s out of %d ref:%s\n",
838 av_get_sample_fmt_name(ref->format));
839 link->incfg.formats->formats[0] = best;
840 }
841 }
842
843 link->incfg.formats->nb_formats = 1;
844 link->format = link->incfg.formats->formats[0];
845
846 if (link->type == AVMEDIA_TYPE_VIDEO) {
847 enum AVPixelFormat swfmt = link->format;
849 // FIXME: this is a hack - we'd like to use the sw_format of
850 // link->hw_frames_ctx here, but it is not yet available.
851 // To make this work properly we will need to either reorder
852 // things so that it is available here or somehow negotiate
853 // sw_format separately.
854 swfmt = AV_PIX_FMT_YUV420P;
855 }
856
858 if (!ff_fmt_is_regular_yuv(swfmt)) {
859 /* These fields are explicitly documented as affecting YUV only,
860 * so set them to sane values for other formats. */
861 if (desc->flags & AV_PIX_FMT_FLAG_FLOAT)
863 else
867 } else {
869 }
870 } else {
871 if (!link->incfg.color_spaces->nb_formats) {
872 av_log(link->src, AV_LOG_ERROR, "Cannot select color space for"
873 " the link between filters %s and %s.\n", link->src->name,
874 link->dst->name);
875 return AVERROR(EINVAL);
876 }
877 link->incfg.color_spaces->nb_formats = 1;
878 link->colorspace = link->incfg.color_spaces->formats[0];
879
880 if (ff_fmt_is_forced_full_range(swfmt)) {
882 } else {
883 if (!link->incfg.color_ranges->nb_formats) {
884 av_log(link->src, AV_LOG_ERROR, "Cannot select color range for"
885 " the link between filters %s and %s.\n", link->src->name,
886 link->dst->name);
887 return AVERROR(EINVAL);
888 }
889 link->incfg.color_ranges->nb_formats = 1;
890 link->color_range = link->incfg.color_ranges->formats[0];
891 }
892 }
893
894 if (desc->flags & AV_PIX_FMT_FLAG_ALPHA) {
895 if (!link->incfg.alpha_modes->nb_formats) {
896 av_log(link->src, AV_LOG_ERROR, "Cannot select alpha mode for"
897 " the link between filters %s and %s.\n", link->src->name,
898 link->dst->name);
899 return AVERROR(EINVAL);
900 }
901 link->incfg.alpha_modes->nb_formats = 1;
902 link->alpha_mode = link->incfg.alpha_modes->formats[0];
903 } else {
905 }
906
907 if (desc->log2_chroma_w || desc->log2_chroma_h) {
908 if (!link->incfg.chroma_locations->nb_formats) {
909 av_log(link->src, AV_LOG_ERROR, "Cannot select chroma location"
910 " for the link between filters %s and %s.\n", link->src->name,
911 link->dst->name);
912 return AVERROR(EINVAL);
913 }
916 } else {
917 /* Chroma location is meaningless without subsampled chroma. */
919 }
920 } else if (link->type == AVMEDIA_TYPE_AUDIO) {
921 int ret;
922
923 if (!link->incfg.samplerates->nb_formats) {
924 av_log(link->src, AV_LOG_ERROR, "Cannot select sample rate for"
925 " the link between filters %s and %s.\n", link->src->name,
926 link->dst->name);
927 return AVERROR(EINVAL);
928 }
929 link->incfg.samplerates->nb_formats = 1;
930 link->sample_rate = link->incfg.samplerates->formats[0];
931
932 if (link->incfg.channel_layouts->all_layouts) {
933 av_log(link->src, AV_LOG_ERROR, "Cannot select channel layout for"
934 " the link between filters %s and %s.\n", link->src->name,
935 link->dst->name);
936 if (!link->incfg.channel_layouts->all_counts)
937 av_log(link->src, AV_LOG_ERROR, "Unknown channel layouts not "
938 "supported, try specifying a channel layout using "
939 "'aformat=channel_layouts=something'.\n");
940 return AVERROR(EINVAL);
941 }
944 if (ret < 0)
945 return ret;
946 }
947
962
963 return 0;
964}
965
966#define REDUCE_FORMATS(fmt_type, list_type, list, var, nb, add_format) \
967do { \
968 for (i = 0; i < filter->nb_inputs; i++) { \
969 AVFilterLink *link = filter->inputs[i]; \
970 fmt_type fmt; \
971 \
972 if (!link->outcfg.list || link->outcfg.list->nb != 1) \
973 continue; \
974 fmt = link->outcfg.list->var[0]; \
975 \
976 for (j = 0; j < filter->nb_outputs; j++) { \
977 AVFilterLink *out_link = filter->outputs[j]; \
978 list_type *fmts; \
979 \
980 if (link->type != out_link->type || \
981 out_link->incfg.list->nb == 1) \
982 continue; \
983 fmts = out_link->incfg.list; \
984 \
985 if (!out_link->incfg.list->nb) { \
986 if ((ret = add_format(&out_link->incfg.list, fmt)) < 0)\
987 return ret; \
988 ret = 1; \
989 break; \
990 } \
991 \
992 for (k = 0; k < out_link->incfg.list->nb; k++) \
993 if (fmts->var[k] == fmt) { \
994 fmts->var[0] = fmt; \
995 fmts->nb = 1; \
996 ret = 1; \
997 break; \
998 } \
999 } \
1000 } \
1001} while (0)
1002
1004{
1005 int i, j, k, ret = 0;
1006
1008 nb_formats, ff_add_format);
1009 REDUCE_FORMATS(int, AVFilterFormats, samplerates, formats,
1010 nb_formats, ff_add_format);
1011 REDUCE_FORMATS(int, AVFilterFormats, color_spaces, formats,
1012 nb_formats, ff_add_format);
1013 REDUCE_FORMATS(int, AVFilterFormats, color_ranges, formats,
1014 nb_formats, ff_add_format);
1015 REDUCE_FORMATS(int, AVFilterFormats, alpha_modes, formats,
1016 nb_formats, ff_add_format);
1017 REDUCE_FORMATS(int, AVFilterFormats, chroma_locations, formats,
1018 nb_formats, ff_add_format);
1019
1020 /* reduce channel layouts */
1021 for (i = 0; i < filter->nb_inputs; i++) {
1022 AVFilterLink *inlink = filter->inputs[i];
1023 const AVChannelLayout *fmt;
1024
1025 if (!inlink->outcfg.channel_layouts ||
1027 continue;
1028 fmt = &inlink->outcfg.channel_layouts->channel_layouts[0];
1029
1030 for (j = 0; j < filter->nb_outputs; j++) {
1031 AVFilterLink *outlink = filter->outputs[j];
1033
1034 fmts = outlink->incfg.channel_layouts;
1035 if (inlink->type != outlink->type || fmts->nb_channel_layouts == 1)
1036 continue;
1037
1038 if (fmts->all_layouts &&
1039 (KNOWN(fmt) || fmts->all_counts)) {
1040 /* Turn the infinite list into a singleton */
1041 fmts->all_layouts = fmts->all_counts = 0;
1042 ret = ff_add_channel_layout(&outlink->incfg.channel_layouts, fmt);
1043 if (ret < 0)
1044 return ret;
1045 ret = 1;
1046 break;
1047 }
1048
1049 for (k = 0; k < outlink->incfg.channel_layouts->nb_channel_layouts; k++) {
1050 if (!av_channel_layout_compare(&fmts->channel_layouts[k], fmt)) {
1051 ret = av_channel_layout_copy(&fmts->channel_layouts[0], fmt);
1052 if (ret < 0)
1053 return ret;
1054 fmts->nb_channel_layouts = 1;
1055 ret = 1;
1056 break;
1057 }
1058 }
1059 }
1060 }
1061
1062 return ret;
1063}
1064
1066{
1067 int i, reduced, ret;
1068
1069 do {
1070 reduced = 0;
1071
1072 for (i = 0; i < graph->nb_filters; i++) {
1073 if ((ret = reduce_formats_on_filter(graph->filters[i])) < 0)
1074 return ret;
1075 reduced |= ret;
1076 }
1077 } while (reduced);
1078
1079 return 0;
1080}
1081
1083{
1084 AVFilterLink *link = NULL;
1085 int sample_rate;
1086 int i, j;
1087
1088 for (i = 0; i < filter->nb_inputs; i++) {
1089 link = filter->inputs[i];
1090
1091 if (link->type == AVMEDIA_TYPE_AUDIO &&
1092 link->outcfg.samplerates->nb_formats== 1)
1093 break;
1094 }
1095 if (i == filter->nb_inputs)
1096 return;
1097
1098 sample_rate = link->outcfg.samplerates->formats[0];
1099
1100 for (i = 0; i < filter->nb_outputs; i++) {
1101 AVFilterLink *outlink = filter->outputs[i];
1102 int best_idx, best_diff = INT_MAX;
1103
1104 if (outlink->type != AVMEDIA_TYPE_AUDIO ||
1105 outlink->incfg.samplerates->nb_formats < 2)
1106 continue;
1107
1108 for (j = 0; j < outlink->incfg.samplerates->nb_formats; j++) {
1109 int diff = abs(sample_rate - outlink->incfg.samplerates->formats[j]);
1110
1111 av_assert0(diff < INT_MAX); // This would lead to the use of uninitialized best_diff but is only possible with invalid sample rates
1112
1113 if (diff < best_diff) {
1114 best_diff = diff;
1115 best_idx = j;
1116 }
1117 }
1118 FFSWAP(int, outlink->incfg.samplerates->formats[0],
1119 outlink->incfg.samplerates->formats[best_idx]);
1120 }
1121}
1122
1124{
1125 int i;
1126
1127 for (i = 0; i < graph->nb_filters; i++)
1129}
1130
1131#define CH_CENTER_PAIR (AV_CH_FRONT_LEFT_OF_CENTER | AV_CH_FRONT_RIGHT_OF_CENTER)
1132#define CH_FRONT_PAIR (AV_CH_FRONT_LEFT | AV_CH_FRONT_RIGHT)
1133#define CH_STEREO_PAIR (AV_CH_STEREO_LEFT | AV_CH_STEREO_RIGHT)
1134#define CH_WIDE_PAIR (AV_CH_WIDE_LEFT | AV_CH_WIDE_RIGHT)
1135#define CH_SIDE_PAIR (AV_CH_SIDE_LEFT | AV_CH_SIDE_RIGHT)
1136#define CH_DIRECT_PAIR (AV_CH_SURROUND_DIRECT_LEFT | AV_CH_SURROUND_DIRECT_RIGHT)
1137#define CH_BACK_PAIR (AV_CH_BACK_LEFT | AV_CH_BACK_RIGHT)
1138
1139/* allowable substitutions for channel pairs when comparing layouts,
1140 * ordered by priority for both values */
1164
1166{
1167 AVFilterLink *link = NULL;
1168 int i, j, k;
1169
1170 for (i = 0; i < filter->nb_inputs; i++) {
1171 link = filter->inputs[i];
1172
1173 if (link->type == AVMEDIA_TYPE_AUDIO &&
1175 break;
1176 }
1177 if (i == filter->nb_inputs)
1178 return;
1179
1180 for (i = 0; i < filter->nb_outputs; i++) {
1181 AVFilterLink *outlink = filter->outputs[i];
1182 int best_idx = -1, best_score = INT_MIN, best_count_diff = INT_MAX;
1183
1184 if (outlink->type != AVMEDIA_TYPE_AUDIO ||
1186 continue;
1187
1188 for (j = 0; j < outlink->incfg.channel_layouts->nb_channel_layouts; j++) {
1189 AVChannelLayout in_chlayout = { 0 }, out_chlayout = { 0 };
1190 int in_channels;
1191 int out_channels;
1192 int count_diff;
1193 int matched_channels, extra_channels;
1194 int score = 100000;
1195
1197 av_channel_layout_copy(&out_chlayout, &outlink->incfg.channel_layouts->channel_layouts[j]);
1198 in_channels = in_chlayout.nb_channels;
1199 out_channels = out_chlayout.nb_channels;
1200 count_diff = out_channels - in_channels;
1201 if (!KNOWN(&in_chlayout) || !KNOWN(&out_chlayout)) {
1202 /* Compute score in case the input or output layout encodes
1203 a channel count; in this case the score is not altered by
1204 the computation afterwards, as in_chlayout and
1205 out_chlayout have both been set to 0 */
1206 if (!KNOWN(&in_chlayout))
1207 in_channels = FF_LAYOUT2COUNT(&in_chlayout);
1208 if (!KNOWN(&out_chlayout))
1209 out_channels = FF_LAYOUT2COUNT(&out_chlayout);
1210 score -= 10000 + FFABS(out_channels - in_channels) +
1211 (in_channels > out_channels ? 10000 : 0);
1212 av_channel_layout_uninit(&in_chlayout);
1213 av_channel_layout_uninit(&out_chlayout);
1214 /* Let the remaining computation run, even if the score
1215 value is not altered */
1216 }
1217
1218 /* channel substitution */
1219 for (k = 0; k < FF_ARRAY_ELEMS(ch_subst); k++) {
1220 uint64_t cmp0 = ch_subst[k][0];
1221 uint64_t cmp1 = ch_subst[k][1];
1222 if ( av_channel_layout_subset(& in_chlayout, cmp0) &&
1223 !av_channel_layout_subset(&out_chlayout, cmp0) &&
1224 av_channel_layout_subset(&out_chlayout, cmp1) &&
1225 !av_channel_layout_subset(& in_chlayout, cmp1)) {
1226 av_channel_layout_from_mask(&in_chlayout, av_channel_layout_subset(& in_chlayout, ~cmp0));
1227 av_channel_layout_from_mask(&out_chlayout, av_channel_layout_subset(&out_chlayout, ~cmp1));
1228 /* add score for channel match, minus a deduction for
1229 having to do the substitution */
1230 score += 10 * av_popcount64(cmp1) - 2;
1231 }
1232 }
1233
1234 /* no penalty for LFE channel mismatch */
1237 score += 10;
1240
1241 matched_channels = av_popcount64(in_chlayout.u.mask & out_chlayout.u.mask);
1242 extra_channels = av_popcount64(out_chlayout.u.mask & (~in_chlayout.u.mask));
1243 score += 10 * matched_channels - 5 * extra_channels;
1244
1245 if (score > best_score ||
1246 (count_diff < best_count_diff && score == best_score)) {
1247 best_score = score;
1248 best_idx = j;
1249 best_count_diff = count_diff;
1250 }
1251 }
1252 av_assert0(best_idx >= 0);
1254 outlink->incfg.channel_layouts->channel_layouts[best_idx]);
1255 }
1256
1257}
1258
1260{
1261 int i;
1262
1263 for (i = 0; i < graph->nb_filters; i++)
1265}
1266
1268{
1269 AVFilterLink *link = NULL;
1270 int format, bps;
1271 int i, j;
1272
1273 for (i = 0; i < filter->nb_inputs; i++) {
1274 link = filter->inputs[i];
1275
1276 if (link->type == AVMEDIA_TYPE_AUDIO &&
1277 link->outcfg.formats->nb_formats == 1)
1278 break;
1279 }
1280 if (i == filter->nb_inputs)
1281 return;
1282
1283 format = link->outcfg.formats->formats[0];
1285
1286 for (i = 0; i < filter->nb_outputs; i++) {
1287 AVFilterLink *outlink = filter->outputs[i];
1288 int best_idx = -1, best_score = INT_MIN;
1289
1290 if (outlink->type != AVMEDIA_TYPE_AUDIO ||
1291 outlink->incfg.formats->nb_formats < 2)
1292 continue;
1293
1294 for (j = 0; j < outlink->incfg.formats->nb_formats; j++) {
1295 int out_format = outlink->incfg.formats->formats[j];
1296 int out_bps = av_get_bytes_per_sample(out_format);
1297 int score;
1298
1299 if (av_get_packed_sample_fmt(out_format) == format ||
1300 av_get_planar_sample_fmt(out_format) == format) {
1301 best_idx = j;
1302 break;
1303 }
1304
1305 /* for s32 and float prefer double to prevent loss of information */
1306 if (bps == 4 && out_bps == 8) {
1307 best_idx = j;
1308 break;
1309 }
1310
1311 /* prefer closest higher or equal bps */
1312 score = -abs(out_bps - bps);
1313 if (out_bps >= bps)
1314 score += INT_MAX/2;
1315
1316 if (score > best_score) {
1317 best_score = score;
1318 best_idx = j;
1319 }
1320 }
1321 av_assert0(best_idx >= 0);
1322 FFSWAP(int, outlink->incfg.formats->formats[0],
1323 outlink->incfg.formats->formats[best_idx]);
1324 }
1325}
1326
1328{
1329 int i;
1330
1331 for (i = 0; i < graph->nb_filters; i++)
1333
1334}
1335
1336static int pick_formats(AVFilterGraph *graph)
1337{
1338 int i, j, ret;
1339 int change;
1340
1341 do{
1342 change = 0;
1343 for (i = 0; i < graph->nb_filters; i++) {
1344 AVFilterContext *filter = graph->filters[i];
1345 if (filter->nb_inputs){
1346 for (j = 0; j < filter->nb_inputs; j++){
1347 if (filter->inputs[j]->incfg.formats && filter->inputs[j]->incfg.formats->nb_formats == 1) {
1348 if ((ret = pick_format(filter->inputs[j], NULL)) < 0)
1349 return ret;
1350 change = 1;
1351 }
1352 }
1353 }
1354 if (filter->nb_outputs){
1355 for (j = 0; j < filter->nb_outputs; j++){
1356 if (filter->outputs[j]->incfg.formats && filter->outputs[j]->incfg.formats->nb_formats == 1) {
1357 if ((ret = pick_format(filter->outputs[j], NULL)) < 0)
1358 return ret;
1359 change = 1;
1360 }
1361 }
1362 }
1363 if (filter->nb_inputs && filter->nb_outputs && filter->inputs[0]->format>=0) {
1364 for (j = 0; j < filter->nb_outputs; j++) {
1365 if (filter->outputs[j]->format<0) {
1366 if ((ret = pick_format(filter->outputs[j], filter->inputs[0])) < 0)
1367 return ret;
1368 change = 1;
1369 }
1370 }
1371 }
1372 }
1373 }while(change);
1374
1375 for (i = 0; i < graph->nb_filters; i++) {
1376 AVFilterContext *filter = graph->filters[i];
1377
1378 for (j = 0; j < filter->nb_inputs; j++)
1379 if ((ret = pick_format(filter->inputs[j], NULL)) < 0)
1380 return ret;
1381 for (j = 0; j < filter->nb_outputs; j++)
1382 if ((ret = pick_format(filter->outputs[j], NULL)) < 0)
1383 return ret;
1384 }
1385 return 0;
1386}
1387
1388/**
1389 * Configure the formats of all the links in the graph.
1390 */
1391static int graph_config_formats(AVFilterGraph *graph, void *log_ctx)
1392{
1393 int ret;
1394
1395 /* find supported formats from sub-filters, and merge along links */
1396 while ((ret = query_formats(graph, log_ctx)) == AVERROR(EAGAIN))
1397 av_log(graph, AV_LOG_DEBUG, "query_formats not finished\n");
1398 if (ret < 0)
1399 return ret;
1400
1401 /* Once everything is merged, it's possible that we'll still have
1402 * multiple valid media format choices. We try to minimize the amount
1403 * of format conversion inside filters */
1404 if ((ret = reduce_formats(graph)) < 0)
1405 return ret;
1406
1407 /* for audio filters, ensure the best format, sample rate and channel layout
1408 * is selected */
1409 swap_sample_fmts(graph);
1410 swap_samplerates(graph);
1411 swap_channel_layouts(graph);
1412
1413 if ((ret = pick_formats(graph)) < 0)
1414 return ret;
1415
1416 return 0;
1417}
1418
1419static int graph_config_pointers(AVFilterGraph *graph, void *log_ctx)
1420{
1421 unsigned i, j;
1422 int sink_links_count = 0, n = 0;
1424 FilterLinkInternal **sinks;
1425
1426 for (i = 0; i < graph->nb_filters; i++) {
1427 f = graph->filters[i];
1428 for (j = 0; j < f->nb_inputs; j++) {
1429 ff_link_internal(f->inputs[j])->age_index = -1;
1430 }
1431 for (j = 0; j < f->nb_outputs; j++) {
1432 ff_link_internal(f->outputs[j])->age_index = -1;
1433 }
1434 if (!f->nb_outputs) {
1435 if (f->nb_inputs > INT_MAX - sink_links_count)
1436 return AVERROR(EINVAL);
1437 sink_links_count += f->nb_inputs;
1438 }
1439 }
1440 sinks = av_calloc(sink_links_count, sizeof(*sinks));
1441 if (!sinks)
1442 return AVERROR(ENOMEM);
1443 for (i = 0; i < graph->nb_filters; i++) {
1444 f = graph->filters[i];
1445 if (!f->nb_outputs) {
1446 for (j = 0; j < f->nb_inputs; j++) {
1447 sinks[n] = ff_link_internal(f->inputs[j]);
1448 sinks[n]->age_index = n;
1449 n++;
1450 }
1451 }
1452 }
1453 av_assert0(n == sink_links_count);
1454 fffiltergraph(graph)->sink_links = sinks;
1455 fffiltergraph(graph)->sink_links_count = sink_links_count;
1456 return 0;
1457}
1458
1459int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx)
1460{
1461 int ret;
1462
1463 if (graphctx->max_buffered_frames)
1465 if ((ret = graph_check_validity(graphctx, log_ctx)))
1466 return ret;
1467 if ((ret = graph_config_formats(graphctx, log_ctx)))
1468 return ret;
1469 if ((ret = graph_config_links(graphctx, log_ctx)))
1470 return ret;
1471 if ((ret = graph_check_links(graphctx, log_ctx)))
1472 return ret;
1473 if ((ret = graph_config_pointers(graphctx, log_ctx)))
1474 return ret;
1475
1476 return 0;
1477}
1478
1479int avfilter_graph_send_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, char *res, int res_len, int flags)
1480{
1481 int i, r = AVERROR(ENOSYS);
1482
1483 if (!graph)
1484 return r;
1485
1487 r = avfilter_graph_send_command(graph, target, cmd, arg, res, res_len, flags | AVFILTER_CMD_FLAG_FAST);
1488 if (r != AVERROR(ENOSYS))
1489 return r;
1490 }
1491
1492 if (res_len && res)
1493 res[0] = 0;
1494
1495 for (i = 0; i < graph->nb_filters; i++) {
1496 AVFilterContext *filter = graph->filters[i];
1497 if (!strcmp(target, "all") || (filter->name && !strcmp(target, filter->name)) || !strcmp(target, filter->filter->name)) {
1498 r = avfilter_process_command(filter, cmd, arg, res, res_len, flags);
1499 if (r != AVERROR(ENOSYS)) {
1500 if ((flags & AVFILTER_CMD_FLAG_ONE) || r < 0)
1501 return r;
1502 }
1503 }
1504 }
1505
1506 return r;
1507}
1508
1509int avfilter_graph_queue_command(AVFilterGraph *graph, const char *target, const char *command, const char *arg, int flags, double ts)
1510{
1511 int i;
1512
1513 if(!graph)
1514 return 0;
1515
1516 for (i = 0; i < graph->nb_filters; i++) {
1517 AVFilterContext *filter = graph->filters[i];
1519 if(filter && (!strcmp(target, "all") || !strcmp(target, filter->name) || !strcmp(target, filter->filter->name))){
1520 AVFilterCommand **queue = &ctxi->command_queue, *next;
1521 while (*queue && (*queue)->time <= ts)
1522 queue = &(*queue)->next;
1523 next = *queue;
1524 *queue = av_mallocz(sizeof(AVFilterCommand));
1525 if (!*queue)
1526 return AVERROR(ENOMEM);
1527
1528 (*queue)->command = av_strdup(command);
1529 (*queue)->arg = av_strdup(arg);
1530 (*queue)->time = ts;
1531 (*queue)->flags = flags;
1532 (*queue)->next = next;
1534 return 0;
1535 }
1536 }
1537
1538 return 0;
1539}
1540
1542 FilterLinkInternal *li, int index)
1543{
1544 FilterLinkInternal **links = graph->sink_links;
1545
1546 av_assert0(index >= 0);
1547
1548 while (index) {
1549 int parent = (index - 1) >> 1;
1550 if (links[parent]->l.current_pts_us >= li->l.current_pts_us)
1551 break;
1552 links[index] = links[parent];
1553 links[index]->age_index = index;
1554 index = parent;
1555 }
1556 links[index] = li;
1557 li->age_index = index;
1558}
1559
1561 FilterLinkInternal *li, int index)
1562{
1563 FilterLinkInternal **links = graph->sink_links;
1564
1565 av_assert0(index >= 0);
1566
1567 while (1) {
1568 int child = 2 * index + 1;
1569 if (child >= graph->sink_links_count)
1570 break;
1571 if (child + 1 < graph->sink_links_count &&
1572 links[child + 1]->l.current_pts_us < links[child]->l.current_pts_us)
1573 child++;
1574 if (li->l.current_pts_us < links[child]->l.current_pts_us)
1575 break;
1576 links[index] = links[child];
1577 links[index]->age_index = index;
1578 index = child;
1579 }
1580 links[index] = li;
1581 li->age_index = index;
1582}
1583
1585{
1586 FFFilterGraph *graphi = fffiltergraph(graph);
1587
1588 heap_bubble_up (graphi, li, li->age_index);
1589 heap_bubble_down(graphi, li, li->age_index);
1590}
1591
1593{
1594 FFFilterGraph *graphi = fffiltergraph(graph);
1595 FilterLinkInternal *oldesti = graphi->sink_links[0];
1596 AVFilterLink *oldest = &oldesti->l.pub;
1597 int64_t frame_count;
1598 int r;
1599
1600 while (graphi->sink_links_count) {
1601 oldesti = graphi->sink_links[0];
1602 oldest = &oldesti->l.pub;
1603 if (fffilter(oldest->dst->filter)->activate) {
1606 if (r != AVERROR_EOF)
1607 return r;
1608 } else {
1609 r = ff_request_frame(oldest);
1610 }
1611 if (r != AVERROR_EOF)
1612 break;
1613 av_log(oldest->dst, AV_LOG_DEBUG, "EOF on sink link %s:%s.\n",
1614 oldest->dst->name,
1615 oldest->dstpad->name);
1616 /* EOF: remove the link from the heap */
1617 if (oldesti->age_index < --graphi->sink_links_count)
1618 heap_bubble_down(graphi, graphi->sink_links[graphi->sink_links_count],
1619 oldesti->age_index);
1620 oldesti->age_index = -1;
1621 }
1622 if (!graphi->sink_links_count)
1623 return AVERROR_EOF;
1624 av_assert1(!fffilter(oldest->dst->filter)->activate);
1625 av_assert1(oldesti->age_index >= 0);
1626 frame_count = oldesti->l.frame_count_out;
1627 while (frame_count == oldesti->l.frame_count_out) {
1628 r = ff_filter_graph_run_once(graph);
1630 r = 0;
1631 if (r == AVERROR(EAGAIN) &&
1632 !oldesti->frame_wanted_out && !oldesti->frame_blocked_in &&
1633 !oldesti->status_in)
1634 (void)ff_request_frame(oldest);
1635 else if (r < 0)
1636 return r;
1637 }
1638 return 0;
1639}
1640
1642{
1643 FFFilterContext *ctxi;
1644 unsigned i;
1645
1646 av_assert0(graph->nb_filters);
1647 ctxi = fffilterctx(graph->filters[0]);
1648 for (i = 1; i < graph->nb_filters; i++) {
1649 FFFilterContext *ctxi_other = fffilterctx(graph->filters[i]);
1650
1651 if (ctxi_other->ready > ctxi->ready)
1652 ctxi = ctxi_other;
1653 }
1654
1655 if (!ctxi->ready)
1656 return AVERROR(EAGAIN);
1657 return ff_filter_activate(&ctxi->p);
1658}
static const char *const format[]
Definition af_aiir.c:445
#define filters(fmt, type, inverse, clp, inverset, clip, one, clip_fn, packed)
static const int8_t filt[NUMTAPS *2]
Definition af_earwax.c:40
static FILE * out
static AVFormatContext * ctx
#define A(x)
Definition vpx_arith.h:28
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition avassert.h:58
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
#define V
Definition avdct.c:32
AVFilterContext * ff_filter_alloc(const AVFilter *filter, const char *inst_name)
Allocate a new filter context and return it.
Definition avfilter.c:704
int ff_filter_config_links(AVFilterContext *filter)
Negotiate the media format, dimensions, etc of all inputs to a filter.
Definition avfilter.c:331
int ff_request_frame(AVFilterLink *link)
Request an input frame from the filter at the other end of the link.
Definition avfilter.c:486
int ff_filter_activate(AVFilterContext *filter)
Definition avfilter.c:1456
Main libavfilter public API header.
static FFFilterContext * fffilterctx(AVFilterContext *ctx)
static FFFilterGraph * fffiltergraph(AVFilterGraph *graph)
#define REDUCE_FORMATS(fmt_type, list_type, list, var, nb, add_format)
#define CH_SIDE_PAIR
static int graph_check_validity(AVFilterGraph *graph, void *log_ctx)
Check for the validity of graph.
static void heap_bubble_down(FFFilterGraph *graph, FilterLinkInternal *li, int index)
void ff_filter_graph_remove_filter(AVFilterGraph *graph, AVFilterContext *filter)
Remove a filter from a graph;.
static int reduce_formats_on_filter(AVFilterContext *filter)
int ff_filter_graph_run_once(AVFilterGraph *graph)
Run one round of processing on a filter graph.
static void print_link_formats(void *log_ctx, int level, const AVFilterLink *l, const AVFilterFormatsMerger *mergers[], int nb_mergers)
static const uint64_t ch_subst[][2]
static void swap_channel_layouts_on_filter(AVFilterContext *filter)
static int graph_check_links(AVFilterGraph *graph, void *log_ctx)
static void swap_sample_fmts(AVFilterGraph *graph)
static void heap_bubble_up(FFFilterGraph *graph, FilterLinkInternal *li, int index)
void ff_avfilter_graph_update_heap(AVFilterGraph *graph, FilterLinkInternal *li)
Update the position of a link in the age heap.
static int query_formats(AVFilterGraph *graph, void *log_ctx)
Perform one round of query_formats() and merging formats lists on the filter graph.
static int formats_declared(AVFilterContext *f)
static int graph_config_pointers(AVFilterGraph *graph, void *log_ctx)
static void swap_samplerates_on_filter(AVFilterContext *filter)
void ff_graph_thread_free(FFFilterGraph *graph)
static void swap_channel_layouts(AVFilterGraph *graph)
#define CH_DIRECT_PAIR
static int filter_check_formats(AVFilterContext *ctx)
Check the validity of the formats / etc.
#define CH_WIDE_PAIR
#define MERGE(merger, link)
static void print_filter_formats(void *log_ctx, int level, const AVFilterContext *f)
static int graph_config_links(AVFilterGraph *graph, void *log_ctx)
Configure all the links of graphctx.
static enum AVSampleFormat find_best_sample_fmt_of_2(enum AVSampleFormat dst_fmt1, enum AVSampleFormat dst_fmt2, enum AVSampleFormat src_fmt)
int ff_graph_thread_init(FFFilterGraph *graph)
#define CH_CENTER_PAIR
static int reduce_formats(AVFilterGraph *graph)
int ff_fmt_is_forced_full_range(enum AVPixelFormat fmt)
Returns true if a YUV pixel format is forced full range (i.e.
static int graph_config_formats(AVFilterGraph *graph, void *log_ctx)
Configure the formats of all the links in the graph.
static int filter_link_check_formats(void *log, AVFilterLink *link, AVFilterFormatsConfig *cfg)
static int pick_formats(AVFilterGraph *graph)
#define OFFSET(x)
static int filter_query_formats(AVFilterContext *ctx)
#define CH_FRONT_PAIR
#define CH_BACK_PAIR
static void swap_sample_fmts_on_filter(AVFilterContext *filter)
static int pick_format(AVFilterLink *link, AVFilterLink *ref)
int ff_fmt_is_regular_yuv(enum AVPixelFormat fmt)
Returns true if a pixel format is "regular YUV", which includes all pixel formats that are affected b...
static int get_fmt_score(enum AVSampleFormat dst_fmt, enum AVSampleFormat src_fmt)
static void swap_samplerates(AVFilterGraph *graph)
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition bprint.c:121
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition bprint.c:68
AVBPrint public header.
#define AV_BPRINT_SIZE_UNLIMITED
#define AV_BPRINT_SIZE_AUTOMATIC
static BitStreamFilterLinkInternal * ff_link_internal(AVBitStreamFilterLink *link)
static const AVClass filtergraph_class
Definition bsfgraph.c:40
static const AVOption filtergraph_options[]
Definition bsfgraph.c:34
memory buffer sink API for audio and video
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define f(width, name)
Definition cbs_vp8.c:236
#define s(width, name)
Definition cbs_vp9.c:198
Public libavutil channel layout APIs header.
#define av_popcount64
Definition common.h:157
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition common.h:74
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
#define abs(x)
#define F(x)
static CheckasmConfig cfg
Definition checkasm.c:74
const AVFilterNegotiation * ff_filter_get_negotiation(const AVFilterLink *link)
Definition formats.c:471
int ff_formats_check_sample_rates(void *log, const AVFilterFormats *fmts)
Check that fmts is a valid sample rates list.
Definition formats.c:1330
int ff_default_query_formats(AVFilterContext *ctx)
Sets all remaining unset filter lists for all inputs/outputs to their corresponding ff_all_*() lists.
Definition formats.c:1233
int ff_formats_check_chroma_locations(void *log, const AVFilterFormats *fmts)
Check that fmts is a valid formats list for chroma locations.
Definition formats.c:1358
int ff_add_format(AVFilterFormats **avff, int64_t fmt)
Add fmt to the list of media formats contained in *avff.
Definition formats.c:580
void ff_channel_layouts_unref(AVFilterChannelLayouts **ref)
Remove a reference to a channel layouts list.
Definition formats.c:827
int ff_formats_check_pixel_formats(void *log, const AVFilterFormats *fmts)
Check that fmts is a valid pixel formats list.
Definition formats.c:1320
int ff_add_channel_layout(AVFilterChannelLayouts **l, const AVChannelLayout *channel_layout)
Definition formats.c:597
int ff_formats_check_sample_formats(void *log, const AVFilterFormats *fmts)
Check that fmts is a valid sample formats list.
Definition formats.c:1325
int ff_formats_check_color_spaces(void *log, const AVFilterFormats *fmts)
Check that fmts is a valid formats list for YUV colorspace metadata.
Definition formats.c:1337
void ff_formats_unref(AVFilterFormats **ref)
If *ref is non-NULL, remove *ref as a reference to the format list it currently points to,...
Definition formats.c:815
int ff_formats_check_color_ranges(void *log, const AVFilterFormats *fmts)
Definition formats.c:1348
int ff_formats_check_channel_layouts(void *log, const AVFilterChannelLayouts *fmts)
Check that fmts is a valid channel layouts list.
Definition formats.c:1370
int ff_formats_check_alpha_modes(void *log, const AVFilterFormats *fmts)
Check that fmts is a valid formats list for alpha modes.
Definition formats.c:1353
#define FF_LAYOUT2COUNT(l)
Decode a channel count encoded as a channel layout.
Definition formats.h:108
#define KNOWN(l)
Definition formats.h:111
void ff_framequeue_global_init(FFFrameQueueGlobal *fqg)
Init a global structure.
Definition framequeue.c:31
#define fail
Definition test.h:479
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition opt.h:298
@ AV_OPT_TYPE_FLAGS
Underlying C type is unsigned int.
Definition opt.h:254
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
Definition opt.h:275
@ AV_OPT_TYPE_UINT
Underlying C type is unsigned int.
Definition opt.h:334
#define AV_CH_BACK_CENTER
#define AV_CH_FRONT_CENTER
#define AV_CH_LOW_FREQUENCY
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:138
#define AV_BUFFERSINK_FLAG_PEEK
Tell av_buffersink_get_buffer_ref() to read video/samples buffer reference, but not remove it from th...
Definition buffersink.h:86
int avfilter_init_str(AVFilterContext *filter, const char *args)
Initialize a filter with the supplied parameters.
Definition avfilter.c:965
int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt, unsigned filt_srcpad_idx, unsigned filt_dstpad_idx)
Insert a filter in the middle of an existing link.
Definition avfilter.c:282
void avfilter_free(AVFilterContext *filter)
Free a filter context.
Definition avfilter.c:805
int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx)
Check validity and configure all the links and formats in the graph.
const AVFilter * avfilter_get_by_name(const char *name)
Get a filter definition matching the given name.
Definition allfilters.c:656
int avfilter_graph_queue_command(AVFilterGraph *graph, const char *target, const char *command, const char *arg, int flags, double ts)
Queue a command for one or more filter instances.
AVFilterContext * avfilter_graph_get_filter(AVFilterGraph *graph, const char *name)
Get a filter instance identified by instance name from graph.
AVFilterContext * avfilter_graph_alloc_filter(AVFilterGraph *graph, const AVFilter *filter, const char *name)
Create a new filter instance in a filter graph.
int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags)
Make the filter instance process a command.
Definition avfilter.c:613
void avfilter_graph_free(AVFilterGraph **graphp)
Free a graph, destroy its links, and set *graph to NULL.
#define AVFILTER_THREAD_SLICE
Process multiple parts of the frame concurrently.
Definition avfilter.h:276
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.
int avfilter_graph_request_oldest(AVFilterGraph *graph)
Request a frame on the oldest sink link.
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.
#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:452
#define AVFILTER_CMD_FLAG_FAST
Only execute command when its fast (like a video out that supports contrast adjustment in hw)
Definition avfilter.h:453
void avfilter_graph_set_auto_convert(AVFilterGraph *graph, unsigned flags)
Enable or disable automatic format conversion inside the graph.
AVFilterGraph * avfilter_graph_alloc(void)
Allocate a filter graph.
int av_channel_layout_index_from_channel(const AVChannelLayout *channel_layout, enum AVChannel channel)
Get the index of a given channel in a channel layout.
int av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1)
Check whether two channel layouts are semantically the same, i.e.
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
int av_channel_layout_from_mask(AVChannelLayout *channel_layout, uint64_t mask)
Initialize a native channel layout from a bitmask indicating which channels are present.
int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src)
Make a copy of a channel layout.
uint64_t av_channel_layout_subset(const AVChannelLayout *channel_layout, uint64_t mask)
Find out what channels from a given set are present in a channel layout, without regard for their pos...
@ AV_CHAN_LOW_FREQUENCY
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
Definition bprint.h:218
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition bprint.c:234
void av_bprint_clear(AVBPrint *buf)
Reset the string to "" but keep internal allocated data.
Definition bprint.c:226
#define AVERROR_EOF
End of file.
Definition error.h:57
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition error.h:122
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
int av_log_get_level(void)
Get the current log level.
Definition log.c:471
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition mem.c:318
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
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of a plane of an image with...
Definition imgutils.c:289
int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt)
Check if the sample format is planar.
Definition samplefmt.c:115
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
Definition samplefmt.c:109
enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt)
Get the packed alternative form of the given sample format.
Definition samplefmt.c:78
enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt)
Get the planar alternative form of the given sample format.
Definition samplefmt.c:87
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:52
AVSampleFormat
Audio sample formats.
Definition samplefmt.h:55
@ AV_SAMPLE_FMT_FLT
float
Definition samplefmt.h:60
@ AV_SAMPLE_FMT_S32
signed 32 bits
Definition samplefmt.h:59
@ AV_SAMPLE_FMT_NONE
Definition samplefmt.h:56
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
void av_opt_free(void *obj)
Free all allocated objects in obj.
Definition opt.c:2029
void av_opt_set_defaults(void *s)
Set the values of all AVOption fields to their default values.
Definition opt.c:1758
int index
Definition gxfenc.c:90
int a
misc image utilities
#define r
Definition input.c:42
#define b
Definition input.c:43
const char * arg
Definition jacosubdec.c:65
#define FFERROR_BUFFERSRC_EMPTY
Definition filters.h:35
static FilterLink * ff_filter_link(AVFilterLink *link)
Definition filters.h:199
@ FF_FILTER_FORMATS_QUERY_FUNC
formats.query active.
Definition filters.h:230
@ FF_FILTER_FORMATS_QUERY_FUNC2
formats.query_func2 active.
Definition filters.h:231
static const FFFilter * fffilter(const AVFilter *f)
Definition filters.h:464
#define FF_FIELD_AT(type, off, obj)
Access a field in a structure by its offset.
Definition internal.h:88
const char * desc
Definition libsvtav1.c:83
@ AV_CLASS_CATEGORY_FILTER
Definition log.h:36
#define FFSWAP(type, a, b)
Definition macros.h:52
void * av_calloc(size_t nmemb, size_t size)
Definition mem.c:370
Memory handling functions.
unsigned bps
Definition movenc.c:2129
#define av_strdup(s)
Definition ops_static.c:55
AVOptions.
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:3380
enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
Compute what kind of losses will occur when converting from one specific pixel format to another.
Definition pixdesc.c:3739
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
Definition pixdesc.h:147
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
Definition pixdesc.h:136
#define AV_PIX_FMT_FLAG_FLOAT
The pixel format contains IEEE-754 floating point values.
Definition pixdesc.h:158
#define AV_PIX_FMT_FLAG_HWACCEL
Pixel format is an HW accelerated format.
Definition pixdesc.h:128
#define AV_PIX_FMT_FLAG_XYZ
The pixel format contains XYZ-like data (as opposed to YUV/RGB/grayscale).
Definition pixdesc.h:163
#define AV_PIX_FMT_FLAG_PAL
Pixel format has a palette in data[1], values are indexes in this palette.
Definition pixdesc.h:120
@ AVCHROMA_LOC_UNSPECIFIED
Definition pixfmt.h:803
@ AVCOL_RANGE_UNSPECIFIED
Definition pixfmt.h:749
@ AVCOL_RANGE_JPEG
Full range content.
Definition pixfmt.h:783
@ AVALPHA_MODE_UNSPECIFIED
Unknown alpha handling, or no alpha channel.
Definition pixfmt.h:817
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_YUVJ440P
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
Definition pixfmt.h:107
@ AV_PIX_FMT_YUVJ411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor ...
Definition pixfmt.h:283
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
Definition pixfmt.h:86
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
Definition pixfmt.h:87
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
Definition pixfmt.h:85
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
Definition pixfmt.h:707
@ AVCOL_SPC_UNSPECIFIED
Definition pixfmt.h:709
const char * name
Definition qsvenc.c:142
formats
Definition signature.h:47
#define FF_ARRAY_ELEMS(a)
An AVChannelLayout holds information about the channel layout of audio data.
uint64_t mask
This member must be used for AV_CHANNEL_ORDER_NATIVE, and may be used for AV_CHANNEL_ORDER_AMBISONIC ...
union AVChannelLayout::@162063043056170047076125117143030261346263330336 u
Details about which channels are present in this layout.
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
Definition log.h:76
A list of supported channel layouts.
Definition formats.h:85
char all_layouts
accept any known channel layout
Definition formats.h:88
char all_counts
accept any channel layout or count
Definition formats.h:89
AVChannelLayout * channel_layouts
list of channel layouts
Definition formats.h:86
int nb_channel_layouts
number of channel layouts
Definition formats.h:87
unsigned refcount
number of references to this list
Definition formats.h:91
struct AVFilterCommand * next
double time
time expressed in seconds
An instance of a filter.
Definition avfilter.h:279
char * name
name of this filter instance
Definition avfilter.h:284
AVFilterLink ** inputs
array of pointers to input links
Definition avfilter.h:287
const AVFilter * filter
the AVFilter of which this is an instance
Definition avfilter.h:282
AVFilterLink ** outputs
array of pointers to output links
Definition avfilter.h:291
Lists of formats / etc.
Definition avfilter.h:120
AVFilterFormats * chroma_locations
List of supported chroma sample locations, only for video with subsampled chroma.
Definition avfilter.h:152
AVFilterFormats * color_spaces
Lists of supported YUV color metadata, only for YUV video.
Definition avfilter.h:140
AVFilterFormats * formats
List of supported formats (pixel or sample).
Definition avfilter.h:125
AVFilterChannelLayouts * channel_layouts
Lists of supported channel layouts, only for audio.
Definition avfilter.h:135
AVFilterFormats * alpha_modes
List of supported alpha modes, only for video with an alpha channel.
Definition avfilter.h:146
AVFilterFormats * color_ranges
AVColorRange.
Definition avfilter.h:141
AVFilterFormats * samplerates
Lists of supported sample rates, only for audio.
Definition avfilter.h:130
unsigned conversion_opts_offset
Definition formats.h:616
int(* merge)(void *a, void *b)
Definition formats.h:612
const char * name
Definition formats.h:610
int(* can_merge)(const void *a, const void *b)
Definition formats.h:613
void(* print_list)(struct AVBPrint *bp, const void *fmts)
Definition formats.h:614
const char * conversion_filter
Definition formats.h:615
A list of supported formats for one end of a filter link.
Definition formats.h:64
int * formats
list of media formats
Definition formats.h:66
unsigned refcount
number of references to this list
Definition formats.h:68
unsigned nb_formats
number of formats
Definition formats.h:65
unsigned nb_filters
Definition avfilter.h:575
AVFilterContext ** filters
Definition avfilter.h:574
unsigned max_buffered_frames
Sets the maximum number of buffered frames in the filtergraph combined.
Definition avfilter.h:629
int thread_type
Type of multithreading allowed for filters in this graph.
Definition avfilter.h:591
avfilter_execute_func * execute
This callback may be set by the caller immediately after allocating the graph and before adding any f...
Definition avfilter.h:619
int nb_threads
Maximum number of threads used by filters in this graph.
Definition avfilter.h:598
const AVClass * av_class
Definition avfilter.h:573
Callbacks and properties to describe the steps of a format negotiation.
Definition formats.h:704
unsigned nb_mergers
Definition formats.h:705
const AVFilterFormatsMerger * mergers
Definition formats.h:706
A filter pad used for either input or output.
Definition filters.h:40
enum AVMediaType type
AVFilterPad type.
Definition filters.h:51
const char * name
Pad name.
Definition filters.h:46
Filter definition.
Definition avfilter.h:221
AVOption.
Definition opt.h:428
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
uint8_t nb_components
The number of components each pixel has, (1-4)
Definition pixdesc.h:71
int age_index
Index in the age array.
struct AVFilterCommand * command_queue
AVFilterContext p
The public AVFilterContext.
unsigned ready
Ready status of the filter.
avfilter_execute_func * thread_execute
AVFilterGraph p
The public AVFilterGraph.
FFFrameQueueGlobal frame_queues
struct FilterLinkInternal ** sink_links
unsigned disable_auto_convert
int(* activate)(AVFilterContext *ctx)
Filter activation function.
Definition filters.h:461
size_t max_queued
Maximum number of allowed frames in the queues combined.
Definition framequeue.h:49
int frame_wanted_out
True if a frame is currently wanted on the output of this filter.
int age_index
Index in the age array.
int status_in
Link input status.
int frame_blocked_in
If set, the source filter can not generate a frame as is.
uint8_t level
Definition svq3.c:208
#define av_malloc_array(a, b)
#define av_mallocz(s)
#define av_freep(p)
#define av_log(a,...)
void(* filter)(uint8_t *src, ptrdiff_t stride, int qscale)
Definition h263dsp.c:29
static int ref[MAX_W *MAX_W]
static int command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)