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.chroma_locations)
320 &filt->outputs[filt_dstpad_idx]->outcfg.chroma_locations);
321 if (link->outcfg.samplerates)
323 &filt->outputs[filt_dstpad_idx]->outcfg.samplerates);
324 if (link->outcfg.channel_layouts)
326 &filt->outputs[filt_dstpad_idx]->outcfg.channel_layouts);
327
328 return 0;
329}
330
332{
333 int (*config_link)(AVFilterLink *);
334 unsigned i;
335 int ret;
336
337 for (i = 0; i < filter->nb_inputs; i ++) {
338 AVFilterLink *link = filter->inputs[i];
339 AVFilterLink *inlink;
341 FilterLinkInternal *li_in;
342
343 if (!link) continue;
344 if (!link->src || !link->dst) {
346 "Not all input and output are properly linked (%d).\n", i);
347 return AVERROR(EINVAL);
348 }
349
350 inlink = link->src->nb_inputs ? link->src->inputs[0] : NULL;
351 li_in = inlink ? ff_link_internal(inlink) : NULL;
352 li->l.current_pts =
354
355 switch (li->init_state) {
356 case AVLINK_INIT:
357 continue;
358 case AVLINK_STARTINIT:
359 av_log(filter, AV_LOG_INFO, "circular filter chain detected\n");
360 return 0;
361 case AVLINK_UNINIT:
362 li->init_state = AVLINK_STARTINIT;
363
364 if ((ret = ff_filter_config_links(link->src)) < 0)
365 return ret;
366
367 if (!(config_link = link->srcpad->config_props)) {
368 if (link->src->nb_inputs != 1) {
369 av_log(link->src, AV_LOG_ERROR, "Source filters and filters "
370 "with more than one input "
371 "must set config_props() "
372 "callbacks on all outputs\n");
373 return AVERROR(EINVAL);
374 }
375 }
376
377 /* Copy side data before link->srcpad->config_props() is called, so the filter
378 * may remove it for the next filter in the chain */
379 if (inlink && inlink->nb_side_data && !link->nb_side_data) {
380 for (int j = 0; j < inlink->nb_side_data; j++) {
382 inlink->side_data[j], 0);
383 if (ret < 0) {
385 return ret;
386 }
387 }
388 }
389
390 if (config_link && (ret = config_link(link)) < 0) {
391 av_log(link->src, AV_LOG_ERROR,
392 "Failed to configure output pad on %s\n",
393 link->src->name);
394 return ret;
395 }
396
397 switch (link->type) {
399 if (!link->time_base.num && !link->time_base.den)
400 link->time_base = inlink ? inlink->time_base : AV_TIME_BASE_Q;
401
402 if (!link->sample_aspect_ratio.num && !link->sample_aspect_ratio.den)
403 link->sample_aspect_ratio = inlink ?
404 inlink->sample_aspect_ratio : (AVRational){1,1};
405
406 if (inlink) {
407 if (!li->l.frame_rate.num && !li->l.frame_rate.den)
408 li->l.frame_rate = li_in->l.frame_rate;
409 if (!link->w)
410 link->w = inlink->w;
411 if (!link->h)
412 link->h = inlink->h;
413 } else if (!link->w || !link->h) {
414 av_log(link->src, AV_LOG_ERROR,
415 "Video source filters must set their output link's "
416 "width and height\n");
417 return AVERROR(EINVAL);
418 }
419 break;
420
422 if (inlink) {
423 if (!link->time_base.num && !link->time_base.den)
424 link->time_base = inlink->time_base;
425 }
426
427 if (!link->time_base.num && !link->time_base.den)
428 link->time_base = (AVRational) {1, link->sample_rate};
429 }
430
431 if (link->src->nb_inputs &&
432 !(fffilter(link->src->filter)->flags_internal & FF_FILTER_FLAG_HWFRAME_AWARE)) {
433 FilterLink *l0 = ff_filter_link(link->src->inputs[0]);
434
436 "should not be set by non-hwframe-aware filter");
437
438 if (l0->hw_frames_ctx) {
440 if (!li->l.hw_frames_ctx)
441 return AVERROR(ENOMEM);
442 }
443 }
444
445 if ((config_link = link->dstpad->config_props))
446 if ((ret = config_link(link)) < 0) {
447 av_log(link->dst, AV_LOG_ERROR,
448 "Failed to configure input pad on %s\n",
449 link->dst->name);
450 return ret;
451 }
452
453 li->init_state = AVLINK_INIT;
454 }
455 }
456
457 return 0;
458}
459
460#ifdef TRACE
461void ff_tlog_link(void *ctx, AVFilterLink *link, int end)
462{
463 if (link->type == AVMEDIA_TYPE_VIDEO) {
464 ff_tlog(ctx,
465 "link[%p s:%dx%d fmt:%s %s->%s]%s",
466 link, link->w, link->h,
468 link->src ? link->src->filter->name : "",
469 link->dst ? link->dst->filter->name : "",
470 end ? "\n" : "");
471 } else {
472 char buf[128];
473 av_channel_layout_describe(&link->ch_layout, buf, sizeof(buf));
474
475 ff_tlog(ctx,
476 "link[%p r:%d cl:%s fmt:%s %s->%s]%s",
477 link, (int)link->sample_rate, buf,
479 link->src ? link->src->filter->name : "",
480 link->dst ? link->dst->filter->name : "",
481 end ? "\n" : "");
482 }
483}
484#endif
485
487{
488 FilterLinkInternal * const li = ff_link_internal(link);
489
491
493 if (li->status_out)
494 return li->status_out;
495 if (li->status_in) {
498 av_assert1(fffilterctx(link->dst)->ready >= 300);
499 return 0;
500 } else {
501 /* Acknowledge status change. Filters using ff_request_frame() will
502 handle the change automatically. Filters can also check the
503 status directly but none do yet. */
505 return li->status_out;
506 }
507 }
508 li->frame_wanted_out = 1;
509 ff_filter_set_ready(link->src, 100);
510 return 0;
511}
512
513static int64_t guess_status_pts(AVFilterContext *ctx, int status, AVRational link_time_base)
514{
515 unsigned i;
516 int64_t r = INT64_MAX;
517
518 for (i = 0; i < ctx->nb_inputs; i++) {
519 FilterLinkInternal * const li = ff_link_internal(ctx->inputs[i]);
520 if (li->status_out == status)
521 r = FFMIN(r, av_rescale_q(li->l.current_pts, ctx->inputs[i]->time_base, link_time_base));
522 }
523 if (r < INT64_MAX)
524 return r;
525 av_log(ctx, AV_LOG_WARNING, "EOF timestamp not reliable\n");
526 for (i = 0; i < ctx->nb_inputs; i++) {
527 FilterLinkInternal * const li = ff_link_internal(ctx->inputs[i]);
528 r = FFMIN(r, av_rescale_q(li->status_in_pts, ctx->inputs[i]->time_base, link_time_base));
529 }
530 if (r < INT64_MAX)
531 return r;
532 return AV_NOPTS_VALUE;
533}
534
536{
537 FilterLinkInternal * const li = ff_link_internal(link);
538 int ret = -1;
539
541 /* Assume the filter is blocked, let the method clear it if not */
542 li->frame_blocked_in = 1;
543 if (link->srcpad->request_frame)
544 ret = link->srcpad->request_frame(link);
545 else if (link->src->inputs[0])
546 ret = ff_request_frame(link->src->inputs[0]);
547 if (ret < 0) {
548 if (ret != AVERROR(EAGAIN) && ret != li->status_in)
549 ff_avfilter_link_set_in_status(link, ret, guess_status_pts(link->src, ret, link->time_base));
550 if (ret == AVERROR_EOF)
551 ret = 0;
552 }
553 return ret;
554}
555
556static const char *const var_names[] = {
557 "t",
558 "n",
559 "w",
560 "h",
561 NULL
562};
563
564enum {
570};
571
572static int set_enable_expr(FFFilterContext *ctxi, const char *expr)
573{
574 AVFilterContext *ctx = &ctxi->p;
575 int ret;
576 char *expr_dup;
577 AVExpr *old = ctxi->enable;
578
579 if (!(ctx->filter->flags & AVFILTER_FLAG_SUPPORT_TIMELINE)) {
580 av_log(ctx, AV_LOG_ERROR, "Timeline ('enable' option) not supported "
581 "with filter '%s'\n", ctx->filter->name);
583 }
584
585 expr_dup = av_strdup(expr);
586 if (!expr_dup)
587 return AVERROR(ENOMEM);
588
589 if (!ctxi->var_values) {
590 ctxi->var_values = av_calloc(VAR_VARS_NB, sizeof(*ctxi->var_values));
591 if (!ctxi->var_values) {
592 av_free(expr_dup);
593 return AVERROR(ENOMEM);
594 }
595 }
596
597 ret = av_expr_parse(&ctxi->enable, expr_dup, var_names,
598 NULL, NULL, NULL, NULL, 0, ctx->priv);
599 if (ret < 0) {
600 av_log(ctx->priv, AV_LOG_ERROR,
601 "Error when evaluating the expression '%s' for enable\n",
602 expr_dup);
603 av_free(expr_dup);
604 return ret;
605 }
606
607 av_expr_free(old);
608 av_free(ctx->enable_str);
609 ctx->enable_str = expr_dup;
610 return 0;
611}
612
613int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags)
614{
615 if(!strcmp(cmd, "ping")){
616 char local_res[256] = {0};
617
618 if (!res) {
619 res = local_res;
620 res_len = sizeof(local_res);
621 }
622 av_strlcatf(res, res_len, "pong from:%s %s\n", filter->filter->name, filter->name);
623 if (res == local_res)
624 av_log(filter, AV_LOG_INFO, "%s", res);
625 return 0;
626 }else if(!strcmp(cmd, "enable")) {
628 }else if (fffilter(filter->filter)->process_command) {
629 return fffilter(filter->filter)->process_command(filter, cmd, arg, res, res_len, flags);
630 }
631 return AVERROR(ENOSYS);
632}
633
634unsigned avfilter_filter_pad_count(const AVFilter *filter, int is_output)
635{
636 return is_output ? fffilter(filter)->nb_outputs : fffilter(filter)->nb_inputs;
637}
638
639static const char *default_filter_name(void *filter_ctx)
640{
642 return ctx->name ? ctx->name : ctx->filter->name;
643}
644
645static void *filter_child_next(void *obj, void *prev)
646{
648 if (!prev && ctx->filter && ctx->filter->priv_class && ctx->priv)
649 return ctx->priv;
650 return NULL;
651}
652
653static const AVClass *filter_child_class_iterate(void **iter)
654{
655 const AVFilter *f;
656
657 while ((f = av_filter_iterate(iter)))
658 if (f->priv_class)
659 return f->priv_class;
660
661 return NULL;
662}
663
664#define OFFSET(x) offsetof(AVFilterContext, x)
665#define FLAGS AV_OPT_FLAG_FILTERING_PARAM
666#define TFLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
667static const AVOption avfilter_options[] = {
668 { "thread_type", "Allowed thread types", OFFSET(thread_type), AV_OPT_TYPE_FLAGS,
669 { .i64 = AVFILTER_THREAD_SLICE }, 0, INT_MAX, FLAGS, .unit = "thread_type" },
670 { "slice", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVFILTER_THREAD_SLICE }, .flags = FLAGS, .unit = "thread_type" },
671 { "enable", "set enable expression", OFFSET(enable_str), AV_OPT_TYPE_STRING, {.str=NULL}, .flags = TFLAGS },
672 { "threads", "Allowed number of threads", OFFSET(nb_threads), AV_OPT_TYPE_INT,
673 { .i64 = 0 }, 0, INT_MAX, FLAGS, .unit = "threads" },
674 {"auto", "autodetect a suitable number of threads to use", 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, .flags = FLAGS, .unit = "threads"},
675 { "extra_hw_frames", "Number of extra hardware frames to allocate for the user",
676 OFFSET(extra_hw_frames), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, FLAGS },
677 { NULL },
678};
679
680static const AVClass avfilter_class = {
681 .class_name = "AVFilter",
682 .item_name = default_filter_name,
683 .version = LIBAVUTIL_VERSION_INT,
684 .category = AV_CLASS_CATEGORY_FILTER,
685 .child_next = filter_child_next,
686 .child_class_iterate = filter_child_class_iterate,
687 .option = avfilter_options,
688 .state_flags_offset = offsetof(FFFilterContext, state_flags),
689};
690
692 int *ret, int nb_jobs)
693{
694 int i;
695
696 for (i = 0; i < nb_jobs; i++) {
697 int r = func(ctx, arg, i, nb_jobs);
698 if (ret)
699 ret[i] = r;
700 }
701 return 0;
702}
703
704AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name)
705{
707 AVFilterContext *ret;
708 const FFFilter *const fi = fffilter(filter);
709 int preinited = 0;
710
711 if (!filter)
712 return NULL;
713
714 ctx = av_mallocz(sizeof(*ctx));
715 if (!ctx)
716 return NULL;
717 ret = &ctx->p;
718
719 ret->av_class = &avfilter_class;
720 ret->filter = filter;
721 ret->name = inst_name ? av_strdup(inst_name) : NULL;
722 if (fi->priv_size) {
723 ret->priv = av_mallocz(fi->priv_size);
724 if (!ret->priv)
725 goto err;
726 }
727 if (fi->preinit) {
728 if (fi->preinit(ret) < 0)
729 goto err;
730 preinited = 1;
731 }
732
734 if (filter->priv_class) {
735 *(const AVClass**)ret->priv = filter->priv_class;
737 }
738
739 ctx->execute = default_execute;
740
741 ret->nb_inputs = fi->nb_inputs;
742 if (ret->nb_inputs ) {
743 ret->input_pads = av_memdup(filter->inputs, ret->nb_inputs * sizeof(*filter->inputs));
744 if (!ret->input_pads)
745 goto err;
746 ret->inputs = av_calloc(ret->nb_inputs, sizeof(*ret->inputs));
747 if (!ret->inputs)
748 goto err;
749 }
750
751 ret->nb_outputs = fi->nb_outputs;
752 if (ret->nb_outputs) {
753 ret->output_pads = av_memdup(filter->outputs, ret->nb_outputs * sizeof(*filter->outputs));
754 if (!ret->output_pads)
755 goto err;
756 ret->outputs = av_calloc(ret->nb_outputs, sizeof(*ret->outputs));
757 if (!ret->outputs)
758 goto err;
759 }
760
761 return ret;
762
763err:
764 if (preinited)
765 fi->uninit(ret);
766 av_freep(&ret->name);
767 av_freep(&ret->inputs);
768 av_freep(&ret->input_pads);
769 ret->nb_inputs = 0;
770 av_freep(&ret->outputs);
771 av_freep(&ret->output_pads);
772 ret->nb_outputs = 0;
773 av_freep(&ret->priv);
774 av_free(ret);
775 return NULL;
776}
777
778static void free_link(AVFilterLink *link)
779{
780 if (!link)
781 return;
782
783 if (link->src)
784 link->src->outputs[link->srcpad - link->src->output_pads] = NULL;
785 if (link->dst)
786 link->dst->inputs[link->dstpad - link->dst->input_pads] = NULL;
787
802 link_free(&link);
803}
804
806{
807 FFFilterContext *ctxi;
808 int i;
809
810 if (!filter)
811 return;
812 ctxi = fffilterctx(filter);
813
814 if (filter->graph)
816
817 if (fffilter(filter->filter)->uninit)
818 fffilter(filter->filter)->uninit(filter);
819
820 for (i = 0; i < filter->nb_inputs; i++) {
821 free_link(filter->inputs[i]);
822 if (filter->input_pads[i].flags & AVFILTERPAD_FLAG_FREE_NAME)
823 av_freep(&filter->input_pads[i].name);
824 }
825 for (i = 0; i < filter->nb_outputs; i++) {
826 free_link(filter->outputs[i]);
827 if (filter->output_pads[i].flags & AVFILTERPAD_FLAG_FREE_NAME)
828 av_freep(&filter->output_pads[i].name);
829 }
830
831 if (filter->filter->priv_class)
832 av_opt_free(filter->priv);
833
834 av_buffer_unref(&filter->hw_device_ctx);
835
836 av_freep(&filter->name);
837 av_freep(&filter->input_pads);
838 av_freep(&filter->output_pads);
839 av_freep(&filter->inputs);
840 av_freep(&filter->outputs);
841 av_freep(&filter->priv);
842 while (ctxi->command_queue)
845 av_expr_free(ctxi->enable);
846 ctxi->enable = NULL;
847 av_freep(&ctxi->var_values);
849}
850
852{
853 if (ctx->nb_threads > 0)
854 return FFMIN(ctx->nb_threads, ctx->graph->nb_threads);
855 return ctx->graph->nb_threads;
856}
857
858int ff_filter_opt_parse(void *logctx, const AVClass *priv_class,
859 AVDictionary **options, const char *args)
860{
861 const AVOption *o = NULL;
862 int ret;
863 int offset= -1;
864
865 if (!args)
866 return 0;
867
868 while (*args) {
869 char *parsed_key, *value;
870 const char *key;
871 const char *shorthand = NULL;
872 int additional_flags = 0;
873
874 if (priv_class && (o = av_opt_next(&priv_class, o))) {
875 if (o->type == AV_OPT_TYPE_CONST || o->offset == offset)
876 continue;
877 offset = o->offset;
878 shorthand = o->name;
879 }
880
881 ret = av_opt_get_key_value(&args, "=", ":",
882 shorthand ? AV_OPT_FLAG_IMPLICIT_KEY : 0,
883 &parsed_key, &value);
884 if (ret < 0) {
885 if (ret == AVERROR(EINVAL))
886 av_log(logctx, AV_LOG_ERROR, "No option name near '%s'\n", args);
887 else
888 av_log(logctx, AV_LOG_ERROR, "Unable to parse '%s': %s\n", args,
889 av_err2str(ret));
890 return ret;
891 }
892 if (*args)
893 args++;
894 if (parsed_key) {
895 key = parsed_key;
896 additional_flags = AV_DICT_DONT_STRDUP_KEY;
897 priv_class = NULL; /* reject all remaining shorthand */
898 } else {
899 key = shorthand;
900 }
901
902 av_log(logctx, AV_LOG_DEBUG, "Setting '%s' to value '%s'\n", key, value);
903
905 additional_flags | AV_DICT_DONT_STRDUP_VAL | AV_DICT_MULTIKEY);
906 }
907
908 return 0;
909}
910
912 const char *arg, char *res, int res_len, int flags)
913{
914 const AVOption *o;
915
916 if (!ctx->filter->priv_class)
917 return 0;
919 if (!o)
920 return AVERROR(ENOSYS);
921 return av_opt_set(ctx->priv, cmd, arg, 0);
922}
923
925{
927 int ret = 0;
928
930 av_log(ctx, AV_LOG_ERROR, "Filter already initialized\n");
931 return AVERROR(EINVAL);
932 }
933
935 if (ret < 0) {
936 av_log(ctx, AV_LOG_ERROR, "Error applying generic filter options.\n");
937 return ret;
938 }
939
940 if (ctx->filter->flags & AVFILTER_FLAG_SLICE_THREADS &&
941 ctx->thread_type & ctx->graph->thread_type & AVFILTER_THREAD_SLICE &&
942 fffiltergraph(ctx->graph)->thread_execute) {
943 ctx->thread_type = AVFILTER_THREAD_SLICE;
944 ctxi->execute = fffiltergraph(ctx->graph)->thread_execute;
945 } else {
946 ctx->thread_type = 0;
947 }
948
949 if (fffilter(ctx->filter)->init)
950 ret = fffilter(ctx->filter)->init(ctx);
951 if (ret < 0)
952 return ret;
953
954 if (ctx->enable_str) {
955 ret = set_enable_expr(ctxi, ctx->enable_str);
956 if (ret < 0)
957 return ret;
958 }
959
961
962 return 0;
963}
964
966{
968 const AVDictionaryEntry *e;
969 int ret = 0;
970
971 if (args && *args) {
972 ret = ff_filter_opt_parse(filter, filter->filter->priv_class, &options, args);
973 if (ret < 0)
974 goto fail;
975 }
976
978 if (ret < 0)
979 goto fail;
980
981 if ((e = av_dict_iterate(options, NULL))) {
982 av_log(filter, AV_LOG_ERROR, "No such option: %s.\n", e->key);
984 goto fail;
985 }
986
987fail:
989
990 return ret;
991}
992
993const char *avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx)
994{
995 return pads[pad_idx].name;
996}
997
998enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx)
999{
1000 return pads[pad_idx].type;
1001}
1002
1004{
1005 FilterLink *plink = ff_filter_link(link);
1006 if (plink->hw_frames_ctx)
1007 return av_buffer_ref(plink->hw_frames_ctx);
1008
1009 return NULL;
1010}
1011
1013{
1014 return ff_filter_frame(link->dst->outputs[0], frame);
1015}
1016
1017/**
1018 * Evaluate the timeline expression of the link for the time and properties
1019 * of the frame.
1020 * @return >0 if enabled, 0 if disabled
1021 * @note It does not update link->dst->is_disabled.
1022 */
1024{
1025 FilterLink *l = ff_filter_link(link);
1026 AVFilterContext *dstctx = link->dst;
1027 FFFilterContext *dsti = fffilterctx(dstctx);
1028 int64_t pts = frame->pts;
1029
1030 if (!dstctx->enable_str)
1031 return 1;
1032
1033 dsti->var_values[VAR_N] = l->frame_count_out;
1034 dsti->var_values[VAR_T] = pts == AV_NOPTS_VALUE ? NAN : pts * av_q2d(link->time_base);
1035 dsti->var_values[VAR_W] = link->w;
1036 dsti->var_values[VAR_H] = link->h;
1037
1038 return fabs(av_expr_eval(dsti->enable, dsti->var_values, NULL)) >= 0.5;
1039}
1040
1042{
1043 FilterLink *l = ff_filter_link(link);
1044 int (*filter_frame)(AVFilterLink *, AVFrame *);
1045 AVFilterContext *dstctx = link->dst;
1046 AVFilterPad *dst = link->dstpad;
1047 int ret;
1048
1049 if (!(filter_frame = dst->filter_frame))
1051
1052 if (dst->flags & AVFILTERPAD_FLAG_NEEDS_WRITABLE) {
1054 if (ret < 0)
1055 goto fail;
1056 }
1057
1060
1061 if (dstctx->is_disabled &&
1064 ret = filter_frame(link, frame);
1065 l->frame_count_out++;
1066 return ret;
1067
1068fail:
1070 return ret;
1071}
1072
1074{
1075 FilterLinkInternal * const li = ff_link_internal(link);
1076 int ret;
1078
1079 /* Consistency checks */
1080 if (link->type == AVMEDIA_TYPE_VIDEO) {
1081 if (strcmp(link->dst->filter->name, "buffersink") &&
1082 strcmp(link->dst->filter->name, "format") &&
1083 strcmp(link->dst->filter->name, "idet") &&
1084 strcmp(link->dst->filter->name, "null") &&
1085 strcmp(link->dst->filter->name, "scale") &&
1086 strcmp(link->dst->filter->name, "libplacebo") &&
1087 strcmp(link->dst->filter->name, "hqdn3d")) {
1088 av_assert1(frame->format == link->format);
1089 av_assert1(frame->width == link->w);
1090 av_assert1(frame->height == link->h);
1092 av_assert1(frame->alpha_mode == link->alpha_mode);
1093 }
1094 } else {
1095 if (frame->format != link->format) {
1096 av_log(link->dst, AV_LOG_ERROR, "Format change is not supported\n");
1097 goto error;
1098 }
1099 if (av_channel_layout_compare(&frame->ch_layout, &link->ch_layout)) {
1100 av_log(link->dst, AV_LOG_ERROR, "Channel layout change is not supported\n");
1101 goto error;
1102 }
1103 if (frame->sample_rate != link->sample_rate) {
1104 av_log(link->dst, AV_LOG_ERROR, "Sample rate change is not supported\n");
1105 goto error;
1106 }
1107
1108 frame->duration = av_rescale_q(frame->nb_samples, (AVRational){ 1, frame->sample_rate },
1109 link->time_base);
1110 }
1111
1112 li->frame_blocked_in = li->frame_wanted_out = 0;
1113 li->l.frame_count_in++;
1114 li->l.sample_count_in += frame->nb_samples;
1115 filter_unblock(link->dst);
1116 ret = ff_framequeue_add(&li->fifo, frame);
1117 if (ret < 0) {
1118 const FFFrameQueueGlobal *global = li->fifo.global;
1119 if (ret == AVERROR(ENOMEM) && global->queued >= global->max_queued)
1120 av_log(link->dst, AV_LOG_ERROR, "Exhausted frame queue capacity (%zu frames)\n", global->max_queued);
1122 return ret;
1123 }
1124 ff_filter_set_ready(link->dst, 300);
1125 return 0;
1126
1127error:
1129 return AVERROR_PATCHWELCOME;
1130}
1131
1132static int samples_ready(FilterLinkInternal *link, unsigned min)
1133{
1134 return ff_framequeue_queued_frames(&link->fifo) &&
1136 link->status_in);
1137}
1138
1139static int take_samples(FilterLinkInternal *li, unsigned min, unsigned max,
1140 AVFrame **rframe)
1141{
1142 FilterLink *l = &li->l;
1143 AVFilterLink *link = &l->pub;
1144 AVFrame *frame0, *frame, *buf;
1145 unsigned nb_samples, nb_frames, i, p;
1146 int ret;
1147
1148 /* Note: this function relies on no format changes and must only be
1149 called with enough samples. */
1151 frame0 = frame = ff_framequeue_peek(&li->fifo, 0);
1152 if (!li->fifo.samples_skipped && frame->nb_samples >= min && frame->nb_samples <= max) {
1153 *rframe = ff_framequeue_take(&li->fifo);
1154 return 0;
1155 }
1156 nb_frames = 0;
1157 nb_samples = 0;
1158 while (1) {
1159 if (nb_samples + frame->nb_samples > max) {
1160 if (nb_samples < min)
1161 nb_samples = max;
1162 break;
1163 }
1164 nb_samples += frame->nb_samples;
1165 nb_frames++;
1166 if (nb_frames == ff_framequeue_queued_frames(&li->fifo))
1167 break;
1168 frame = ff_framequeue_peek(&li->fifo, nb_frames);
1169 }
1170
1171 buf = ff_get_audio_buffer(link, nb_samples);
1172 if (!buf)
1173 return AVERROR(ENOMEM);
1174 ret = av_frame_copy_props(buf, frame0);
1175 if (ret < 0) {
1176 av_frame_free(&buf);
1177 return ret;
1178 }
1179
1180 p = 0;
1181 for (i = 0; i < nb_frames; i++) {
1183 av_samples_copy(buf->extended_data, frame->extended_data, p, 0,
1184 frame->nb_samples, link->ch_layout.nb_channels, link->format);
1185 p += frame->nb_samples;
1187 }
1188 if (p < nb_samples) {
1189 unsigned n = nb_samples - p;
1190 frame = ff_framequeue_peek(&li->fifo, 0);
1191 av_samples_copy(buf->extended_data, frame->extended_data, p, 0, n,
1192 link->ch_layout.nb_channels, link->format);
1194 }
1195
1196 *rframe = buf;
1197 return 0;
1198}
1199
1201{
1202 FilterLinkInternal * const li = ff_link_internal(link);
1203 AVFrame *frame = NULL;
1204 AVFilterContext *dst = link->dst;
1205 int ret;
1206
1208 ret = li->l.min_samples ?
1211 av_assert1(ret);
1212 if (ret < 0) {
1213 av_assert1(!frame);
1214 return ret;
1215 }
1216 /* The filter will soon have received a new frame, that may allow it to
1217 produce one or more: unblock its outputs. */
1219 /* AVFilterPad.filter_frame() expect frame_count_out to have the value
1220 before the frame; filter_frame_framed() will re-increment it. */
1221 li->l.frame_count_out--;
1222 ret = filter_frame_framed(link, frame);
1223 if (ret < 0 && ret != li->status_out) {
1225 } else {
1226 /* Run once again, to see if several frames were available, or if
1227 the input status has also changed, or any other reason. */
1229 }
1230 return ret;
1231}
1232
1234{
1235 AVFilterLink *in = &li_in->l.pub;
1236 unsigned out = 0, progress = 0;
1237 int ret;
1238
1239 av_assert0(!li_in->status_out);
1240 if (!filter->nb_outputs) {
1241 /* not necessary with the current API and sinks */
1242 return 0;
1243 }
1244 while (!li_in->status_out) {
1245 FilterLinkInternal *li_out = ff_link_internal(filter->outputs[out]);
1246
1247 if (!li_out->status_in) {
1248 progress++;
1249 ret = request_frame_to_filter(filter->outputs[out]);
1250 if (ret < 0)
1251 return ret;
1252 }
1253 if (++out == filter->nb_outputs) {
1254 if (!progress) {
1255 /* Every output already closed: input no longer interesting
1256 (example: overlay in shortest mode, other input closed). */
1257 link_set_out_status(in, li_in->status_in, li_in->status_in_pts);
1258 return 0;
1259 }
1260 progress = 0;
1261 out = 0;
1262 }
1263 }
1265 return 0;
1266}
1267
1269{
1270 unsigned i;
1271 int nb_eofs = 0;
1272
1273 for (i = 0; i < filter->nb_outputs; i++)
1274 nb_eofs += ff_outlink_get_status(filter->outputs[i]) == AVERROR_EOF;
1275 if (filter->nb_outputs && nb_eofs == filter->nb_outputs) {
1276 for (int j = 0; j < filter->nb_inputs; j++)
1278 return 0;
1279 }
1280
1281 for (i = 0; i < filter->nb_inputs; i++) {
1283 if (samples_ready(li, li->l.min_samples)) {
1284 return filter_frame_to_filter(filter->inputs[i]);
1285 }
1286 }
1287 for (i = 0; i < filter->nb_inputs; i++) {
1288 FilterLinkInternal * const li = ff_link_internal(filter->inputs[i]);
1289 if (li->status_in && !li->status_out) {
1291 return forward_status_change(filter, li);
1292 }
1293 }
1294 for (i = 0; i < filter->nb_outputs; i++) {
1295 FilterLinkInternal * const li = ff_link_internal(filter->outputs[i]);
1296 if (li->frame_wanted_out &&
1297 !li->frame_blocked_in) {
1298 return request_frame_to_filter(filter->outputs[i]);
1299 }
1300 }
1301 for (i = 0; i < filter->nb_outputs; i++) {
1302 FilterLinkInternal * const li = ff_link_internal(filter->outputs[i]);
1303 if (li->frame_wanted_out)
1304 return request_frame_to_filter(filter->outputs[i]);
1305 }
1306 if (!filter->nb_outputs) {
1307 ff_inlink_request_frame(filter->inputs[0]);
1308 return 0;
1309 }
1310 return FFERROR_NOT_READY;
1311}
1312
1313/*
1314 Filter scheduling and activation
1315
1316 When a filter is activated, it must:
1317 - if possible, output a frame;
1318 - else, if relevant, forward the input status change;
1319 - else, check outputs for wanted frames and forward the requests.
1320
1321 The following AVFilterLink fields are used for activation:
1322
1323 - frame_wanted_out:
1324
1325 This field indicates if a frame is needed on this input of the
1326 destination filter. A positive value indicates that a frame is needed
1327 to process queued frames or internal data or to satisfy the
1328 application; a zero value indicates that a frame is not especially
1329 needed but could be processed anyway; a negative value indicates that a
1330 frame would just be queued.
1331
1332 It is set by filters using ff_request_frame() or ff_request_no_frame(),
1333 when requested by the application through a specific API or when it is
1334 set on one of the outputs.
1335
1336 It is cleared when a frame is sent from the source using
1337 ff_filter_frame().
1338
1339 It is also cleared when a status change is sent from the source using
1340 ff_avfilter_link_set_in_status().
1341
1342 - frame_blocked_in:
1343
1344 This field means that the source filter can not generate a frame as is.
1345 Its goal is to avoid repeatedly calling the request_frame() method on
1346 the same link.
1347
1348 It is set by the framework on all outputs of a filter before activating it.
1349
1350 It is automatically cleared by ff_filter_frame().
1351
1352 It is also automatically cleared by ff_avfilter_link_set_in_status().
1353
1354 It is also cleared on all outputs (using filter_unblock()) when
1355 something happens on an input: processing a frame or changing the
1356 status.
1357
1358 - fifo:
1359
1360 Contains the frames queued on a filter input. If it contains frames and
1361 frame_wanted_out is not set, then the filter can be activated. If that
1362 result in the filter not able to use these frames, the filter must set
1363 frame_wanted_out to ask for more frames.
1364
1365 - status_in and status_in_pts:
1366
1367 Status (EOF or error code) of the link and timestamp of the status
1368 change (in link time base, same as frames) as seen from the input of
1369 the link. The status change is considered happening after the frames
1370 queued in fifo.
1371
1372 It is set by the source filter using ff_avfilter_link_set_in_status().
1373
1374 - status_out:
1375
1376 Status of the link as seen from the output of the link. The status
1377 change is considered having already happened.
1378
1379 It is set by the destination filter using
1380 link_set_out_status().
1381
1382 Filters are activated according to the ready field, set using the
1383 ff_filter_set_ready(). Eventually, a priority queue will be used.
1384 ff_filter_set_ready() is called whenever anything could cause progress to
1385 be possible. Marking a filter ready when it is not is not a problem,
1386 except for the small overhead it causes.
1387
1388 Conditions that cause a filter to be marked ready are:
1389
1390 - frames added on an input link;
1391
1392 - changes in the input or output status of an input link;
1393
1394 - requests for a frame on an output link;
1395
1396 - after any actual processing using the legacy methods (filter_frame(),
1397 and request_frame() to acknowledge status changes), to run once more
1398 and check if enough input was present for several frames.
1399
1400 Examples of scenarios to consider:
1401
1402 - buffersrc: activate if frame_wanted_out to notify the application;
1403 activate when the application adds a frame to push it immediately.
1404
1405 - testsrc: activate only if frame_wanted_out to produce and push a frame.
1406
1407 - concat (not at stitch points): can process a frame on any output.
1408 Activate if frame_wanted_out on output to forward on the corresponding
1409 input. Activate when a frame is present on input to process it
1410 immediately.
1411
1412 - framesync: needs at least one frame on each input; extra frames on the
1413 wrong input will accumulate. When a frame is first added on one input,
1414 set frame_wanted_out<0 on it to avoid getting more (would trigger
1415 testsrc) and frame_wanted_out>0 on the other to allow processing it.
1416
1417 Activation of old filters:
1418
1419 In order to activate a filter implementing the legacy filter_frame() and
1420 request_frame() methods, perform the first possible of the following
1421 actions:
1422
1423 - If an input has frames in fifo and frame_wanted_out == 0, dequeue a
1424 frame and call filter_frame().
1425
1426 Rationale: filter frames as soon as possible instead of leaving them
1427 queued; frame_wanted_out < 0 is not possible since the old API does not
1428 set it nor provides any similar feedback; frame_wanted_out > 0 happens
1429 when min_samples > 0 and there are not enough samples queued.
1430
1431 - If an input has status_in set but not status_out, try to call
1432 request_frame() on one of the outputs in the hope that it will trigger
1433 request_frame() on the input with status_in and acknowledge it. This is
1434 awkward and fragile, filters with several inputs or outputs should be
1435 updated to direct activation as soon as possible.
1436
1437 - If an output has frame_wanted_out > 0 and not frame_blocked_in, call
1438 request_frame().
1439
1440 Rationale: checking frame_blocked_in is necessary to avoid requesting
1441 repeatedly on a blocked input if another is not blocked (example:
1442 [buffersrc1][testsrc1][buffersrc2][testsrc2]concat=v=2).
1443
1444 - If an output has frame_wanted_out > 0 call request_frame().
1445
1446 Rationale: even if all inputs are blocked an activate callback should
1447 request a frame on some if its inputs if a frame is requested on any of
1448 its output.
1449
1450 - Request a frame on the input for sinks.
1451
1452 Rationale: sinks using the old api have no way to request a frame on their
1453 input, so we need to do it for them.
1454 */
1455
1457{
1459 const FFFilter *const fi = fffilter(filter->filter);
1460 int ret;
1461
1462 /* Generic timeline support is not yet implemented but should be easy */
1464 fi->activate));
1465 ctxi->ready = 0;
1467 if (ret == FFERROR_NOT_READY)
1468 ret = 0;
1469 return ret;
1470}
1471
1473{
1474 FilterLinkInternal * const li = ff_link_internal(link);
1475 *rpts = li->l.current_pts;
1477 return *rstatus = 0;
1478 if (li->status_out)
1479 return *rstatus = li->status_out;
1480 if (!li->status_in)
1481 return *rstatus = 0;
1482 *rstatus = li->status_out = li->status_in;
1484 *rpts = li->l.current_pts;
1485 return 1;
1486}
1487
1489{
1490 FilterLinkInternal * const li = ff_link_internal(link);
1491 return ff_framequeue_queued_frames(&li->fifo);
1492}
1493
1495{
1496 FilterLinkInternal * const li = ff_link_internal(link);
1497 return ff_framequeue_queued_frames(&li->fifo) > 0;
1498}
1499
1501{
1502 FilterLinkInternal * const li = ff_link_internal(link);
1504}
1505
1507{
1508 FilterLinkInternal * const li = ff_link_internal(link);
1509 uint64_t samples = ff_framequeue_queued_samples(&li->fifo);
1510 av_assert1(min);
1511 return samples >= min || (li->status_in && samples);
1512}
1513
1515{
1516 AVFilterLink *const link = &li->l.pub;
1519 if (link == link->dst->inputs[0])
1521 li->l.frame_count_out++;
1522 li->l.sample_count_out += frame->nb_samples;
1523}
1524
1526{
1527 FilterLinkInternal * const li = ff_link_internal(link);
1528 AVFrame *frame;
1529
1530 *rframe = NULL;
1532 return 0;
1533
1534 if (li->fifo.samples_skipped) {
1535 frame = ff_framequeue_peek(&li->fifo, 0);
1536 return ff_inlink_consume_samples(link, frame->nb_samples, frame->nb_samples, rframe);
1537 }
1538
1540 consume_update(li, frame);
1541 *rframe = frame;
1542 return 1;
1543}
1544
1545int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max,
1546 AVFrame **rframe)
1547{
1548 FilterLinkInternal * const li = ff_link_internal(link);
1549 AVFrame *frame;
1550 int ret;
1551
1552 av_assert1(min);
1553 *rframe = NULL;
1555 return 0;
1556 if (li->status_in)
1558 ret = take_samples(li, min, max, &frame);
1559 if (ret < 0)
1560 return ret;
1561 consume_update(li, frame);
1562 *rframe = frame;
1563 return 1;
1564}
1565
1567{
1568 FilterLinkInternal * const li = ff_link_internal(link);
1569 return ff_framequeue_peek(&li->fifo, idx);
1570}
1571
1573{
1574 AVFrame *frame = *rframe;
1575 AVFrame *out;
1576 int ret;
1577
1579 return 0;
1580 av_log(link->dst, AV_LOG_DEBUG, "Copying data in avfilter.\n");
1581
1582 switch (link->type) {
1583 case AVMEDIA_TYPE_VIDEO:
1584 out = ff_get_video_buffer(link, link->w, link->h);
1585 break;
1586 case AVMEDIA_TYPE_AUDIO:
1587 out = ff_get_audio_buffer(link, frame->nb_samples);
1588 break;
1589 default:
1590 return AVERROR(EINVAL);
1591 }
1592 if (!out)
1593 return AVERROR(ENOMEM);
1594
1596 if (ret < 0) {
1598 return ret;
1599 }
1600
1601 ret = av_frame_copy(out, frame);
1602 if (ret < 0) {
1604 return ret;
1605 }
1606
1608 *rframe = out;
1609 return 0;
1610}
1611
1613{
1614 FFFilterContext *ctxi = fffilterctx(link->dst);
1615 AVFilterCommand *cmd = ctxi->command_queue;
1616
1617 while(cmd && cmd->time <= frame->pts * av_q2d(link->time_base)){
1618 av_log(link->dst, AV_LOG_DEBUG,
1619 "Processing command time:%f command:%s arg:%s\n",
1620 cmd->time, cmd->command, cmd->arg);
1621 avfilter_process_command(link->dst, cmd->command, cmd->arg, 0, 0, cmd->flags);
1622 command_queue_pop(link->dst);
1623 cmd = ctxi->command_queue;
1624 }
1625 return 0;
1626}
1627
1629{
1631 av_assert1(!li->status_in);
1632 av_assert1(!li->status_out);
1633 li->frame_wanted_out = 1;
1634 ff_filter_set_ready(link->src, 100);
1635}
1636
1637void ff_inlink_set_status(AVFilterLink *link, int status)
1638{
1639 FilterLinkInternal * const li = ff_link_internal(link);
1640 if (li->status_out)
1641 return;
1642 li->frame_wanted_out = 0;
1643 li->frame_blocked_in = 0;
1644 link_set_out_status(link, status, AV_NOPTS_VALUE);
1645 while (ff_framequeue_queued_frames(&li->fifo)) {
1648 }
1649 if (!li->status_in)
1650 li->status_in = status;
1651}
1652
1654{
1655 FilterLinkInternal * const li = ff_link_internal(link);
1656 return li->status_in;
1657}
1658
1660{
1661 FilterLinkInternal * const li_in = ff_link_internal(inlink);
1662 return ff_outlink_frame_wanted(outlink) ||
1664 li_in->status_out;
1665}
1666
1667
1669{
1670 return &avfilter_class;
1671}
1672
1674 int default_pool_size)
1675{
1676 FilterLink *l = ff_filter_link(link);
1678
1679 // Must already be set by caller.
1681
1683
1684 if (frames->initial_pool_size == 0) {
1685 // Dynamic allocation is necessarily supported.
1686 } else if (avctx->extra_hw_frames >= 0) {
1687 frames->initial_pool_size += avctx->extra_hw_frames;
1688 } else {
1689 frames->initial_pool_size = default_pool_size;
1690 }
1691
1692 return 0;
1693}
1694
1696{
1697 FilterLinkInternal * const li = ff_link_internal(link);
1698 return li->frame_wanted_out;
1699}
1700
1702 void *arg, int *ret, int nb_jobs)
1703{
1704 return fffilterctx(ctx)->execute(ctx, func, arg, ret, nb_jobs);
1705}
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:97
@ 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:1200
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_inoutlink_check_flow(AVFilterLink *inlink, AVFilterLink *outlink)
Check for flow control between input and output.
Definition avfilter.c:1659
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:1012
int ff_append_inpad_free_name(AVFilterContext *f, AVFilterPad *p)
Definition avfilter.c:132
static void free_link(AVFilterLink *link)
Definition avfilter.c:778
static void consume_update(FilterLinkInternal *li, const AVFrame *frame)
Definition avfilter.c:1514
void ff_inlink_set_status(AVFilterLink *link, int status)
Set the status on an input link.
Definition avfilter.c:1637
@ VAR_H
Definition avfilter.c:568
@ VAR_W
Definition avfilter.c:567
int ff_outlink_get_status(AVFilterLink *link)
Get the status on an output link.
Definition avfilter.c:1653
static void * filter_child_next(void *obj, void *prev)
Definition avfilter.c:645
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:1472
int ff_inlink_check_available_frame(AVFilterLink *link)
Test if a frame is available on the link.
Definition avfilter.c:1494
int ff_inlink_check_available_samples(AVFilterLink *link, unsigned min)
Test if enough samples are available on the link.
Definition avfilter.c:1506
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_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition avfilter.c:1073
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:1695
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:1673
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:911
static int take_samples(FilterLinkInternal *li, unsigned min, unsigned max, AVFrame **rframe)
Definition avfilter.c:1139
static const AVClass avfilter_class
Definition avfilter.c:680
static int set_enable_expr(FFFilterContext *ctxi, const char *expr)
Definition avfilter.c:572
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:667
size_t ff_inlink_queued_frames(AVFilterLink *link)
Get the number of frames available on the link.
Definition avfilter.c:1488
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_opt_parse(void *logctx, const AVClass *priv_class, AVDictionary **options, const char *args)
Parse filter options into a dictionary.
Definition avfilter.c:858
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:1612
int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
Definition avfilter.c:1701
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:1545
static int filter_frame_framed(AVFilterLink *link, AVFrame *frame)
Definition avfilter.c:1041
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Definition avfilter.c:851
static int default_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
Definition avfilter.c:691
static int64_t guess_status_pts(AVFilterContext *ctx, int status, AVRational link_time_base)
Definition avfilter.c:513
AVFrame * ff_inlink_peek_frame(AVFilterLink *link, size_t idx)
Access a frame in the link fifo without consuming it.
Definition avfilter.c:1566
static const AVClass * filter_child_class_iterate(void **iter)
Definition avfilter.c:653
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:1572
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:1525
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:1023
static int filter_activate_default(AVFilterContext *filter)
Definition avfilter.c:1268
#define OFFSET(x)
Definition avfilter.c:664
static void command_queue_pop(AVFilterContext *filter)
Definition avfilter.c:81
static const char * default_filter_name(void *filter_ctx)
Definition avfilter.c:639
static int request_frame_to_filter(AVFilterLink *link)
Definition avfilter.c:535
int ff_inlink_queued_samples(AVFilterLink *link)
Definition avfilter.c:1500
void ff_inlink_request_frame(AVFilterLink *link)
Mark that a frame is wanted on the link.
Definition avfilter.c:1628
int ff_filter_activate(AVFilterContext *filter)
Definition avfilter.c:1456
static int samples_ready(FilterLinkInternal *link, unsigned min)
Definition avfilter.c:1132
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:1233
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:68
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:596
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:845
void ff_channel_layouts_unref(AVFilterChannelLayouts **ref)
Remove a reference to a channel layouts list.
Definition formats.c:827
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
void ff_formats_changeref(AVFilterFormats **oldref, AVFilterFormats **newref)
Definition formats.c:851
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:202
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
enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx)
Get the type of an AVFilterPad.
Definition avfilter.c:998
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:634
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:555
const char * avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx)
Get the name of an AVFilterPad.
Definition avfilter.c:993
const AVFilter * av_filter_iterate(void **opaque)
Iterate over all registered filters.
Definition allfilters.c:643
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
AVBufferRef * avfilter_link_get_hw_frames_ctx(AVFilterLink *link)
Get the hardware frames context of a filter link.
Definition avfilter.c:1003
#define AVFILTER_THREAD_SLICE
Process multiple parts of the frame concurrently.
Definition avfilter.h:276
int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options)
Initialize a filter with the supplied dictionary of options.
Definition avfilter.c:924
#define AVFILTER_FLAG_SUPPORT_TIMELINE
Handy mask to test whether the filter supports or no the timeline feature (internally or generically)...
Definition avfilter.h:215
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:1668
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
Definition avfilter.h:172
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:234
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:140
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition buffer.c:104
#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:702
#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:707
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition frame.h:694
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:140
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:255
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:318
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
Definition mem.c:408
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:52
@ 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:223
#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:1955
#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:2077
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
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:891
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:2042
#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:370
Memory handling functions.
static const char * obj
Definition mscl.c:57
@ 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:3404
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3484
#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:714
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:279
const AVClass * av_class
needed for av_log() and filters common options
Definition avfilter.h:280
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:358
char * name
name of this filter instance
Definition avfilter.h:284
unsigned nb_inputs
number of input pads
Definition avfilter.h:288
AVFilterLink ** inputs
array of pointers to input links
Definition avfilter.h:287
char * enable_str
enable expression string
Definition avfilter.h:323
const AVFilter * filter
the AVFilter of which this is an instance
Definition avfilter.h:282
AVFilterPad * input_pads
array of input pads
Definition avfilter.h:286
void * priv
private data for use by the filter
Definition avfilter.h:294
unsigned nb_outputs
number of output pads
Definition avfilter.h:292
AVFilterPad * output_pads
array of output pads
Definition avfilter.h:290
int is_disabled
MUST NOT be accessed from outside avfilter.
Definition avfilter.h:329
AVFilterLink ** outputs
array of pointers to output links
Definition avfilter.h:291
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
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:221
const char * name
Filter name.
Definition avfilter.h:225
int flags
A combination of AVFILTER_FLAG_*.
Definition avfilter.h:265
This structure describes decoded (raw) audio or video data.
Definition frame.h:479
uint8_t ** extended_data
pointers to the data planes/channels.
Definition frame.h:540
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:90
static double c[64]