FFmpeg
Loading...
Searching...
No Matches
avfilter.c
Go to the documentation of this file.
1/*
2 * filter layer
3 * Copyright (c) 2007 Bobby Bingham
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include "libavutil/avassert.h"
23#include "libavutil/avstring.h"
24#include "libavutil/bprint.h"
25#include "libavutil/buffer.h"
27#include "libavutil/common.h"
28#include "libavutil/eval.h"
29#include "libavutil/frame.h"
30#include "libavutil/hwcontext.h"
31#include "libavutil/internal.h"
32#include "libavutil/mem.h"
33#include "libavutil/opt.h"
34#include "libavutil/pixdesc.h"
35#include "libavutil/rational.h"
36#include "libavutil/samplefmt.h"
37
38#include "audio.h"
39#include "avfilter.h"
40#include "avfilter_internal.h"
41#include "filters.h"
42#include "formats.h"
43#include "framequeue.h"
44#include "framepool.h"
45#include "video.h"
46
47static void tlog_ref(void *ctx, AVFrame *ref, int end)
48{
49#ifdef TRACE
51 "ref[%p buf:%p data:%p linesize[%d, %d, %d, %d] pts:%"PRId64,
52 ref, ref->buf, ref->data[0],
53 ref->linesize[0], ref->linesize[1], ref->linesize[2], ref->linesize[3],
54 ref->pts);
55
56 if (ref->width) {
57 ff_tlog(ctx, " a:%d/%d s:%dx%d i:%c iskey:%d type:%c",
58 ref->sample_aspect_ratio.num, ref->sample_aspect_ratio.den,
59 ref->width, ref->height,
60 !(ref->flags & AV_FRAME_FLAG_INTERLACED) ? 'P' : /* Progressive */
61 (ref->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST) ? 'T' : 'B', /* Top / Bottom */
62 !!(ref->flags & AV_FRAME_FLAG_KEY),
63 av_get_picture_type_char(ref->pict_type));
64 }
65 if (ref->nb_samples) {
66 AVBPrint bprint;
67
69 av_channel_layout_describe_bprint(&ref->ch_layout, &bprint);
70 ff_tlog(ctx, " cl:%s n:%d r:%d",
71 bprint.str,
72 ref->nb_samples,
73 ref->sample_rate);
74 av_bprint_finalize(&bprint, NULL);
75 }
76
77 ff_tlog(ctx, "]%s", end ? "\n" : "");
78#endif
79}
80
82{
85 av_freep(&c->arg);
86 av_freep(&c->command);
87 ctxi->command_queue = c->next;
88 av_free(c);
89}
90
91/**
92 * Append a new pad.
93 *
94 * @param count Pointer to the number of pads in the list
95 * @param pads Pointer to the pointer to the beginning of the list of pads
96 * @param links Pointer to the pointer to the beginning of the list of links
97 * @param newpad The new pad to add. A copy is made when adding.
98 * @return >= 0 in case of success, a negative AVERROR code on error
99 */
100static int append_pad(unsigned *count, AVFilterPad **pads,
101 AVFilterLink ***links, AVFilterPad *newpad)
102{
103 AVFilterLink **newlinks;
104 AVFilterPad *newpads;
105 unsigned idx = *count;
106
107 newpads = av_realloc_array(*pads, idx + 1, sizeof(*newpads));
108 newlinks = av_realloc_array(*links, idx + 1, sizeof(*newlinks));
109 if (newpads)
110 *pads = newpads;
111 if (newlinks)
112 *links = newlinks;
113 if (!newpads || !newlinks) {
114 if (newpad->flags & AVFILTERPAD_FLAG_FREE_NAME)
115 av_freep(&newpad->name);
116 return AVERROR(ENOMEM);
117 }
118
119 memcpy(*pads + idx, newpad, sizeof(AVFilterPad));
120 (*links)[idx] = NULL;
121
122 (*count)++;
123
124 return 0;
125}
126
128{
129 return append_pad(&f->nb_inputs, &f->input_pads, &f->inputs, p);
130}
131
137
139{
140 return append_pad(&f->nb_outputs, &f->output_pads, &f->outputs, p);
141}
142
148
149int avfilter_link(AVFilterContext *src, unsigned srcpad,
150 AVFilterContext *dst, unsigned dstpad)
151{
153 AVFilterLink *link;
154
155 av_assert0(src->graph);
156 av_assert0(dst->graph);
157 av_assert0(src->graph == dst->graph);
158
159 if (src->nb_outputs <= srcpad || dst->nb_inputs <= dstpad ||
160 src->outputs[srcpad] || dst->inputs[dstpad])
161 return AVERROR(EINVAL);
162
163 if (!(fffilterctx(src)->state_flags & AV_CLASS_STATE_INITIALIZED) ||
164 !(fffilterctx(dst)->state_flags & AV_CLASS_STATE_INITIALIZED)) {
165 av_log(src, AV_LOG_ERROR, "Filters must be initialized before linking.\n");
166 return AVERROR(EINVAL);
167 }
168
169 if (src->output_pads[srcpad].type != dst->input_pads[dstpad].type) {
171 "Media type mismatch between the '%s' filter output pad %d (%s) and the '%s' filter input pad %d (%s)\n",
172 src->name, srcpad, (char *)av_x_if_null(av_get_media_type_string(src->output_pads[srcpad].type), "?"),
173 dst->name, dstpad, (char *)av_x_if_null(av_get_media_type_string(dst-> input_pads[dstpad].type), "?"));
174 return AVERROR(EINVAL);
175 }
176
177 li = av_mallocz(sizeof(*li));
178 if (!li)
179 return AVERROR(ENOMEM);
180 link = &li->l.pub;
181
182 src->outputs[srcpad] = dst->inputs[dstpad] = link;
183
184 link->src = src;
185 link->dst = dst;
186 link->srcpad = &src->output_pads[srcpad];
187 link->dstpad = &dst->input_pads[dstpad];
188 link->type = src->output_pads[srcpad].type;
189 li->l.graph = src->graph;
191 link->format = -1;
193 ff_framequeue_init(&li->fifo, &fffiltergraph(src->graph)->frame_queues);
194
195 return 0;
196}
197
198static void link_free(AVFilterLink **link)
199{
201
202 if (!*link)
203 return;
204 li = ff_link_internal(*link);
205
208 av_channel_layout_uninit(&(*link)->ch_layout);
209 av_frame_side_data_free(&(*link)->side_data, &(*link)->nb_side_data);
210
212
213 av_freep(link);
214}
215
217{
218 AVFilterLink *const link = &li->l.pub;
219
220 if (pts == AV_NOPTS_VALUE)
221 return;
222 li->l.current_pts = pts;
224 /* TODO use duration */
225 if (li->l.graph && li->age_index >= 0)
227}
228
230{
232 ctxi->ready = FFMAX(ctxi->ready, priority);
233}
234
235/**
236 * Clear frame_blocked_in on all outputs.
237 * This is necessary whenever something changes on input.
238 */
240{
241 unsigned i;
242
243 for (i = 0; i < filter->nb_outputs; i++) {
244 FilterLinkInternal * const li = ff_link_internal(filter->outputs[i]);
245 li->frame_blocked_in = 0;
246 }
247}
248
249
251{
252 FilterLinkInternal * const li = ff_link_internal(link);
253
254 if (li->status_in == status)
255 return;
256 av_assert0(!li->status_in);
257 li->status_in = status;
258 li->status_in_pts = pts;
259 li->frame_wanted_out = 0;
260 li->frame_blocked_in = 0;
261 filter_unblock(link->dst);
262 ff_filter_set_ready(link->dst, 200);
263}
264
265/**
266 * Set the status field of a link from the destination filter.
267 * The pts should probably be left unset (AV_NOPTS_VALUE).
268 */
269static void link_set_out_status(AVFilterLink *link, int status, int64_t pts)
270{
271 FilterLinkInternal * const li = ff_link_internal(link);
272
275 li->status_out = status;
276 if (pts != AV_NOPTS_VALUE)
278 filter_unblock(link->dst);
279 ff_filter_set_ready(link->src, 200);
280}
281
283 unsigned filt_srcpad_idx, unsigned filt_dstpad_idx)
284{
285 int ret;
286 unsigned dstpad_idx = link->dstpad - link->dst->input_pads;
287
288 av_log(link->dst, AV_LOG_VERBOSE, "auto-inserting filter '%s' "
289 "between the filter '%s' and the filter '%s'\n",
290 filt->name, link->src->name, link->dst->name);
291
292 link->dst->inputs[dstpad_idx] = NULL;
293 if ((ret = avfilter_link(filt, filt_dstpad_idx, link->dst, dstpad_idx)) < 0) {
294 /* failed to link output filter to new filter */
295 link->dst->inputs[dstpad_idx] = link;
296 return ret;
297 }
298
299 /* re-hookup the link to the new destination filter we inserted */
300 link->dst = filt;
301 link->dstpad = &filt->input_pads[filt_srcpad_idx];
302 filt->inputs[filt_srcpad_idx] = link;
303
304 /* if any information on supported media formats already exists on the
305 * link, we need to preserve that */
306 if (link->outcfg.formats)
308 &filt->outputs[filt_dstpad_idx]->outcfg.formats);
309 if (link->outcfg.color_spaces)
311 &filt->outputs[filt_dstpad_idx]->outcfg.color_spaces);
312 if (link->outcfg.color_ranges)
314 &filt->outputs[filt_dstpad_idx]->outcfg.color_ranges);
315 if (link->outcfg.alpha_modes)
317 &filt->outputs[filt_dstpad_idx]->outcfg.alpha_modes);
318 if (link->outcfg.samplerates)
320 &filt->outputs[filt_dstpad_idx]->outcfg.samplerates);
321 if (link->outcfg.channel_layouts)
323 &filt->outputs[filt_dstpad_idx]->outcfg.channel_layouts);
324
325 return 0;
326}
327
329{
330 int (*config_link)(AVFilterLink *);
331 unsigned i;
332 int ret;
333
334 for (i = 0; i < filter->nb_inputs; i ++) {
335 AVFilterLink *link = filter->inputs[i];
336 AVFilterLink *inlink;
338 FilterLinkInternal *li_in;
339
340 if (!link) continue;
341 if (!link->src || !link->dst) {
343 "Not all input and output are properly linked (%d).\n", i);
344 return AVERROR(EINVAL);
345 }
346
347 inlink = link->src->nb_inputs ? link->src->inputs[0] : NULL;
348 li_in = inlink ? ff_link_internal(inlink) : NULL;
349 li->l.current_pts =
351
352 switch (li->init_state) {
353 case AVLINK_INIT:
354 continue;
355 case AVLINK_STARTINIT:
356 av_log(filter, AV_LOG_INFO, "circular filter chain detected\n");
357 return 0;
358 case AVLINK_UNINIT:
359 li->init_state = AVLINK_STARTINIT;
360
361 if ((ret = ff_filter_config_links(link->src)) < 0)
362 return ret;
363
364 if (!(config_link = link->srcpad->config_props)) {
365 if (link->src->nb_inputs != 1) {
366 av_log(link->src, AV_LOG_ERROR, "Source filters and filters "
367 "with more than one input "
368 "must set config_props() "
369 "callbacks on all outputs\n");
370 return AVERROR(EINVAL);
371 }
372 }
373
374 /* Copy side data before link->srcpad->config_props() is called, so the filter
375 * may remove it for the next filter in the chain */
376 if (inlink && inlink->nb_side_data && !link->nb_side_data) {
377 for (int j = 0; j < inlink->nb_side_data; j++) {
379 inlink->side_data[j], 0);
380 if (ret < 0) {
382 return ret;
383 }
384 }
385 }
386
387 if (config_link && (ret = config_link(link)) < 0) {
388 av_log(link->src, AV_LOG_ERROR,
389 "Failed to configure output pad on %s\n",
390 link->src->name);
391 return ret;
392 }
393
394 switch (link->type) {
396 if (!link->time_base.num && !link->time_base.den)
397 link->time_base = inlink ? inlink->time_base : AV_TIME_BASE_Q;
398
399 if (!link->sample_aspect_ratio.num && !link->sample_aspect_ratio.den)
400 link->sample_aspect_ratio = inlink ?
401 inlink->sample_aspect_ratio : (AVRational){1,1};
402
403 if (inlink) {
404 if (!li->l.frame_rate.num && !li->l.frame_rate.den)
405 li->l.frame_rate = li_in->l.frame_rate;
406 if (!link->w)
407 link->w = inlink->w;
408 if (!link->h)
409 link->h = inlink->h;
410 } else if (!link->w || !link->h) {
411 av_log(link->src, AV_LOG_ERROR,
412 "Video source filters must set their output link's "
413 "width and height\n");
414 return AVERROR(EINVAL);
415 }
416 break;
417
419 if (inlink) {
420 if (!link->time_base.num && !link->time_base.den)
421 link->time_base = inlink->time_base;
422 }
423
424 if (!link->time_base.num && !link->time_base.den)
425 link->time_base = (AVRational) {1, link->sample_rate};
426 }
427
428 if (link->src->nb_inputs &&
429 !(fffilter(link->src->filter)->flags_internal & FF_FILTER_FLAG_HWFRAME_AWARE)) {
430 FilterLink *l0 = ff_filter_link(link->src->inputs[0]);
431
433 "should not be set by non-hwframe-aware filter");
434
435 if (l0->hw_frames_ctx) {
437 if (!li->l.hw_frames_ctx)
438 return AVERROR(ENOMEM);
439 }
440 }
441
442 if ((config_link = link->dstpad->config_props))
443 if ((ret = config_link(link)) < 0) {
444 av_log(link->dst, AV_LOG_ERROR,
445 "Failed to configure input pad on %s\n",
446 link->dst->name);
447 return ret;
448 }
449
450 li->init_state = AVLINK_INIT;
451 }
452 }
453
454 return 0;
455}
456
457#ifdef TRACE
458void ff_tlog_link(void *ctx, AVFilterLink *link, int end)
459{
460 if (link->type == AVMEDIA_TYPE_VIDEO) {
461 ff_tlog(ctx,
462 "link[%p s:%dx%d fmt:%s %s->%s]%s",
463 link, link->w, link->h,
465 link->src ? link->src->filter->name : "",
466 link->dst ? link->dst->filter->name : "",
467 end ? "\n" : "");
468 } else {
469 char buf[128];
470 av_channel_layout_describe(&link->ch_layout, buf, sizeof(buf));
471
472 ff_tlog(ctx,
473 "link[%p r:%d cl:%s fmt:%s %s->%s]%s",
474 link, (int)link->sample_rate, buf,
476 link->src ? link->src->filter->name : "",
477 link->dst ? link->dst->filter->name : "",
478 end ? "\n" : "");
479 }
480}
481#endif
482
484{
485 FilterLinkInternal * const li = ff_link_internal(link);
486
488
490 if (li->status_out)
491 return li->status_out;
492 if (li->status_in) {
495 av_assert1(fffilterctx(link->dst)->ready >= 300);
496 return 0;
497 } else {
498 /* Acknowledge status change. Filters using ff_request_frame() will
499 handle the change automatically. Filters can also check the
500 status directly but none do yet. */
502 return li->status_out;
503 }
504 }
505 li->frame_wanted_out = 1;
506 ff_filter_set_ready(link->src, 100);
507 return 0;
508}
509
510static int64_t guess_status_pts(AVFilterContext *ctx, int status, AVRational link_time_base)
511{
512 unsigned i;
513 int64_t r = INT64_MAX;
514
515 for (i = 0; i < ctx->nb_inputs; i++) {
516 FilterLinkInternal * const li = ff_link_internal(ctx->inputs[i]);
517 if (li->status_out == status)
518 r = FFMIN(r, av_rescale_q(li->l.current_pts, ctx->inputs[i]->time_base, link_time_base));
519 }
520 if (r < INT64_MAX)
521 return r;
522 av_log(ctx, AV_LOG_WARNING, "EOF timestamp not reliable\n");
523 for (i = 0; i < ctx->nb_inputs; i++) {
524 FilterLinkInternal * const li = ff_link_internal(ctx->inputs[i]);
525 r = FFMIN(r, av_rescale_q(li->status_in_pts, ctx->inputs[i]->time_base, link_time_base));
526 }
527 if (r < INT64_MAX)
528 return r;
529 return AV_NOPTS_VALUE;
530}
531
533{
534 FilterLinkInternal * const li = ff_link_internal(link);
535 int ret = -1;
536
538 /* Assume the filter is blocked, let the method clear it if not */
539 li->frame_blocked_in = 1;
540 if (link->srcpad->request_frame)
541 ret = link->srcpad->request_frame(link);
542 else if (link->src->inputs[0])
543 ret = ff_request_frame(link->src->inputs[0]);
544 if (ret < 0) {
545 if (ret != AVERROR(EAGAIN) && ret != li->status_in)
546 ff_avfilter_link_set_in_status(link, ret, guess_status_pts(link->src, ret, link->time_base));
547 if (ret == AVERROR_EOF)
548 ret = 0;
549 }
550 return ret;
551}
552
553static const char *const var_names[] = {
554 "t",
555 "n",
556 "w",
557 "h",
558 NULL
559};
560
561enum {
567};
568
569static int set_enable_expr(FFFilterContext *ctxi, const char *expr)
570{
571 AVFilterContext *ctx = &ctxi->p;
572 int ret;
573 char *expr_dup;
574 AVExpr *old = ctxi->enable;
575
576 if (!(ctx->filter->flags & AVFILTER_FLAG_SUPPORT_TIMELINE)) {
577 av_log(ctx, AV_LOG_ERROR, "Timeline ('enable' option) not supported "
578 "with filter '%s'\n", ctx->filter->name);
580 }
581
582 expr_dup = av_strdup(expr);
583 if (!expr_dup)
584 return AVERROR(ENOMEM);
585
586 if (!ctxi->var_values) {
587 ctxi->var_values = av_calloc(VAR_VARS_NB, sizeof(*ctxi->var_values));
588 if (!ctxi->var_values) {
589 av_free(expr_dup);
590 return AVERROR(ENOMEM);
591 }
592 }
593
594 ret = av_expr_parse(&ctxi->enable, expr_dup, var_names,
595 NULL, NULL, NULL, NULL, 0, ctx->priv);
596 if (ret < 0) {
597 av_log(ctx->priv, AV_LOG_ERROR,
598 "Error when evaluating the expression '%s' for enable\n",
599 expr_dup);
600 av_free(expr_dup);
601 return ret;
602 }
603
604 av_expr_free(old);
605 av_free(ctx->enable_str);
606 ctx->enable_str = expr_dup;
607 return 0;
608}
609
610int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags)
611{
612 if(!strcmp(cmd, "ping")){
613 char local_res[256] = {0};
614
615 if (!res) {
616 res = local_res;
617 res_len = sizeof(local_res);
618 }
619 av_strlcatf(res, res_len, "pong from:%s %s\n", filter->filter->name, filter->name);
620 if (res == local_res)
621 av_log(filter, AV_LOG_INFO, "%s", res);
622 return 0;
623 }else if(!strcmp(cmd, "enable")) {
625 }else if (fffilter(filter->filter)->process_command) {
626 return fffilter(filter->filter)->process_command(filter, cmd, arg, res, res_len, flags);
627 }
628 return AVERROR(ENOSYS);
629}
630
631unsigned avfilter_filter_pad_count(const AVFilter *filter, int is_output)
632{
633 return is_output ? fffilter(filter)->nb_outputs : fffilter(filter)->nb_inputs;
634}
635
636static const char *default_filter_name(void *filter_ctx)
637{
639 return ctx->name ? ctx->name : ctx->filter->name;
640}
641
642static void *filter_child_next(void *obj, void *prev)
643{
644 AVFilterContext *ctx = obj;
645 if (!prev && ctx->filter && ctx->filter->priv_class && ctx->priv)
646 return ctx->priv;
647 return NULL;
648}
649
650static const AVClass *filter_child_class_iterate(void **iter)
651{
652 const AVFilter *f;
653
654 while ((f = av_filter_iterate(iter)))
655 if (f->priv_class)
656 return f->priv_class;
657
658 return NULL;
659}
660
661#define OFFSET(x) offsetof(AVFilterContext, x)
662#define FLAGS AV_OPT_FLAG_FILTERING_PARAM
663#define TFLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
664static const AVOption avfilter_options[] = {
665 { "thread_type", "Allowed thread types", OFFSET(thread_type), AV_OPT_TYPE_FLAGS,
666 { .i64 = AVFILTER_THREAD_SLICE }, 0, INT_MAX, FLAGS, .unit = "thread_type" },
667 { "slice", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVFILTER_THREAD_SLICE }, .flags = FLAGS, .unit = "thread_type" },
668 { "enable", "set enable expression", OFFSET(enable_str), AV_OPT_TYPE_STRING, {.str=NULL}, .flags = TFLAGS },
669 { "threads", "Allowed number of threads", OFFSET(nb_threads), AV_OPT_TYPE_INT,
670 { .i64 = 0 }, 0, INT_MAX, FLAGS, .unit = "threads" },
671 {"auto", "autodetect a suitable number of threads to use", 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, .flags = FLAGS, .unit = "threads"},
672 { "extra_hw_frames", "Number of extra hardware frames to allocate for the user",
673 OFFSET(extra_hw_frames), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, FLAGS },
674 { NULL },
675};
676
677static const AVClass avfilter_class = {
678 .class_name = "AVFilter",
679 .item_name = default_filter_name,
680 .version = LIBAVUTIL_VERSION_INT,
681 .category = AV_CLASS_CATEGORY_FILTER,
682 .child_next = filter_child_next,
683 .child_class_iterate = filter_child_class_iterate,
684 .option = avfilter_options,
685 .state_flags_offset = offsetof(FFFilterContext, state_flags),
686};
687
689 int *ret, int nb_jobs)
690{
691 int i;
692
693 for (i = 0; i < nb_jobs; i++) {
694 int r = func(ctx, arg, i, nb_jobs);
695 if (ret)
696 ret[i] = r;
697 }
698 return 0;
699}
700
701AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name)
702{
704 AVFilterContext *ret;
705 const FFFilter *const fi = fffilter(filter);
706 int preinited = 0;
707
708 if (!filter)
709 return NULL;
710
711 ctx = av_mallocz(sizeof(*ctx));
712 if (!ctx)
713 return NULL;
714 ret = &ctx->p;
715
716 ret->av_class = &avfilter_class;
717 ret->filter = filter;
718 ret->name = inst_name ? av_strdup(inst_name) : NULL;
719 if (fi->priv_size) {
720 ret->priv = av_mallocz(fi->priv_size);
721 if (!ret->priv)
722 goto err;
723 }
724 if (fi->preinit) {
725 if (fi->preinit(ret) < 0)
726 goto err;
727 preinited = 1;
728 }
729
731 if (filter->priv_class) {
732 *(const AVClass**)ret->priv = filter->priv_class;
734 }
735
736 ctx->execute = default_execute;
737
738 ret->nb_inputs = fi->nb_inputs;
739 if (ret->nb_inputs ) {
740 ret->input_pads = av_memdup(filter->inputs, ret->nb_inputs * sizeof(*filter->inputs));
741 if (!ret->input_pads)
742 goto err;
743 ret->inputs = av_calloc(ret->nb_inputs, sizeof(*ret->inputs));
744 if (!ret->inputs)
745 goto err;
746 }
747
748 ret->nb_outputs = fi->nb_outputs;
749 if (ret->nb_outputs) {
750 ret->output_pads = av_memdup(filter->outputs, ret->nb_outputs * sizeof(*filter->outputs));
751 if (!ret->output_pads)
752 goto err;
753 ret->outputs = av_calloc(ret->nb_outputs, sizeof(*ret->outputs));
754 if (!ret->outputs)
755 goto err;
756 }
757
758 return ret;
759
760err:
761 if (preinited)
762 fi->uninit(ret);
763 av_freep(&ret->name);
764 av_freep(&ret->inputs);
765 av_freep(&ret->input_pads);
766 ret->nb_inputs = 0;
767 av_freep(&ret->outputs);
768 av_freep(&ret->output_pads);
769 ret->nb_outputs = 0;
770 av_freep(&ret->priv);
771 av_free(ret);
772 return NULL;
773}
774
775static void free_link(AVFilterLink *link)
776{
777 if (!link)
778 return;
779
780 if (link->src)
781 link->src->outputs[link->srcpad - link->src->output_pads] = NULL;
782 if (link->dst)
783 link->dst->inputs[link->dstpad - link->dst->input_pads] = NULL;
784
797 link_free(&link);
798}
799
801{
802 FFFilterContext *ctxi;
803 int i;
804
805 if (!filter)
806 return;
807 ctxi = fffilterctx(filter);
808
809 if (filter->graph)
811
812 if (fffilter(filter->filter)->uninit)
813 fffilter(filter->filter)->uninit(filter);
814
815 for (i = 0; i < filter->nb_inputs; i++) {
816 free_link(filter->inputs[i]);
817 if (filter->input_pads[i].flags & AVFILTERPAD_FLAG_FREE_NAME)
818 av_freep(&filter->input_pads[i].name);
819 }
820 for (i = 0; i < filter->nb_outputs; i++) {
821 free_link(filter->outputs[i]);
822 if (filter->output_pads[i].flags & AVFILTERPAD_FLAG_FREE_NAME)
823 av_freep(&filter->output_pads[i].name);
824 }
825
826 if (filter->filter->priv_class)
827 av_opt_free(filter->priv);
828
829 av_buffer_unref(&filter->hw_device_ctx);
830
831 av_freep(&filter->name);
832 av_freep(&filter->input_pads);
833 av_freep(&filter->output_pads);
834 av_freep(&filter->inputs);
835 av_freep(&filter->outputs);
836 av_freep(&filter->priv);
837 while (ctxi->command_queue)
840 av_expr_free(ctxi->enable);
841 ctxi->enable = NULL;
842 av_freep(&ctxi->var_values);
844}
845
847{
848 if (ctx->nb_threads > 0)
849 return FFMIN(ctx->nb_threads, ctx->graph->nb_threads);
850 return ctx->graph->nb_threads;
851}
852
853int ff_filter_opt_parse(void *logctx, const AVClass *priv_class,
854 AVDictionary **options, const char *args)
855{
856 const AVOption *o = NULL;
857 int ret;
858 int offset= -1;
859
860 if (!args)
861 return 0;
862
863 while (*args) {
864 char *parsed_key, *value;
865 const char *key;
866 const char *shorthand = NULL;
867 int additional_flags = 0;
868
869 if (priv_class && (o = av_opt_next(&priv_class, o))) {
870 if (o->type == AV_OPT_TYPE_CONST || o->offset == offset)
871 continue;
872 offset = o->offset;
873 shorthand = o->name;
874 }
875
876 ret = av_opt_get_key_value(&args, "=", ":",
877 shorthand ? AV_OPT_FLAG_IMPLICIT_KEY : 0,
878 &parsed_key, &value);
879 if (ret < 0) {
880 if (ret == AVERROR(EINVAL))
881 av_log(logctx, AV_LOG_ERROR, "No option name near '%s'\n", args);
882 else
883 av_log(logctx, AV_LOG_ERROR, "Unable to parse '%s': %s\n", args,
884 av_err2str(ret));
885 return ret;
886 }
887 if (*args)
888 args++;
889 if (parsed_key) {
890 key = parsed_key;
891 additional_flags = AV_DICT_DONT_STRDUP_KEY;
892 priv_class = NULL; /* reject all remaining shorthand */
893 } else {
894 key = shorthand;
895 }
896
897 av_log(logctx, AV_LOG_DEBUG, "Setting '%s' to value '%s'\n", key, value);
898
900 additional_flags | AV_DICT_DONT_STRDUP_VAL | AV_DICT_MULTIKEY);
901 }
902
903 return 0;
904}
905
907 const char *arg, char *res, int res_len, int flags)
908{
909 const AVOption *o;
910
911 if (!ctx->filter->priv_class)
912 return 0;
914 if (!o)
915 return AVERROR(ENOSYS);
916 return av_opt_set(ctx->priv, cmd, arg, 0);
917}
918
920{
922 int ret = 0;
923
925 av_log(ctx, AV_LOG_ERROR, "Filter already initialized\n");
926 return AVERROR(EINVAL);
927 }
928
930 if (ret < 0) {
931 av_log(ctx, AV_LOG_ERROR, "Error applying generic filter options.\n");
932 return ret;
933 }
934
935 if (ctx->filter->flags & AVFILTER_FLAG_SLICE_THREADS &&
936 ctx->thread_type & ctx->graph->thread_type & AVFILTER_THREAD_SLICE &&
937 fffiltergraph(ctx->graph)->thread_execute) {
938 ctx->thread_type = AVFILTER_THREAD_SLICE;
939 ctxi->execute = fffiltergraph(ctx->graph)->thread_execute;
940 } else {
941 ctx->thread_type = 0;
942 }
943
944 if (fffilter(ctx->filter)->init)
945 ret = fffilter(ctx->filter)->init(ctx);
946 if (ret < 0)
947 return ret;
948
949 if (ctx->enable_str) {
950 ret = set_enable_expr(ctxi, ctx->enable_str);
951 if (ret < 0)
952 return ret;
953 }
954
956
957 return 0;
958}
959
961{
963 const AVDictionaryEntry *e;
964 int ret = 0;
965
966 if (args && *args) {
967 ret = ff_filter_opt_parse(filter, filter->filter->priv_class, &options, args);
968 if (ret < 0)
969 goto fail;
970 }
971
973 if (ret < 0)
974 goto fail;
975
976 if ((e = av_dict_iterate(options, NULL))) {
977 av_log(filter, AV_LOG_ERROR, "No such option: %s.\n", e->key);
979 goto fail;
980 }
981
982fail:
984
985 return ret;
986}
987
988const char *avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx)
989{
990 return pads[pad_idx].name;
991}
992
993enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx)
994{
995 return pads[pad_idx].type;
996}
997
999{
1000 FilterLink *plink = ff_filter_link(link);
1001 if (plink->hw_frames_ctx)
1002 return av_buffer_ref(plink->hw_frames_ctx);
1003
1004 return NULL;
1005}
1006
1008{
1009 return ff_filter_frame(link->dst->outputs[0], frame);
1010}
1011
1012/**
1013 * Evaluate the timeline expression of the link for the time and properties
1014 * of the frame.
1015 * @return >0 if enabled, 0 if disabled
1016 * @note It does not update link->dst->is_disabled.
1017 */
1019{
1020 FilterLink *l = ff_filter_link(link);
1021 AVFilterContext *dstctx = link->dst;
1022 FFFilterContext *dsti = fffilterctx(dstctx);
1023 int64_t pts = frame->pts;
1024
1025 if (!dstctx->enable_str)
1026 return 1;
1027
1028 dsti->var_values[VAR_N] = l->frame_count_out;
1029 dsti->var_values[VAR_T] = pts == AV_NOPTS_VALUE ? NAN : pts * av_q2d(link->time_base);
1030 dsti->var_values[VAR_W] = link->w;
1031 dsti->var_values[VAR_H] = link->h;
1032
1033 return fabs(av_expr_eval(dsti->enable, dsti->var_values, NULL)) >= 0.5;
1034}
1035
1037{
1038 FilterLink *l = ff_filter_link(link);
1039 int (*filter_frame)(AVFilterLink *, AVFrame *);
1040 AVFilterContext *dstctx = link->dst;
1041 AVFilterPad *dst = link->dstpad;
1042 int ret;
1043
1044 if (!(filter_frame = dst->filter_frame))
1046
1047 if (dst->flags & AVFILTERPAD_FLAG_NEEDS_WRITABLE) {
1049 if (ret < 0)
1050 goto fail;
1051 }
1052
1055
1056 if (dstctx->is_disabled &&
1059 ret = filter_frame(link, frame);
1060 l->frame_count_out++;
1061 return ret;
1062
1063fail:
1065 return ret;
1066}
1067
1069{
1070 FilterLinkInternal * const li = ff_link_internal(link);
1071 int ret;
1073
1074 /* Consistency checks */
1075 if (link->type == AVMEDIA_TYPE_VIDEO) {
1076 if (strcmp(link->dst->filter->name, "buffersink") &&
1077 strcmp(link->dst->filter->name, "format") &&
1078 strcmp(link->dst->filter->name, "idet") &&
1079 strcmp(link->dst->filter->name, "null") &&
1080 strcmp(link->dst->filter->name, "scale") &&
1081 strcmp(link->dst->filter->name, "libplacebo") &&
1082 strcmp(link->dst->filter->name, "hqdn3d")) {
1083 av_assert1(frame->format == link->format);
1084 av_assert1(frame->width == link->w);
1085 av_assert1(frame->height == link->h);
1087 av_assert1(frame->alpha_mode == link->alpha_mode);
1088 }
1089 } else {
1090 if (frame->format != link->format) {
1091 av_log(link->dst, AV_LOG_ERROR, "Format change is not supported\n");
1092 goto error;
1093 }
1094 if (av_channel_layout_compare(&frame->ch_layout, &link->ch_layout)) {
1095 av_log(link->dst, AV_LOG_ERROR, "Channel layout change is not supported\n");
1096 goto error;
1097 }
1098 if (frame->sample_rate != link->sample_rate) {
1099 av_log(link->dst, AV_LOG_ERROR, "Sample rate change is not supported\n");
1100 goto error;
1101 }
1102
1103 frame->duration = av_rescale_q(frame->nb_samples, (AVRational){ 1, frame->sample_rate },
1104 link->time_base);
1105 }
1106
1107 li->frame_blocked_in = li->frame_wanted_out = 0;
1108 li->l.frame_count_in++;
1109 li->l.sample_count_in += frame->nb_samples;
1110 filter_unblock(link->dst);
1111 ret = ff_framequeue_add(&li->fifo, frame);
1112 if (ret < 0) {
1113 const FFFrameQueueGlobal *global = li->fifo.global;
1114 if (ret == AVERROR(ENOMEM) && global->queued >= global->max_queued)
1115 av_log(link->dst, AV_LOG_ERROR, "Exhausted frame queue capacity (%zu frames)\n", global->max_queued);
1117 return ret;
1118 }
1119 ff_filter_set_ready(link->dst, 300);
1120 return 0;
1121
1122error:
1124 return AVERROR_PATCHWELCOME;
1125}
1126
1127static int samples_ready(FilterLinkInternal *link, unsigned min)
1128{
1129 return ff_framequeue_queued_frames(&link->fifo) &&
1131 link->status_in);
1132}
1133
1134static int take_samples(FilterLinkInternal *li, unsigned min, unsigned max,
1135 AVFrame **rframe)
1136{
1137 FilterLink *l = &li->l;
1138 AVFilterLink *link = &l->pub;
1139 AVFrame *frame0, *frame, *buf;
1140 unsigned nb_samples, nb_frames, i, p;
1141 int ret;
1142
1143 /* Note: this function relies on no format changes and must only be
1144 called with enough samples. */
1146 frame0 = frame = ff_framequeue_peek(&li->fifo, 0);
1147 if (!li->fifo.samples_skipped && frame->nb_samples >= min && frame->nb_samples <= max) {
1148 *rframe = ff_framequeue_take(&li->fifo);
1149 return 0;
1150 }
1151 nb_frames = 0;
1152 nb_samples = 0;
1153 while (1) {
1154 if (nb_samples + frame->nb_samples > max) {
1155 if (nb_samples < min)
1156 nb_samples = max;
1157 break;
1158 }
1159 nb_samples += frame->nb_samples;
1160 nb_frames++;
1161 if (nb_frames == ff_framequeue_queued_frames(&li->fifo))
1162 break;
1163 frame = ff_framequeue_peek(&li->fifo, nb_frames);
1164 }
1165
1166 buf = ff_get_audio_buffer(link, nb_samples);
1167 if (!buf)
1168 return AVERROR(ENOMEM);
1169 ret = av_frame_copy_props(buf, frame0);
1170 if (ret < 0) {
1171 av_frame_free(&buf);
1172 return ret;
1173 }
1174
1175 p = 0;
1176 for (i = 0; i < nb_frames; i++) {
1178 av_samples_copy(buf->extended_data, frame->extended_data, p, 0,
1179 frame->nb_samples, link->ch_layout.nb_channels, link->format);
1180 p += frame->nb_samples;
1182 }
1183 if (p < nb_samples) {
1184 unsigned n = nb_samples - p;
1185 frame = ff_framequeue_peek(&li->fifo, 0);
1186 av_samples_copy(buf->extended_data, frame->extended_data, p, 0, n,
1187 link->ch_layout.nb_channels, link->format);
1189 }
1190
1191 *rframe = buf;
1192 return 0;
1193}
1194
1196{
1197 FilterLinkInternal * const li = ff_link_internal(link);
1198 AVFrame *frame = NULL;
1199 AVFilterContext *dst = link->dst;
1200 int ret;
1201
1203 ret = li->l.min_samples ?
1206 av_assert1(ret);
1207 if (ret < 0) {
1208 av_assert1(!frame);
1209 return ret;
1210 }
1211 /* The filter will soon have received a new frame, that may allow it to
1212 produce one or more: unblock its outputs. */
1214 /* AVFilterPad.filter_frame() expect frame_count_out to have the value
1215 before the frame; filter_frame_framed() will re-increment it. */
1216 li->l.frame_count_out--;
1217 ret = filter_frame_framed(link, frame);
1218 if (ret < 0 && ret != li->status_out) {
1220 } else {
1221 /* Run once again, to see if several frames were available, or if
1222 the input status has also changed, or any other reason. */
1224 }
1225 return ret;
1226}
1227
1229{
1230 AVFilterLink *in = &li_in->l.pub;
1231 unsigned out = 0, progress = 0;
1232 int ret;
1233
1234 av_assert0(!li_in->status_out);
1235 if (!filter->nb_outputs) {
1236 /* not necessary with the current API and sinks */
1237 return 0;
1238 }
1239 while (!li_in->status_out) {
1240 FilterLinkInternal *li_out = ff_link_internal(filter->outputs[out]);
1241
1242 if (!li_out->status_in) {
1243 progress++;
1244 ret = request_frame_to_filter(filter->outputs[out]);
1245 if (ret < 0)
1246 return ret;
1247 }
1248 if (++out == filter->nb_outputs) {
1249 if (!progress) {
1250 /* Every output already closed: input no longer interesting
1251 (example: overlay in shortest mode, other input closed). */
1252 link_set_out_status(in, li_in->status_in, li_in->status_in_pts);
1253 return 0;
1254 }
1255 progress = 0;
1256 out = 0;
1257 }
1258 }
1260 return 0;
1261}
1262
1264{
1265 unsigned i;
1266 int nb_eofs = 0;
1267
1268 for (i = 0; i < filter->nb_outputs; i++)
1269 nb_eofs += ff_outlink_get_status(filter->outputs[i]) == AVERROR_EOF;
1270 if (filter->nb_outputs && nb_eofs == filter->nb_outputs) {
1271 for (int j = 0; j < filter->nb_inputs; j++)
1273 return 0;
1274 }
1275
1276 for (i = 0; i < filter->nb_inputs; i++) {
1278 if (samples_ready(li, li->l.min_samples)) {
1279 return filter_frame_to_filter(filter->inputs[i]);
1280 }
1281 }
1282 for (i = 0; i < filter->nb_inputs; i++) {
1283 FilterLinkInternal * const li = ff_link_internal(filter->inputs[i]);
1284 if (li->status_in && !li->status_out) {
1286 return forward_status_change(filter, li);
1287 }
1288 }
1289 for (i = 0; i < filter->nb_outputs; i++) {
1290 FilterLinkInternal * const li = ff_link_internal(filter->outputs[i]);
1291 if (li->frame_wanted_out &&
1292 !li->frame_blocked_in) {
1293 return request_frame_to_filter(filter->outputs[i]);
1294 }
1295 }
1296 for (i = 0; i < filter->nb_outputs; i++) {
1297 FilterLinkInternal * const li = ff_link_internal(filter->outputs[i]);
1298 if (li->frame_wanted_out)
1299 return request_frame_to_filter(filter->outputs[i]);
1300 }
1301 if (!filter->nb_outputs) {
1302 ff_inlink_request_frame(filter->inputs[0]);
1303 return 0;
1304 }
1305 return FFERROR_NOT_READY;
1306}
1307
1308/*
1309 Filter scheduling and activation
1310
1311 When a filter is activated, it must:
1312 - if possible, output a frame;
1313 - else, if relevant, forward the input status change;
1314 - else, check outputs for wanted frames and forward the requests.
1315
1316 The following AVFilterLink fields are used for activation:
1317
1318 - frame_wanted_out:
1319
1320 This field indicates if a frame is needed on this input of the
1321 destination filter. A positive value indicates that a frame is needed
1322 to process queued frames or internal data or to satisfy the
1323 application; a zero value indicates that a frame is not especially
1324 needed but could be processed anyway; a negative value indicates that a
1325 frame would just be queued.
1326
1327 It is set by filters using ff_request_frame() or ff_request_no_frame(),
1328 when requested by the application through a specific API or when it is
1329 set on one of the outputs.
1330
1331 It is cleared when a frame is sent from the source using
1332 ff_filter_frame().
1333
1334 It is also cleared when a status change is sent from the source using
1335 ff_avfilter_link_set_in_status().
1336
1337 - frame_blocked_in:
1338
1339 This field means that the source filter can not generate a frame as is.
1340 Its goal is to avoid repeatedly calling the request_frame() method on
1341 the same link.
1342
1343 It is set by the framework on all outputs of a filter before activating it.
1344
1345 It is automatically cleared by ff_filter_frame().
1346
1347 It is also automatically cleared by ff_avfilter_link_set_in_status().
1348
1349 It is also cleared on all outputs (using filter_unblock()) when
1350 something happens on an input: processing a frame or changing the
1351 status.
1352
1353 - fifo:
1354
1355 Contains the frames queued on a filter input. If it contains frames and
1356 frame_wanted_out is not set, then the filter can be activated. If that
1357 result in the filter not able to use these frames, the filter must set
1358 frame_wanted_out to ask for more frames.
1359
1360 - status_in and status_in_pts:
1361
1362 Status (EOF or error code) of the link and timestamp of the status
1363 change (in link time base, same as frames) as seen from the input of
1364 the link. The status change is considered happening after the frames
1365 queued in fifo.
1366
1367 It is set by the source filter using ff_avfilter_link_set_in_status().
1368
1369 - status_out:
1370
1371 Status of the link as seen from the output of the link. The status
1372 change is considered having already happened.
1373
1374 It is set by the destination filter using
1375 link_set_out_status().
1376
1377 Filters are activated according to the ready field, set using the
1378 ff_filter_set_ready(). Eventually, a priority queue will be used.
1379 ff_filter_set_ready() is called whenever anything could cause progress to
1380 be possible. Marking a filter ready when it is not is not a problem,
1381 except for the small overhead it causes.
1382
1383 Conditions that cause a filter to be marked ready are:
1384
1385 - frames added on an input link;
1386
1387 - changes in the input or output status of an input link;
1388
1389 - requests for a frame on an output link;
1390
1391 - after any actual processing using the legacy methods (filter_frame(),
1392 and request_frame() to acknowledge status changes), to run once more
1393 and check if enough input was present for several frames.
1394
1395 Examples of scenarios to consider:
1396
1397 - buffersrc: activate if frame_wanted_out to notify the application;
1398 activate when the application adds a frame to push it immediately.
1399
1400 - testsrc: activate only if frame_wanted_out to produce and push a frame.
1401
1402 - concat (not at stitch points): can process a frame on any output.
1403 Activate if frame_wanted_out on output to forward on the corresponding
1404 input. Activate when a frame is present on input to process it
1405 immediately.
1406
1407 - framesync: needs at least one frame on each input; extra frames on the
1408 wrong input will accumulate. When a frame is first added on one input,
1409 set frame_wanted_out<0 on it to avoid getting more (would trigger
1410 testsrc) and frame_wanted_out>0 on the other to allow processing it.
1411
1412 Activation of old filters:
1413
1414 In order to activate a filter implementing the legacy filter_frame() and
1415 request_frame() methods, perform the first possible of the following
1416 actions:
1417
1418 - If an input has frames in fifo and frame_wanted_out == 0, dequeue a
1419 frame and call filter_frame().
1420
1421 Rationale: filter frames as soon as possible instead of leaving them
1422 queued; frame_wanted_out < 0 is not possible since the old API does not
1423 set it nor provides any similar feedback; frame_wanted_out > 0 happens
1424 when min_samples > 0 and there are not enough samples queued.
1425
1426 - If an input has status_in set but not status_out, try to call
1427 request_frame() on one of the outputs in the hope that it will trigger
1428 request_frame() on the input with status_in and acknowledge it. This is
1429 awkward and fragile, filters with several inputs or outputs should be
1430 updated to direct activation as soon as possible.
1431
1432 - If an output has frame_wanted_out > 0 and not frame_blocked_in, call
1433 request_frame().
1434
1435 Rationale: checking frame_blocked_in is necessary to avoid requesting
1436 repeatedly on a blocked input if another is not blocked (example:
1437 [buffersrc1][testsrc1][buffersrc2][testsrc2]concat=v=2).
1438
1439 - If an output has frame_wanted_out > 0 call request_frame().
1440
1441 Rationale: even if all inputs are blocked an activate callback should
1442 request a frame on some if its inputs if a frame is requested on any of
1443 its output.
1444
1445 - Request a frame on the input for sinks.
1446
1447 Rationale: sinks using the old api have no way to request a frame on their
1448 input, so we need to do it for them.
1449 */
1450
1452{
1454 const FFFilter *const fi = fffilter(filter->filter);
1455 int ret;
1456
1457 /* Generic timeline support is not yet implemented but should be easy */
1459 fi->activate));
1460 ctxi->ready = 0;
1462 if (ret == FFERROR_NOT_READY)
1463 ret = 0;
1464 return ret;
1465}
1466
1468{
1469 FilterLinkInternal * const li = ff_link_internal(link);
1470 *rpts = li->l.current_pts;
1472 return *rstatus = 0;
1473 if (li->status_out)
1474 return *rstatus = li->status_out;
1475 if (!li->status_in)
1476 return *rstatus = 0;
1477 *rstatus = li->status_out = li->status_in;
1479 *rpts = li->l.current_pts;
1480 return 1;
1481}
1482
1484{
1485 FilterLinkInternal * const li = ff_link_internal(link);
1486 return ff_framequeue_queued_frames(&li->fifo);
1487}
1488
1490{
1491 FilterLinkInternal * const li = ff_link_internal(link);
1492 return ff_framequeue_queued_frames(&li->fifo) > 0;
1493}
1494
1496{
1497 FilterLinkInternal * const li = ff_link_internal(link);
1499}
1500
1502{
1503 FilterLinkInternal * const li = ff_link_internal(link);
1504 uint64_t samples = ff_framequeue_queued_samples(&li->fifo);
1505 av_assert1(min);
1506 return samples >= min || (li->status_in && samples);
1507}
1508
1510{
1511 AVFilterLink *const link = &li->l.pub;
1514 if (link == link->dst->inputs[0])
1516 li->l.frame_count_out++;
1517 li->l.sample_count_out += frame->nb_samples;
1518}
1519
1521{
1522 FilterLinkInternal * const li = ff_link_internal(link);
1523 AVFrame *frame;
1524
1525 *rframe = NULL;
1527 return 0;
1528
1529 if (li->fifo.samples_skipped) {
1530 frame = ff_framequeue_peek(&li->fifo, 0);
1531 return ff_inlink_consume_samples(link, frame->nb_samples, frame->nb_samples, rframe);
1532 }
1533
1535 consume_update(li, frame);
1536 *rframe = frame;
1537 return 1;
1538}
1539
1540int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max,
1541 AVFrame **rframe)
1542{
1543 FilterLinkInternal * const li = ff_link_internal(link);
1544 AVFrame *frame;
1545 int ret;
1546
1547 av_assert1(min);
1548 *rframe = NULL;
1550 return 0;
1551 if (li->status_in)
1553 ret = take_samples(li, min, max, &frame);
1554 if (ret < 0)
1555 return ret;
1556 consume_update(li, frame);
1557 *rframe = frame;
1558 return 1;
1559}
1560
1562{
1563 FilterLinkInternal * const li = ff_link_internal(link);
1564 return ff_framequeue_peek(&li->fifo, idx);
1565}
1566
1568{
1569 AVFrame *frame = *rframe;
1570 AVFrame *out;
1571 int ret;
1572
1574 return 0;
1575 av_log(link->dst, AV_LOG_DEBUG, "Copying data in avfilter.\n");
1576
1577 switch (link->type) {
1578 case AVMEDIA_TYPE_VIDEO:
1579 out = ff_get_video_buffer(link, link->w, link->h);
1580 break;
1581 case AVMEDIA_TYPE_AUDIO:
1582 out = ff_get_audio_buffer(link, frame->nb_samples);
1583 break;
1584 default:
1585 return AVERROR(EINVAL);
1586 }
1587 if (!out)
1588 return AVERROR(ENOMEM);
1589
1591 if (ret < 0) {
1593 return ret;
1594 }
1595
1596 ret = av_frame_copy(out, frame);
1597 if (ret < 0) {
1599 return ret;
1600 }
1601
1603 *rframe = out;
1604 return 0;
1605}
1606
1608{
1609 FFFilterContext *ctxi = fffilterctx(link->dst);
1610 AVFilterCommand *cmd = ctxi->command_queue;
1611
1612 while(cmd && cmd->time <= frame->pts * av_q2d(link->time_base)){
1613 av_log(link->dst, AV_LOG_DEBUG,
1614 "Processing command time:%f command:%s arg:%s\n",
1615 cmd->time, cmd->command, cmd->arg);
1616 avfilter_process_command(link->dst, cmd->command, cmd->arg, 0, 0, cmd->flags);
1617 command_queue_pop(link->dst);
1618 cmd = ctxi->command_queue;
1619 }
1620 return 0;
1621}
1622
1624{
1626 av_assert1(!li->status_in);
1627 av_assert1(!li->status_out);
1628 li->frame_wanted_out = 1;
1629 ff_filter_set_ready(link->src, 100);
1630}
1631
1632void ff_inlink_set_status(AVFilterLink *link, int status)
1633{
1634 FilterLinkInternal * const li = ff_link_internal(link);
1635 if (li->status_out)
1636 return;
1637 li->frame_wanted_out = 0;
1638 li->frame_blocked_in = 0;
1639 link_set_out_status(link, status, AV_NOPTS_VALUE);
1640 while (ff_framequeue_queued_frames(&li->fifo)) {
1643 }
1644 if (!li->status_in)
1645 li->status_in = status;
1646}
1647
1649{
1650 FilterLinkInternal * const li = ff_link_internal(link);
1651 return li->status_in;
1652}
1653
1655{
1656 FilterLinkInternal * const li_in = ff_link_internal(inlink);
1657 return ff_outlink_frame_wanted(outlink) ||
1659 li_in->status_out;
1660}
1661
1662
1664{
1665 return &avfilter_class;
1666}
1667
1669 int default_pool_size)
1670{
1671 FilterLink *l = ff_filter_link(link);
1673
1674 // Must already be set by caller.
1676
1678
1679 if (frames->initial_pool_size == 0) {
1680 // Dynamic allocation is necessarily supported.
1681 } else if (avctx->extra_hw_frames >= 0) {
1682 frames->initial_pool_size += avctx->extra_hw_frames;
1683 } else {
1684 frames->initial_pool_size = default_pool_size;
1685 }
1686
1687 return 0;
1688}
1689
1691{
1692 FilterLinkInternal * const li = ff_link_internal(link);
1693 return li->frame_wanted_out;
1694}
1695
1697 void *arg, int *ret, int nb_jobs)
1698{
1699 return fffilterctx(ctx)->execute(ctx, func, arg, ret, nb_jobs);
1700}
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
@ VAR_T
Definition aeval.c:53
static int request_frame(AVFilterLink *outlink)
Definition af_aecho.c:272
#define TFLAGS
Definition af_afade.c:66
static const int8_t filt[NUMTAPS *2]
Definition af_earwax.c:40
static FILE * out
static int frames
static AVFormatContext * ctx
AVFrame * ff_get_audio_buffer(AVFilterLink *link, int nb_samples)
Request an audio samples buffer with a specific set of permissions.
Definition audio.c:74
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
int ff_append_outpad(AVFilterContext *f, AVFilterPad *p)
Definition avfilter.c:138
static int filter_frame_to_filter(AVFilterLink *link)
Definition avfilter.c:1195
AVFilterContext * ff_filter_alloc(const AVFilter *filter, const char *inst_name)
Allocate a new filter context and return it.
Definition avfilter.c:701
int ff_inoutlink_check_flow(AVFilterLink *inlink, AVFilterLink *outlink)
Check for flow control between input and output.
Definition avfilter.c:1654
static int append_pad(unsigned *count, AVFilterPad **pads, AVFilterLink ***links, AVFilterPad *newpad)
Append a new pad.
Definition avfilter.c:100
static void tlog_ref(void *ctx, AVFrame *ref, int end)
Definition avfilter.c:47
static int default_filter_frame(AVFilterLink *link, AVFrame *frame)
Definition avfilter.c:1007
int ff_append_inpad_free_name(AVFilterContext *f, AVFilterPad *p)
Definition avfilter.c:132
static void free_link(AVFilterLink *link)
Definition avfilter.c:775
static void consume_update(FilterLinkInternal *li, const AVFrame *frame)
Definition avfilter.c:1509
void ff_inlink_set_status(AVFilterLink *link, int status)
Set the status on an input link.
Definition avfilter.c:1632
@ VAR_H
Definition avfilter.c:565
@ VAR_W
Definition avfilter.c:564
int ff_outlink_get_status(AVFilterLink *link)
Get the status on an output link.
Definition avfilter.c:1648
static void * filter_child_next(void *obj, void *prev)
Definition avfilter.c:642
int ff_inlink_acknowledge_status(AVFilterLink *link, int *rstatus, int64_t *rpts)
Test and acknowledge the change of status on the link.
Definition avfilter.c:1467
int ff_inlink_check_available_frame(AVFilterLink *link)
Test if a frame is available on the link.
Definition avfilter.c:1489
int ff_inlink_check_available_samples(AVFilterLink *link, unsigned min)
Test if enough samples are available on the link.
Definition avfilter.c:1501
int ff_filter_config_links(AVFilterContext *filter)
Negotiate the media format, dimensions, etc of all inputs to a filter.
Definition avfilter.c:328
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition avfilter.c:1068
int ff_append_inpad(AVFilterContext *f, AVFilterPad *p)
Append a new input/output pad to the filter's list of such pads.
Definition avfilter.c:127
int ff_outlink_frame_wanted(AVFilterLink *link)
Test if a frame is wanted on an output link.
Definition avfilter.c:1690
int ff_filter_init_hw_frames(AVFilterContext *avctx, AVFilterLink *link, int default_pool_size)
Perform any additional setup required for hardware frames.
Definition avfilter.c:1668
int ff_filter_process_command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
Generic processing of user supplied commands that are set in the same way as the filter options.
Definition avfilter.c:906
static int take_samples(FilterLinkInternal *li, unsigned min, unsigned max, AVFrame **rframe)
Definition avfilter.c:1134
static const AVClass avfilter_class
Definition avfilter.c:677
static int set_enable_expr(FFFilterContext *ctxi, const char *expr)
Definition avfilter.c:569
void ff_avfilter_link_set_in_status(AVFilterLink *link, int status, int64_t pts)
Set the status field of a link from the source filter.
Definition avfilter.c:250
static void link_set_out_status(AVFilterLink *link, int status, int64_t pts)
Set the status field of a link from the destination filter.
Definition avfilter.c:269
static const AVOption avfilter_options[]
Definition avfilter.c:664
size_t ff_inlink_queued_frames(AVFilterLink *link)
Get the number of frames available on the link.
Definition avfilter.c:1483
int ff_request_frame(AVFilterLink *link)
Request an input frame from the filter at the other end of the link.
Definition avfilter.c:483
int ff_filter_opt_parse(void *logctx, const AVClass *priv_class, AVDictionary **options, const char *args)
Parse filter options into a dictionary.
Definition avfilter.c:853
int ff_inlink_process_commands(AVFilterLink *link, const AVFrame *frame)
Process the commands queued in the link up to the time of the frame.
Definition avfilter.c:1607
int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
Definition avfilter.c:1696
int ff_append_outpad_free_name(AVFilterContext *f, AVFilterPad *p)
Definition avfilter.c:143
int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max, AVFrame **rframe)
Take samples from the link's FIFO and update the link's stats.
Definition avfilter.c:1540
static int filter_frame_framed(AVFilterLink *link, AVFrame *frame)
Definition avfilter.c:1036
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Definition avfilter.c:846
static int default_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
Definition avfilter.c:688
static int64_t guess_status_pts(AVFilterContext *ctx, int status, AVRational link_time_base)
Definition avfilter.c:510
AVFrame * ff_inlink_peek_frame(AVFilterLink *link, size_t idx)
Access a frame in the link fifo without consuming it.
Definition avfilter.c:1561
static const AVClass * filter_child_class_iterate(void **iter)
Definition avfilter.c:650
void ff_filter_set_ready(AVFilterContext *filter, unsigned priority)
Mark a filter ready and schedule it for activation.
Definition avfilter.c:229
static void filter_unblock(AVFilterContext *filter)
Clear frame_blocked_in on all outputs.
Definition avfilter.c:239
int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe)
Make sure a frame is writable.
Definition avfilter.c:1567
int ff_inlink_consume_frame(AVFilterLink *link, AVFrame **rframe)
Take a frame from the link's FIFO and update the link's stats.
Definition avfilter.c:1520
static int evaluate_timeline_at_frame(AVFilterLink *link, const AVFrame *frame)
Evaluate the timeline expression of the link for the time and properties of the frame.
Definition avfilter.c:1018
static int filter_activate_default(AVFilterContext *filter)
Definition avfilter.c:1263
#define OFFSET(x)
Definition avfilter.c:661
static void command_queue_pop(AVFilterContext *filter)
Definition avfilter.c:81
static const char * default_filter_name(void *filter_ctx)
Definition avfilter.c:636
static int request_frame_to_filter(AVFilterLink *link)
Definition avfilter.c:532
int ff_inlink_queued_samples(AVFilterLink *link)
Definition avfilter.c:1495
void ff_inlink_request_frame(AVFilterLink *link)
Mark that a frame is wanted on the link.
Definition avfilter.c:1623
int ff_filter_activate(AVFilterContext *filter)
Definition avfilter.c:1451
static int samples_ready(FilterLinkInternal *link, unsigned min)
Definition avfilter.c:1127
static void update_link_current_pts(FilterLinkInternal *li, int64_t pts)
Definition avfilter.c:216
static int forward_status_change(AVFilterContext *filter, FilterLinkInternal *li_in)
Definition avfilter.c:1228
static void link_free(AVFilterLink **link)
Definition avfilter.c:198
Main libavfilter public API header.
static FFFilterContext * fffilterctx(AVFilterContext *ctx)
void ff_filter_graph_remove_filter(AVFilterGraph *graph, AVFilterContext *filter)
Remove a filter from a graph;.
static FFFilterGraph * fffiltergraph(AVFilterGraph *graph)
void ff_avfilter_graph_update_heap(AVFilterGraph *graph, struct FilterLinkInternal *li)
Update the position of a link in the age heap.
#define ff_tlog_link(ctx, link, end)
#define FF_TPRINTF_START(ctx, func)
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
Definition avstring.c:103
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition bprint.c:69
AVBPrint public header.
#define AV_BPRINT_SIZE_UNLIMITED
static BitStreamFilterLinkInternal * ff_link_internal(AVBitStreamFilterLink *link)
refcounted data buffer API
#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
Public libavutil channel layout APIs header.
#define FLAGS
Definition cmdutils.c:598
common internal and external API header
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
static __device__ float fabs(float a)
#define min(a, b)
#define max(a, b)
static AVFrame * frame
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
Definition dolby_e.c:1067
void av_expr_free(AVExpr *e)
Free a parsed expression previously created with av_expr_parse().
Definition eval.c:368
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
Evaluate a previously parsed expression.
Definition eval.c:824
int av_expr_parse(AVExpr **expr, const char *s, const char *const *const_names, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), int log_offset, void *log_ctx)
Parse an expression.
Definition eval.c:735
double value
Definition eval.c:102
simple arithmetic expression evaluator
const char * key
void ff_channel_layouts_changeref(AVFilterChannelLayouts **oldref, AVFilterChannelLayouts **newref)
Definition formats.c:825
void ff_channel_layouts_unref(AVFilterChannelLayouts **ref)
Remove a reference to a channel layouts list.
Definition formats.c:807
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:795
void ff_formats_changeref(AVFilterFormats **oldref, AVFilterFormats **newref)
Definition formats.c:831
reference-counted frame API
AVFrame * ff_framequeue_take(FFFrameQueue *fq)
Take the first frame in the queue.
Definition framequeue.c:104
void ff_framequeue_init(FFFrameQueue *fq, FFFrameQueueGlobal *fqg)
Init a frame queue and attach it to a global structure.
Definition framequeue.c:50
int ff_framequeue_add(FFFrameQueue *fq, AVFrame *frame)
Add a frame.
Definition framequeue.c:67
void ff_framequeue_free(FFFrameQueue *fq)
Free the queue and all queued frames.
Definition framequeue.c:57
AVFrame * ff_framequeue_peek(FFFrameQueue *fq, size_t idx)
Access a frame in the queue, without removing it.
Definition framequeue.c:122
void ff_framequeue_skip_samples(FFFrameQueue *fq, size_t samples, AVRational time_base)
Skip samples from the first frame in the queue.
Definition framequeue.c:133
static size_t ff_framequeue_queued_frames(const FFFrameQueue *fq)
Get the number of queued frames.
Definition framequeue.h:158
static uint64_t ff_framequeue_queued_samples(const FFFrameQueue *fq)
Get the number of queued samples.
Definition framequeue.h:166
#define fail
Definition test.h:479
#define AV_OPT_FLAG_FILTERING_PARAM
A generic parameter which can be set by the user for filtering.
Definition opt.h:380
#define AV_OPT_FLAG_RUNTIME_PARAM
A generic parameter which can be set by the user at runtime.
Definition opt.h:376
@ 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
#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
Some filters support a generic "enable" expression option that can be used to enable or disable a fil...
Definition avfilter.h:196
int avfilter_init_str(AVFilterContext *filter, const char *args)
Initialize a filter with the supplied parameters.
Definition avfilter.c:960
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:800
enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx)
Get the type of an AVFilterPad.
Definition avfilter.c:993
unsigned avfilter_filter_pad_count(const AVFilter *filter, int is_output)
Get the number of elements in an AVFilter's inputs or outputs array.
Definition avfilter.c:631
int avfilter_action_func(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
A function pointer passed to the AVFilterGraph::execute callback to be executed multiple times,...
Definition avfilter.h:544
const char * avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx)
Get the name of an AVFilterPad.
Definition avfilter.c:988
const AVFilter * av_filter_iterate(void **opaque)
Iterate over all registered filters.
Definition allfilters.c:642
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:610
AVBufferRef * avfilter_link_get_hw_frames_ctx(AVFilterLink *link)
Get the hardware frames context of a filter link.
Definition avfilter.c:998
#define AVFILTER_THREAD_SLICE
Process multiple parts of the frame concurrently.
Definition avfilter.h:270
int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options)
Initialize a filter with the supplied dictionary of options.
Definition avfilter.c:919
#define AVFILTER_FLAG_SUPPORT_TIMELINE
Handy mask to test whether the filter supports or no the timeline feature (internally or generically)...
Definition avfilter.h:209
int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad)
Link two filters together.
Definition avfilter.c:149
const AVClass * avfilter_get_class(void)
Definition avfilter.c:1663
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
Definition avfilter.h:166
int av_channel_layout_describe_bprint(const AVChannelLayout *channel_layout, AVBPrint *bp)
bprint variant of av_channel_layout_describe().
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_describe(const AVChannelLayout *channel_layout, char *buf, size_t buf_size)
Get a human-readable string describing the channel layout properties.
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition bprint.c:235
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
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition buffer.c:103
#define AV_DICT_MULTIKEY
Allow to store several equal keys in the dictionary.
Definition dict.h:84
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition dict.c:233
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
Definition dict.c:42
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
Definition dict.h:79
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
#define AV_DICT_DONT_STRDUP_KEY
Take ownership of a key that's been allocated with av_malloc() or another memory allocation function.
Definition dict.h:77
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition error.h:64
#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 AVERROR_OPTION_NOT_FOUND
Option not found.
Definition error.h:63
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition frame.h:695
#define AV_FRAME_FLAG_TOP_FIELD_FIRST
A flag to mark frames where the top field is displayed first if the content is interlaced.
Definition frame.h:700
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition frame.h:687
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:139
int av_frame_is_writable(AVFrame *frame)
Check if the frame data is writable.
Definition frame.c:535
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition frame.c:599
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:254
int av_frame_copy(AVFrame *dst, const AVFrame *src)
Copy the frame data from src to dst.
Definition frame.c:711
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_VERBOSE
Detailed information.
Definition log.h:226
#define AV_LOG_INFO
Standard information.
Definition log.h:221
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition rational.h:104
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition mem.c:217
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
Definition mem.c:302
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
AVMediaType
Definition avutil.h:198
static void * av_x_if_null(const void *p, const void *x)
Return x default pointer in case p is NULL.
Definition avutil.h:311
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
char av_get_picture_type_char(enum AVPictureType pict_type)
Return a single letter to describe the given picture type pict_type.
Definition utils.c:40
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
@ AV_SAMPLE_FMT_NONE
Definition samplefmt.h:56
int av_samples_copy(uint8_t *const *dst, uint8_t *const *src, int dst_offset, int src_offset, int nb_samples, int nb_channels, enum AVSampleFormat sample_fmt)
Copy samples from src to dst.
Definition samplefmt.c:222
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition avutil.h:247
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition avutil.h:263
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
int av_opt_get_key_value(const char **ropts, const char *key_val_sep, const char *pairs_sep, unsigned flags, char **rkey, char **rval)
Extract a key-value pair from the beginning of a string.
Definition opt.c:1953
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition opt.h:604
const AVOption * av_opt_find2(void *obj, const char *name, const char *unit, int opt_flags, int search_flags, void **target_obj)
Look for an option in an object.
Definition opt.c:2075
void av_opt_free(void *obj)
Free all allocated objects in obj.
Definition opt.c:2027
void av_opt_set_defaults(void *s)
Set the values of all AVOption fields to their default values.
Definition opt.c:1756
const AVOption * av_opt_next(const void *obj, const AVOption *last)
Iterate over all AVOptions belonging to obj.
Definition opt.c:47
@ AV_OPT_FLAG_IMPLICIT_KEY
Accept to parse a value without a key; the key will then be returned as NULL.
Definition opt.h:723
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
Definition opt.c:889
int av_opt_set_dict2(void *obj, AVDictionary **options, int search_flags)
Set all the options from a given dictionary on an object.
Definition opt.c:2040
#define r
Definition input.c:42
unsigned offset
Definition libaomenc.c:763
int(* func)(AVBPrint *dst, const char *in, const char *arg)
Definition jacosubdec.c:66
const char * arg
Definition jacosubdec.c:65
#define AVFILTERPAD_FLAG_NEEDS_WRITABLE
The filter expects writable frames from its input link, duplicating data buffers if needed.
Definition filters.h:59
#define FF_FILTER_FLAG_HWFRAME_AWARE
The filter is aware of hardware frames, and any hardware frame context should not be automatically pr...
Definition filters.h:208
#define AVFILTERPAD_FLAG_FREE_NAME
The pad's name is allocated and should be freed generically.
Definition filters.h:64
#define FFERROR_NOT_READY
Filters implementation helper functions and internal structures.
Definition filters.h:34
static FilterLink * ff_filter_link(AVFilterLink *link)
Definition filters.h:199
static const FFFilter * fffilter(const AVFilter *f)
Definition filters.h:464
av_cold void ff_frame_pool_uninit(FFFramePool *pool)
Deallocate the frame pool.
Definition framepool.c:215
#define av_unused
Definition attributes.h:164
common internal API header
@ AV_CLASS_STATE_INITIALIZED
Object initialization has finished and it is now in the 'runtime' stage.
Definition log.h:56
@ AV_CLASS_CATEGORY_FILTER
Definition log.h:36
#define FFMIN(a, b)
Definition macros.h:49
#define FFMAX(a, b)
Definition macros.h:47
#define NAN
void * av_calloc(size_t nmemb, size_t size)
Definition mem.c:264
Memory handling functions.
@ VAR_N
Definition noise.c:47
@ VAR_VARS_NB
Definition noise.c:59
static const char *const var_names[]
Definition noise.c:30
#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
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
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AVCOL_SPC_UNSPECIFIED
Definition pixfmt.h:709
Utilities for rational number calculation.
A reference to a data buffer.
Definition buffer.h:82
uint8_t * data
The data buffer.
Definition buffer.h:90
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
Definition log.h:76
char * key
Definition dict.h:91
Definition eval.c:171
An instance of a filter.
Definition avfilter.h:273
const AVClass * av_class
needed for av_log() and filters common options
Definition avfilter.h:274
int extra_hw_frames
Sets the number of extra hardware frames which the filter will allocate on its output links for use i...
Definition avfilter.h:352
char * name
name of this filter instance
Definition avfilter.h:278
unsigned nb_inputs
number of input pads
Definition avfilter.h:282
AVFilterLink ** inputs
array of pointers to input links
Definition avfilter.h:281
char * enable_str
enable expression string
Definition avfilter.h:317
const AVFilter * filter
the AVFilter of which this is an instance
Definition avfilter.h:276
AVFilterPad * input_pads
array of input pads
Definition avfilter.h:280
void * priv
private data for use by the filter
Definition avfilter.h:288
unsigned nb_outputs
number of output pads
Definition avfilter.h:286
AVFilterPad * output_pads
array of output pads
Definition avfilter.h:284
int is_disabled
MUST NOT be accessed from outside avfilter.
Definition avfilter.h:323
AVFilterLink ** outputs
array of pointers to output links
Definition avfilter.h:285
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
A filter pad used for either input or output.
Definition filters.h:40
int flags
A combination of AVFILTERPAD_FLAG_* flags.
Definition filters.h:69
int(* request_frame)(AVFilterLink *link)
Frame request callback.
Definition filters.h:104
int(* config_props)(AVFilterLink *link)
Link configuration callback.
Definition filters.h:120
enum AVMediaType type
AVFilterPad type.
Definition filters.h:51
const char * name
Pad name.
Definition filters.h:46
Filter definition.
Definition avfilter.h:215
const char * name
Filter name.
Definition avfilter.h:219
int flags
A combination of AVFILTER_FLAG_*.
Definition avfilter.h:259
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
uint8_t ** extended_data
pointers to the data planes/channels.
Definition frame.h:533
This struct describes a set or pool of "hardware" frames (i.e.
Definition hwcontext.h:118
AVOption.
Definition opt.h:428
int offset
Native access only.
Definition opt.h:443
const char * name
Definition opt.h:429
enum AVOptionType type
Definition opt.h:444
uint64_t flags
Combination of AV_PIX_FMT_FLAG_... flags.
Definition pixdesc.h:94
Rational number (pair of numerator and denominator).
Definition rational.h:58
int num
Numerator.
Definition rational.h:59
int den
Denominator.
Definition rational.h:60
struct AVFilterCommand * command_queue
struct AVExpr * enable
parsed expression
AVFilterContext p
The public AVFilterContext.
double * var_values
variable values for the enable expression
unsigned ready
Ready status of the filter.
avfilter_execute_func * execute
avfilter_execute_func * thread_execute
AVFilter p
The public AVFilter.
Definition filters.h:271
int(* init)(AVFilterContext *ctx)
Filter initialization function.
Definition filters.h:325
uint8_t nb_inputs
The number of entries in the list of inputs.
Definition filters.h:276
uint8_t nb_outputs
The number of entries in the list of outputs.
Definition filters.h:281
void(* uninit)(AVFilterContext *ctx)
Filter uninitialization function.
Definition filters.h:337
int(* process_command)(AVFilterContext *, const char *cmd, const char *arg, char *res, int res_len, int flags)
Make the filter instance process a command.
Definition filters.h:447
int(* preinit)(AVFilterContext *ctx)
Filter pre-initialization function.
Definition filters.h:302
int(* activate)(AVFilterContext *ctx)
Filter activation function.
Definition filters.h:461
int priv_size
size of private data to allocate for the filter
Definition filters.h:431
Structure to hold global options and statistics for frame queues.
Definition framequeue.h:44
size_t queued
Total number of queued frames in the queues combined.
Definition framequeue.h:54
size_t max_queued
Maximum number of allowed frames in the queues combined.
Definition framequeue.h:49
FFFrameQueueGlobal * global
Pointer to the global frame queue struct holding statistics and limits.
Definition framequeue.h:65
int samples_skipped
Indicate that samples are skipped.
Definition framequeue.h:118
int64_t status_in_pts
Timestamp of the input status change.
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.
FFFrameQueue fifo
Queue of frames waiting to be filtered.
enum FilterLinkInternal::@336377057131212365164072214263227110225222156364 init_state
stage of the initialization of the link properties (dimensions, etc)
int frame_blocked_in
If set, the source filter can not generate a frame as is.
FFFramePool frame_pool
Pool of frames used for allocations.
int status_out
Link output status.
#define av_free(p)
#define av_mallocz(s)
#define av_freep(p)
#define ff_tlog(a,...)
#define av_log(a,...)
static void error(const char *err)
void(* filter)(uint8_t *src, ptrdiff_t stride, int qscale)
Definition h263dsp.c:29
#define src
Definition vp8dsp.c:248
static int ref[MAX_W *MAX_W]
static FilteringContext * filter_ctx
Definition transcode.c:52
static int64_t pts
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition video.c:89
static double c[64]