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->cfg_format = link->format;
454 li->cfg_w = link->w;
455 li->cfg_h = link->h;
456 li->init_state = AVLINK_INIT;
457 }
458 }
459
460 return 0;
461}
462
463#ifdef TRACE
464void ff_tlog_link(void *ctx, AVFilterLink *link, int end)
465{
466 if (link->type == AVMEDIA_TYPE_VIDEO) {
467 ff_tlog(ctx,
468 "link[%p s:%dx%d fmt:%s %s->%s]%s",
469 link, link->w, link->h,
471 link->src ? link->src->filter->name : "",
472 link->dst ? link->dst->filter->name : "",
473 end ? "\n" : "");
474 } else {
475 char buf[128];
476 av_channel_layout_describe(&link->ch_layout, buf, sizeof(buf));
477
478 ff_tlog(ctx,
479 "link[%p r:%d cl:%s fmt:%s %s->%s]%s",
480 link, (int)link->sample_rate, buf,
482 link->src ? link->src->filter->name : "",
483 link->dst ? link->dst->filter->name : "",
484 end ? "\n" : "");
485 }
486}
487#endif
488
490{
491 FilterLinkInternal * const li = ff_link_internal(link);
492
494
496 if (li->status_out)
497 return li->status_out;
498 if (li->status_in) {
501 av_assert1(fffilterctx(link->dst)->ready >= 300);
502 return 0;
503 } else {
504 /* Acknowledge status change. Filters using ff_request_frame() will
505 handle the change automatically. Filters can also check the
506 status directly but none do yet. */
508 return li->status_out;
509 }
510 }
511 li->frame_wanted_out = 1;
512 ff_filter_set_ready(link->src, 100);
513 return 0;
514}
515
516static int64_t guess_status_pts(AVFilterContext *ctx, int status, AVRational link_time_base)
517{
518 unsigned i;
519 int64_t r = INT64_MAX;
520
521 for (i = 0; i < ctx->nb_inputs; i++) {
522 FilterLinkInternal * const li = ff_link_internal(ctx->inputs[i]);
523 if (li->status_out == status)
524 r = FFMIN(r, av_rescale_q(li->l.current_pts, ctx->inputs[i]->time_base, link_time_base));
525 }
526 if (r < INT64_MAX)
527 return r;
528 av_log(ctx, AV_LOG_WARNING, "EOF timestamp not reliable\n");
529 for (i = 0; i < ctx->nb_inputs; i++) {
530 FilterLinkInternal * const li = ff_link_internal(ctx->inputs[i]);
531 r = FFMIN(r, av_rescale_q(li->status_in_pts, ctx->inputs[i]->time_base, link_time_base));
532 }
533 if (r < INT64_MAX)
534 return r;
535 return AV_NOPTS_VALUE;
536}
537
539{
540 FilterLinkInternal * const li = ff_link_internal(link);
541 int ret = -1;
542
544 /* Assume the filter is blocked, let the method clear it if not */
545 li->frame_blocked_in = 1;
546 if (link->srcpad->request_frame)
547 ret = link->srcpad->request_frame(link);
548 else if (link->src->inputs[0])
549 ret = ff_request_frame(link->src->inputs[0]);
550 if (ret < 0) {
551 if (ret != AVERROR(EAGAIN) && ret != li->status_in)
552 ff_avfilter_link_set_in_status(link, ret, guess_status_pts(link->src, ret, link->time_base));
553 if (ret == AVERROR_EOF)
554 ret = 0;
555 }
556 return ret;
557}
558
559static const char *const var_names[] = {
560 "t",
561 "n",
562 "w",
563 "h",
564 NULL
565};
566
567enum {
573};
574
575static int set_enable_expr(FFFilterContext *ctxi, const char *expr)
576{
577 AVFilterContext *ctx = &ctxi->p;
578 int ret;
579 char *expr_dup;
580 AVExpr *old = ctxi->enable;
581
582 if (!(ctx->filter->flags & AVFILTER_FLAG_SUPPORT_TIMELINE)) {
583 av_log(ctx, AV_LOG_ERROR, "Timeline ('enable' option) not supported "
584 "with filter '%s'\n", ctx->filter->name);
586 }
587
588 expr_dup = av_strdup(expr);
589 if (!expr_dup)
590 return AVERROR(ENOMEM);
591
592 if (!ctxi->var_values) {
593 ctxi->var_values = av_calloc(VAR_VARS_NB, sizeof(*ctxi->var_values));
594 if (!ctxi->var_values) {
595 av_free(expr_dup);
596 return AVERROR(ENOMEM);
597 }
598 }
599
600 ret = av_expr_parse(&ctxi->enable, expr_dup, var_names,
601 NULL, NULL, NULL, NULL, 0, ctx->priv);
602 if (ret < 0) {
603 av_log(ctx->priv, AV_LOG_ERROR,
604 "Error when evaluating the expression '%s' for enable\n",
605 expr_dup);
606 av_free(expr_dup);
607 return ret;
608 }
609
610 av_expr_free(old);
611 av_free(ctx->enable_str);
612 ctx->enable_str = expr_dup;
613 return 0;
614}
615
616int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags)
617{
618 if(!strcmp(cmd, "ping")){
619 char local_res[256] = {0};
620
621 if (!res) {
622 res = local_res;
623 res_len = sizeof(local_res);
624 }
625 av_strlcatf(res, res_len, "pong from:%s %s\n", filter->filter->name, filter->name);
626 if (res == local_res)
627 av_log(filter, AV_LOG_INFO, "%s", res);
628 return 0;
629 }else if(!strcmp(cmd, "enable")) {
631 }else if (fffilter(filter->filter)->process_command) {
632 return fffilter(filter->filter)->process_command(filter, cmd, arg, res, res_len, flags);
633 }
634 return AVERROR(ENOSYS);
635}
636
637unsigned avfilter_filter_pad_count(const AVFilter *filter, int is_output)
638{
639 return is_output ? fffilter(filter)->nb_outputs : fffilter(filter)->nb_inputs;
640}
641
642static const char *default_filter_name(void *filter_ctx)
643{
645 return ctx->name ? ctx->name : ctx->filter->name;
646}
647
648static void *filter_child_next(void *obj, void *prev)
649{
651 if (!prev && ctx->filter && ctx->filter->priv_class && ctx->priv)
652 return ctx->priv;
653 return NULL;
654}
655
656static const AVClass *filter_child_class_iterate(void **iter)
657{
658 const AVFilter *f;
659
660 while ((f = av_filter_iterate(iter)))
661 if (f->priv_class)
662 return f->priv_class;
663
664 return NULL;
665}
666
667#define OFFSET(x) offsetof(AVFilterContext, x)
668#define FLAGS AV_OPT_FLAG_FILTERING_PARAM
669#define TFLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
670static const AVOption avfilter_options[] = {
671 { "thread_type", "Allowed thread types", OFFSET(thread_type), AV_OPT_TYPE_FLAGS,
672 { .i64 = AVFILTER_THREAD_SLICE }, 0, INT_MAX, FLAGS, .unit = "thread_type" },
673 { "slice", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVFILTER_THREAD_SLICE }, .flags = FLAGS, .unit = "thread_type" },
674 { "enable", "set enable expression", OFFSET(enable_str), AV_OPT_TYPE_STRING, {.str=NULL}, .flags = TFLAGS },
675 { "threads", "Allowed number of threads", OFFSET(nb_threads), AV_OPT_TYPE_INT,
676 { .i64 = 0 }, 0, INT_MAX, FLAGS, .unit = "threads" },
677 {"auto", "autodetect a suitable number of threads to use", 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, .flags = FLAGS, .unit = "threads"},
678 { "extra_hw_frames", "Number of extra hardware frames to allocate for the user",
679 OFFSET(extra_hw_frames), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, FLAGS },
680 { NULL },
681};
682
683static const AVClass avfilter_class = {
684 .class_name = "AVFilter",
685 .item_name = default_filter_name,
686 .version = LIBAVUTIL_VERSION_INT,
687 .category = AV_CLASS_CATEGORY_FILTER,
688 .child_next = filter_child_next,
689 .child_class_iterate = filter_child_class_iterate,
690 .option = avfilter_options,
691 .state_flags_offset = offsetof(FFFilterContext, state_flags),
692};
693
695 int *ret, int nb_jobs)
696{
697 int i;
698
699 for (i = 0; i < nb_jobs; i++) {
700 int r = func(ctx, arg, i, nb_jobs);
701 if (ret)
702 ret[i] = r;
703 }
704 return 0;
705}
706
707AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name)
708{
710 AVFilterContext *ret;
711 const FFFilter *const fi = fffilter(filter);
712 int preinited = 0;
713
714 if (!filter)
715 return NULL;
716
717 ctx = av_mallocz(sizeof(*ctx));
718 if (!ctx)
719 return NULL;
720 ret = &ctx->p;
721
722 ret->av_class = &avfilter_class;
723 ret->filter = filter;
724 ret->name = inst_name ? av_strdup(inst_name) : NULL;
725 if (fi->priv_size) {
726 ret->priv = av_mallocz(fi->priv_size);
727 if (!ret->priv)
728 goto err;
729 }
730 if (fi->preinit) {
731 if (fi->preinit(ret) < 0)
732 goto err;
733 preinited = 1;
734 }
735
737 if (filter->priv_class) {
738 *(const AVClass**)ret->priv = filter->priv_class;
740 }
741
742 ctx->execute = default_execute;
743
744 ret->nb_inputs = fi->nb_inputs;
745 if (ret->nb_inputs ) {
746 ret->input_pads = av_memdup(filter->inputs, ret->nb_inputs * sizeof(*filter->inputs));
747 if (!ret->input_pads)
748 goto err;
749 ret->inputs = av_calloc(ret->nb_inputs, sizeof(*ret->inputs));
750 if (!ret->inputs)
751 goto err;
752 }
753
754 ret->nb_outputs = fi->nb_outputs;
755 if (ret->nb_outputs) {
756 ret->output_pads = av_memdup(filter->outputs, ret->nb_outputs * sizeof(*filter->outputs));
757 if (!ret->output_pads)
758 goto err;
759 ret->outputs = av_calloc(ret->nb_outputs, sizeof(*ret->outputs));
760 if (!ret->outputs)
761 goto err;
762 }
763
764 return ret;
765
766err:
767 if (preinited)
768 fi->uninit(ret);
769 av_freep(&ret->name);
770 av_freep(&ret->inputs);
771 av_freep(&ret->input_pads);
772 ret->nb_inputs = 0;
773 av_freep(&ret->outputs);
774 av_freep(&ret->output_pads);
775 ret->nb_outputs = 0;
776 av_freep(&ret->priv);
777 av_free(ret);
778 return NULL;
779}
780
781static void free_link(AVFilterLink *link)
782{
783 if (!link)
784 return;
785
786 if (link->src)
787 link->src->outputs[link->srcpad - link->src->output_pads] = NULL;
788 if (link->dst)
789 link->dst->inputs[link->dstpad - link->dst->input_pads] = NULL;
790
805 link_free(&link);
806}
807
809{
810 FFFilterContext *ctxi;
811 int i;
812
813 if (!filter)
814 return;
815 ctxi = fffilterctx(filter);
816
817 if (filter->graph)
819
820 if (fffilter(filter->filter)->uninit)
821 fffilter(filter->filter)->uninit(filter);
822
823 for (i = 0; i < filter->nb_inputs; i++) {
824 free_link(filter->inputs[i]);
825 if (filter->input_pads[i].flags & AVFILTERPAD_FLAG_FREE_NAME)
826 av_freep(&filter->input_pads[i].name);
827 }
828 for (i = 0; i < filter->nb_outputs; i++) {
829 free_link(filter->outputs[i]);
830 if (filter->output_pads[i].flags & AVFILTERPAD_FLAG_FREE_NAME)
831 av_freep(&filter->output_pads[i].name);
832 }
833
834 if (filter->filter->priv_class)
835 av_opt_free(filter->priv);
836
837 av_buffer_unref(&filter->hw_device_ctx);
838
839 av_freep(&filter->name);
840 av_freep(&filter->input_pads);
841 av_freep(&filter->output_pads);
842 av_freep(&filter->inputs);
843 av_freep(&filter->outputs);
844 av_freep(&filter->priv);
845 while (ctxi->command_queue)
848 av_expr_free(ctxi->enable);
849 ctxi->enable = NULL;
850 av_freep(&ctxi->var_values);
852}
853
855{
856 if (ctx->nb_threads > 0)
857 return FFMIN(ctx->nb_threads, ctx->graph->nb_threads);
858 return ctx->graph->nb_threads;
859}
860
861int ff_filter_opt_parse(void *logctx, const AVClass *priv_class,
862 AVDictionary **options, const char *args)
863{
864 const AVOption *o = NULL;
865 int ret;
866 int offset= -1;
867
868 if (!args)
869 return 0;
870
871 while (*args) {
872 char *parsed_key, *value;
873 const char *key;
874 const char *shorthand = NULL;
875 int additional_flags = 0;
876
877 if (priv_class && (o = av_opt_next(&priv_class, o))) {
878 if (o->type == AV_OPT_TYPE_CONST || o->offset == offset)
879 continue;
880 offset = o->offset;
881 shorthand = o->name;
882 }
883
884 ret = av_opt_get_key_value(&args, "=", ":",
885 shorthand ? AV_OPT_FLAG_IMPLICIT_KEY : 0,
886 &parsed_key, &value);
887 if (ret < 0) {
888 if (ret == AVERROR(EINVAL))
889 av_log(logctx, AV_LOG_ERROR, "No option name near '%s'\n", args);
890 else
891 av_log(logctx, AV_LOG_ERROR, "Unable to parse '%s': %s\n", args,
892 av_err2str(ret));
893 return ret;
894 }
895 if (*args)
896 args++;
897 if (parsed_key) {
898 key = parsed_key;
899 additional_flags = AV_DICT_DONT_STRDUP_KEY;
900 priv_class = NULL; /* reject all remaining shorthand */
901 } else {
902 key = shorthand;
903 }
904
905 av_log(logctx, AV_LOG_DEBUG, "Setting '%s' to value '%s'\n", key, value);
906
908 additional_flags | AV_DICT_DONT_STRDUP_VAL | AV_DICT_MULTIKEY);
909 }
910
911 return 0;
912}
913
915 const char *arg, char *res, int res_len, int flags)
916{
917 const AVOption *o;
918
919 if (!ctx->filter->priv_class)
920 return 0;
922 if (!o)
923 return AVERROR(ENOSYS);
924 return av_opt_set(ctx->priv, cmd, arg, 0);
925}
926
928{
930 int ret = 0;
931
933 av_log(ctx, AV_LOG_ERROR, "Filter already initialized\n");
934 return AVERROR(EINVAL);
935 }
936
938 if (ret < 0) {
939 av_log(ctx, AV_LOG_ERROR, "Error applying generic filter options.\n");
940 return ret;
941 }
942
943 if (ctx->filter->flags & AVFILTER_FLAG_SLICE_THREADS &&
944 ctx->thread_type & ctx->graph->thread_type & AVFILTER_THREAD_SLICE &&
945 fffiltergraph(ctx->graph)->thread_execute) {
946 ctx->thread_type = AVFILTER_THREAD_SLICE;
947 ctxi->execute = fffiltergraph(ctx->graph)->thread_execute;
948 } else {
949 ctx->thread_type = 0;
950 }
951
952 if (fffilter(ctx->filter)->init)
953 ret = fffilter(ctx->filter)->init(ctx);
954 if (ret < 0)
955 return ret;
956
957 if (ctx->enable_str) {
958 ret = set_enable_expr(ctxi, ctx->enable_str);
959 if (ret < 0)
960 return ret;
961 }
962
964
965 return 0;
966}
967
969{
971 const AVDictionaryEntry *e;
972 int ret = 0;
973
974 if (args && *args) {
975 ret = ff_filter_opt_parse(filter, filter->filter->priv_class, &options, args);
976 if (ret < 0)
977 goto fail;
978 }
979
981 if (ret < 0)
982 goto fail;
983
984 if ((e = av_dict_iterate(options, NULL))) {
985 av_log(filter, AV_LOG_ERROR, "No such option: %s.\n", e->key);
987 goto fail;
988 }
989
990fail:
992
993 return ret;
994}
995
996const char *avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx)
997{
998 return pads[pad_idx].name;
999}
1000
1001enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx)
1002{
1003 return pads[pad_idx].type;
1004}
1005
1007{
1008 FilterLink *plink = ff_filter_link(link);
1009 if (plink->hw_frames_ctx)
1010 return av_buffer_ref(plink->hw_frames_ctx);
1011
1012 return NULL;
1013}
1014
1016{
1017 return ff_filter_frame(link->dst->outputs[0], frame);
1018}
1019
1020/**
1021 * Evaluate the timeline expression of the link for the time and properties
1022 * of the frame.
1023 * @return >0 if enabled, 0 if disabled
1024 * @note It does not update link->dst->is_disabled.
1025 */
1027{
1028 FilterLink *l = ff_filter_link(link);
1029 AVFilterContext *dstctx = link->dst;
1030 FFFilterContext *dsti = fffilterctx(dstctx);
1031 int64_t pts = frame->pts;
1032
1033 if (!dstctx->enable_str)
1034 return 1;
1035
1036 dsti->var_values[VAR_N] = l->frame_count_out;
1037 dsti->var_values[VAR_T] = pts == AV_NOPTS_VALUE ? NAN : pts * av_q2d(link->time_base);
1038 dsti->var_values[VAR_W] = link->w;
1039 dsti->var_values[VAR_H] = link->h;
1040
1041 return fabs(av_expr_eval(dsti->enable, dsti->var_values, NULL)) >= 0.5;
1042}
1043
1045{
1046 FilterLink *l = ff_filter_link(link);
1047 int (*filter_frame)(AVFilterLink *, AVFrame *);
1048 AVFilterContext *dstctx = link->dst;
1049 AVFilterPad *dst = link->dstpad;
1050 int ret;
1051
1052 if (!(filter_frame = dst->filter_frame))
1054
1055 if (dst->flags & AVFILTERPAD_FLAG_NEEDS_WRITABLE) {
1057 if (ret < 0)
1058 goto fail;
1059 }
1060
1063
1064 if (dstctx->is_disabled &&
1067 ret = filter_frame(link, frame);
1068 l->frame_count_out++;
1069 return ret;
1070
1071fail:
1073 return ret;
1074}
1075
1077{
1078 FilterLinkInternal * const li = ff_link_internal(link);
1079 int ret;
1081
1082 /* Consistency checks */
1083 if (link->type == AVMEDIA_TYPE_VIDEO) {
1084 int dynamic_flags = fffilter(link->dst->filter)->flags_internal;
1085
1086 if ((ret = ff_inlink_check_frame_params(link, frame, dynamic_flags)) < 0) {
1088 return ret;
1089 }
1090 if (!(dynamic_flags & FF_FILTER_FLAG_DYNAMIC_FRAME_FORMAT) &&
1092 av_assert1(frame->alpha_mode == link->alpha_mode);
1093 } else {
1094 if (frame->format != link->format) {
1095 av_log(link->dst, AV_LOG_ERROR, "Format change is not supported\n");
1096 goto error;
1097 }
1098 if (av_channel_layout_compare(&frame->ch_layout, &link->ch_layout)) {
1099 av_log(link->dst, AV_LOG_ERROR, "Channel layout change is not supported\n");
1100 goto error;
1101 }
1102 if (frame->sample_rate != link->sample_rate) {
1103 av_log(link->dst, AV_LOG_ERROR, "Sample rate change is not supported\n");
1104 goto error;
1105 }
1106
1107 frame->duration = av_rescale_q(frame->nb_samples, (AVRational){ 1, frame->sample_rate },
1108 link->time_base);
1109 }
1110
1111 li->frame_blocked_in = li->frame_wanted_out = 0;
1112 li->l.frame_count_in++;
1113 li->l.sample_count_in += frame->nb_samples;
1114 filter_unblock(link->dst);
1115 ret = ff_framequeue_add(&li->fifo, frame);
1116 if (ret < 0) {
1117 const FFFrameQueueGlobal *global = li->fifo.global;
1118 if (ret == AVERROR(ENOMEM) && global->queued >= global->max_queued)
1119 av_log(link->dst, AV_LOG_ERROR, "Exhausted frame queue capacity (%zu frames)\n", global->max_queued);
1121 return ret;
1122 }
1123 ff_filter_set_ready(link->dst, 300);
1124 return 0;
1125
1126error:
1128 return AVERROR_PATCHWELCOME;
1129}
1130
1131static int samples_ready(FilterLinkInternal *link, unsigned min)
1132{
1133 return ff_framequeue_queued_frames(&link->fifo) &&
1135 link->status_in);
1136}
1137
1138static int take_samples(FilterLinkInternal *li, unsigned min, unsigned max,
1139 AVFrame **rframe)
1140{
1141 FilterLink *l = &li->l;
1142 AVFilterLink *link = &l->pub;
1143 AVFrame *frame0, *frame, *buf;
1144 unsigned nb_samples, nb_frames, i, p;
1145 int ret;
1146
1147 /* Note: this function relies on no format changes and must only be
1148 called with enough samples. */
1150 frame0 = frame = ff_framequeue_peek(&li->fifo, 0);
1151 if (!li->fifo.samples_skipped && frame->nb_samples >= min && frame->nb_samples <= max) {
1152 *rframe = ff_framequeue_take(&li->fifo);
1153 return 0;
1154 }
1155 nb_frames = 0;
1156 nb_samples = 0;
1157 while (1) {
1158 if (nb_samples + frame->nb_samples > max) {
1159 if (nb_samples < min)
1160 nb_samples = max;
1161 break;
1162 }
1163 nb_samples += frame->nb_samples;
1164 nb_frames++;
1165 if (nb_frames == ff_framequeue_queued_frames(&li->fifo))
1166 break;
1167 frame = ff_framequeue_peek(&li->fifo, nb_frames);
1168 }
1169
1170 buf = ff_get_audio_buffer(link, nb_samples);
1171 if (!buf)
1172 return AVERROR(ENOMEM);
1173 ret = av_frame_copy_props(buf, frame0);
1174 if (ret < 0) {
1175 av_frame_free(&buf);
1176 return ret;
1177 }
1178
1179 p = 0;
1180 for (i = 0; i < nb_frames; i++) {
1182 av_samples_copy(buf->extended_data, frame->extended_data, p, 0,
1183 frame->nb_samples, link->ch_layout.nb_channels, link->format);
1184 p += frame->nb_samples;
1186 }
1187 if (p < nb_samples) {
1188 unsigned n = nb_samples - p;
1189 frame = ff_framequeue_peek(&li->fifo, 0);
1190 av_samples_copy(buf->extended_data, frame->extended_data, p, 0, n,
1191 link->ch_layout.nb_channels, link->format);
1193 }
1194
1195 *rframe = buf;
1196 return 0;
1197}
1198
1200{
1201 FilterLinkInternal * const li = ff_link_internal(link);
1202 AVFrame *frame = NULL;
1203 AVFilterContext *dst = link->dst;
1204 int ret;
1205
1207 ret = li->l.min_samples ?
1210 av_assert1(ret);
1211 if (ret < 0) {
1212 av_assert1(!frame);
1213 return ret;
1214 }
1215 /* The filter will soon have received a new frame, that may allow it to
1216 produce one or more: unblock its outputs. */
1218 /* AVFilterPad.filter_frame() expect frame_count_out to have the value
1219 before the frame; filter_frame_framed() will re-increment it. */
1220 li->l.frame_count_out--;
1221 ret = filter_frame_framed(link, frame);
1222 if (ret < 0 && ret != li->status_out) {
1224 } else {
1225 /* Run once again, to see if several frames were available, or if
1226 the input status has also changed, or any other reason. */
1228 }
1229 return ret;
1230}
1231
1233{
1234 AVFilterLink *in = &li_in->l.pub;
1235 unsigned out = 0, progress = 0;
1236 int ret;
1237
1238 av_assert0(!li_in->status_out);
1239 if (!filter->nb_outputs) {
1240 /* not necessary with the current API and sinks */
1241 return 0;
1242 }
1243 while (!li_in->status_out) {
1244 FilterLinkInternal *li_out = ff_link_internal(filter->outputs[out]);
1245
1246 if (!li_out->status_in) {
1247 progress++;
1248 ret = request_frame_to_filter(filter->outputs[out]);
1249 if (ret < 0)
1250 return ret;
1251 }
1252 if (++out == filter->nb_outputs) {
1253 if (!progress) {
1254 /* Every output already closed: input no longer interesting
1255 (example: overlay in shortest mode, other input closed). */
1256 link_set_out_status(in, li_in->status_in, li_in->status_in_pts);
1257 return 0;
1258 }
1259 progress = 0;
1260 out = 0;
1261 }
1262 }
1264 return 0;
1265}
1266
1268{
1269 unsigned i;
1270 int nb_eofs = 0;
1271
1272 for (i = 0; i < filter->nb_outputs; i++)
1273 nb_eofs += ff_outlink_get_status(filter->outputs[i]) == AVERROR_EOF;
1274 if (filter->nb_outputs && nb_eofs == filter->nb_outputs) {
1275 for (int j = 0; j < filter->nb_inputs; j++)
1277 return 0;
1278 }
1279
1280 for (i = 0; i < filter->nb_inputs; i++) {
1282 if (samples_ready(li, li->l.min_samples)) {
1283 return filter_frame_to_filter(filter->inputs[i]);
1284 }
1285 }
1286 for (i = 0; i < filter->nb_inputs; i++) {
1287 FilterLinkInternal * const li = ff_link_internal(filter->inputs[i]);
1288 if (li->status_in && !li->status_out) {
1290 return forward_status_change(filter, li);
1291 }
1292 }
1293 for (i = 0; i < filter->nb_outputs; i++) {
1294 FilterLinkInternal * const li = ff_link_internal(filter->outputs[i]);
1295 if (li->frame_wanted_out &&
1296 !li->frame_blocked_in) {
1297 return request_frame_to_filter(filter->outputs[i]);
1298 }
1299 }
1300 for (i = 0; i < filter->nb_outputs; i++) {
1301 FilterLinkInternal * const li = ff_link_internal(filter->outputs[i]);
1302 if (li->frame_wanted_out)
1303 return request_frame_to_filter(filter->outputs[i]);
1304 }
1305 if (!filter->nb_outputs) {
1306 ff_inlink_request_frame(filter->inputs[0]);
1307 return 0;
1308 }
1309 return FFERROR_NOT_READY;
1310}
1311
1312/*
1313 Filter scheduling and activation
1314
1315 When a filter is activated, it must:
1316 - if possible, output a frame;
1317 - else, if relevant, forward the input status change;
1318 - else, check outputs for wanted frames and forward the requests.
1319
1320 The following AVFilterLink fields are used for activation:
1321
1322 - frame_wanted_out:
1323
1324 This field indicates if a frame is needed on this input of the
1325 destination filter. A positive value indicates that a frame is needed
1326 to process queued frames or internal data or to satisfy the
1327 application; a zero value indicates that a frame is not especially
1328 needed but could be processed anyway; a negative value indicates that a
1329 frame would just be queued.
1330
1331 It is set by filters using ff_request_frame() or ff_request_no_frame(),
1332 when requested by the application through a specific API or when it is
1333 set on one of the outputs.
1334
1335 It is cleared when a frame is sent from the source using
1336 ff_filter_frame().
1337
1338 It is also cleared when a status change is sent from the source using
1339 ff_avfilter_link_set_in_status().
1340
1341 - frame_blocked_in:
1342
1343 This field means that the source filter can not generate a frame as is.
1344 Its goal is to avoid repeatedly calling the request_frame() method on
1345 the same link.
1346
1347 It is set by the framework on all outputs of a filter before activating it.
1348
1349 It is automatically cleared by ff_filter_frame().
1350
1351 It is also automatically cleared by ff_avfilter_link_set_in_status().
1352
1353 It is also cleared on all outputs (using filter_unblock()) when
1354 something happens on an input: processing a frame or changing the
1355 status.
1356
1357 - fifo:
1358
1359 Contains the frames queued on a filter input. If it contains frames and
1360 frame_wanted_out is not set, then the filter can be activated. If that
1361 result in the filter not able to use these frames, the filter must set
1362 frame_wanted_out to ask for more frames.
1363
1364 - status_in and status_in_pts:
1365
1366 Status (EOF or error code) of the link and timestamp of the status
1367 change (in link time base, same as frames) as seen from the input of
1368 the link. The status change is considered happening after the frames
1369 queued in fifo.
1370
1371 It is set by the source filter using ff_avfilter_link_set_in_status().
1372
1373 - status_out:
1374
1375 Status of the link as seen from the output of the link. The status
1376 change is considered having already happened.
1377
1378 It is set by the destination filter using
1379 link_set_out_status().
1380
1381 Filters are activated according to the ready field, set using the
1382 ff_filter_set_ready(). Eventually, a priority queue will be used.
1383 ff_filter_set_ready() is called whenever anything could cause progress to
1384 be possible. Marking a filter ready when it is not is not a problem,
1385 except for the small overhead it causes.
1386
1387 Conditions that cause a filter to be marked ready are:
1388
1389 - frames added on an input link;
1390
1391 - changes in the input or output status of an input link;
1392
1393 - requests for a frame on an output link;
1394
1395 - after any actual processing using the legacy methods (filter_frame(),
1396 and request_frame() to acknowledge status changes), to run once more
1397 and check if enough input was present for several frames.
1398
1399 Examples of scenarios to consider:
1400
1401 - buffersrc: activate if frame_wanted_out to notify the application;
1402 activate when the application adds a frame to push it immediately.
1403
1404 - testsrc: activate only if frame_wanted_out to produce and push a frame.
1405
1406 - concat (not at stitch points): can process a frame on any output.
1407 Activate if frame_wanted_out on output to forward on the corresponding
1408 input. Activate when a frame is present on input to process it
1409 immediately.
1410
1411 - framesync: needs at least one frame on each input; extra frames on the
1412 wrong input will accumulate. When a frame is first added on one input,
1413 set frame_wanted_out<0 on it to avoid getting more (would trigger
1414 testsrc) and frame_wanted_out>0 on the other to allow processing it.
1415
1416 Activation of old filters:
1417
1418 In order to activate a filter implementing the legacy filter_frame() and
1419 request_frame() methods, perform the first possible of the following
1420 actions:
1421
1422 - If an input has frames in fifo and frame_wanted_out == 0, dequeue a
1423 frame and call filter_frame().
1424
1425 Rationale: filter frames as soon as possible instead of leaving them
1426 queued; frame_wanted_out < 0 is not possible since the old API does not
1427 set it nor provides any similar feedback; frame_wanted_out > 0 happens
1428 when min_samples > 0 and there are not enough samples queued.
1429
1430 - If an input has status_in set but not status_out, try to call
1431 request_frame() on one of the outputs in the hope that it will trigger
1432 request_frame() on the input with status_in and acknowledge it. This is
1433 awkward and fragile, filters with several inputs or outputs should be
1434 updated to direct activation as soon as possible.
1435
1436 - If an output has frame_wanted_out > 0 and not frame_blocked_in, call
1437 request_frame().
1438
1439 Rationale: checking frame_blocked_in is necessary to avoid requesting
1440 repeatedly on a blocked input if another is not blocked (example:
1441 [buffersrc1][testsrc1][buffersrc2][testsrc2]concat=v=2).
1442
1443 - If an output has frame_wanted_out > 0 call request_frame().
1444
1445 Rationale: even if all inputs are blocked an activate callback should
1446 request a frame on some if its inputs if a frame is requested on any of
1447 its output.
1448
1449 - Request a frame on the input for sinks.
1450
1451 Rationale: sinks using the old api have no way to request a frame on their
1452 input, so we need to do it for them.
1453 */
1454
1456{
1458 const FFFilter *const fi = fffilter(filter->filter);
1459 int ret;
1460
1461 /* Generic timeline support is not yet implemented but should be easy */
1463 fi->activate));
1464 ctxi->ready = 0;
1466 if (ret == FFERROR_NOT_READY)
1467 ret = 0;
1468 return ret;
1469}
1470
1472{
1473 FilterLinkInternal * const li = ff_link_internal(link);
1474 *rpts = li->l.current_pts;
1476 return *rstatus = 0;
1477 if (li->status_out)
1478 return *rstatus = li->status_out;
1479 if (!li->status_in)
1480 return *rstatus = 0;
1481 *rstatus = li->status_out = li->status_in;
1483 *rpts = li->l.current_pts;
1484 return 1;
1485}
1486
1488{
1489 FilterLinkInternal * const li = ff_link_internal(link);
1490 return ff_framequeue_queued_frames(&li->fifo);
1491}
1492
1494{
1495 FilterLinkInternal * const li = ff_link_internal(link);
1496 return ff_framequeue_queued_frames(&li->fifo) > 0;
1497}
1498
1500{
1501 FilterLinkInternal * const li = ff_link_internal(link);
1503}
1504
1506{
1507 FilterLinkInternal * const li = ff_link_internal(link);
1508 uint64_t samples = ff_framequeue_queued_samples(&li->fifo);
1509 av_assert1(min);
1510 return samples >= min || (li->status_in && samples);
1511}
1512
1514{
1515 AVFilterLink *const link = &li->l.pub;
1518 if (link == link->dst->inputs[0])
1520 li->l.frame_count_out++;
1521 li->l.sample_count_out += frame->nb_samples;
1522}
1523
1525{
1526 FilterLinkInternal * const li = ff_link_internal(link);
1527 AVFrame *frame;
1528
1529 *rframe = NULL;
1531 return 0;
1532
1533 if (li->fifo.samples_skipped) {
1534 frame = ff_framequeue_peek(&li->fifo, 0);
1535 return ff_inlink_consume_samples(link, frame->nb_samples, frame->nb_samples, rframe);
1536 }
1537
1539 consume_update(li, frame);
1540 *rframe = frame;
1541 return 1;
1542}
1543
1544int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max,
1545 AVFrame **rframe)
1546{
1547 FilterLinkInternal * const li = ff_link_internal(link);
1548 AVFrame *frame;
1549 int ret;
1550
1551 av_assert1(min);
1552 *rframe = NULL;
1554 return 0;
1555 if (li->status_in)
1557 ret = take_samples(li, min, max, &frame);
1558 if (ret < 0)
1559 return ret;
1560 consume_update(li, frame);
1561 *rframe = frame;
1562 return 1;
1563}
1564
1566{
1567 FilterLinkInternal * const li = ff_link_internal(link);
1568 return ff_framequeue_peek(&li->fifo, idx);
1569}
1570
1572 int dynamic_flags)
1573{
1574 const FilterLinkInternal *li = ff_link_internal(link);
1575
1576 if ((frame->format == li->cfg_format ||
1577 dynamic_flags & FF_FILTER_FLAG_DYNAMIC_FRAME_FORMAT) &&
1578 (frame->width == li->cfg_w && frame->height == li->cfg_h ||
1579 dynamic_flags & FF_FILTER_FLAG_DYNAMIC_FRAME_SIZE))
1580 return 0;
1581
1582 av_log(link->dst, AV_LOG_ERROR,
1583 "Frame size or format changed without filter graph reinitialization\n");
1584 return AVERROR(EINVAL);
1585}
1586
1588{
1589 AVFrame *frame = *rframe;
1590 AVFrame *out;
1591 int ret;
1592
1594 return 0;
1595 av_log(link->dst, AV_LOG_DEBUG, "Copying data in avfilter.\n");
1596
1597 switch (link->type) {
1598 case AVMEDIA_TYPE_VIDEO:
1599 out = ff_get_video_buffer(link, frame->width, frame->height);
1600 break;
1601 case AVMEDIA_TYPE_AUDIO:
1602 out = ff_get_audio_buffer(link, frame->nb_samples);
1603 break;
1604 default:
1605 return AVERROR(EINVAL);
1606 }
1607 if (!out)
1608 return AVERROR(ENOMEM);
1609
1611 if (ret < 0) {
1613 return ret;
1614 }
1615
1616 ret = av_frame_copy(out, frame);
1617 if (ret < 0) {
1619 return ret;
1620 }
1621
1623 *rframe = out;
1624 return 0;
1625}
1626
1628{
1629 FFFilterContext *ctxi = fffilterctx(link->dst);
1630 AVFilterCommand *cmd = ctxi->command_queue;
1631
1632 while(cmd && cmd->time <= frame->pts * av_q2d(link->time_base)){
1633 av_log(link->dst, AV_LOG_DEBUG,
1634 "Processing command time:%f command:%s arg:%s\n",
1635 cmd->time, cmd->command, cmd->arg);
1636 avfilter_process_command(link->dst, cmd->command, cmd->arg, 0, 0, cmd->flags);
1637 command_queue_pop(link->dst);
1638 cmd = ctxi->command_queue;
1639 }
1640 return 0;
1641}
1642
1644{
1646 av_assert1(!li->status_in);
1647 av_assert1(!li->status_out);
1648 li->frame_wanted_out = 1;
1649 ff_filter_set_ready(link->src, 100);
1650}
1651
1652void ff_inlink_set_status(AVFilterLink *link, int status)
1653{
1654 FilterLinkInternal * const li = ff_link_internal(link);
1655 if (li->status_out)
1656 return;
1657 li->frame_wanted_out = 0;
1658 li->frame_blocked_in = 0;
1659 link_set_out_status(link, status, AV_NOPTS_VALUE);
1660 while (ff_framequeue_queued_frames(&li->fifo)) {
1663 }
1664 if (!li->status_in)
1665 li->status_in = status;
1666}
1667
1669{
1670 FilterLinkInternal * const li = ff_link_internal(link);
1671 return li->status_in;
1672}
1673
1675{
1676 FilterLinkInternal * const li_in = ff_link_internal(inlink);
1677 return ff_outlink_frame_wanted(outlink) ||
1679 li_in->status_out;
1680}
1681
1682
1684{
1685 return &avfilter_class;
1686}
1687
1689 int default_pool_size)
1690{
1691 FilterLink *l = ff_filter_link(link);
1693
1694 // Must already be set by caller.
1696
1698
1699 if (frames->initial_pool_size == 0) {
1700 // Dynamic allocation is necessarily supported.
1701 } else if (avctx->extra_hw_frames >= 0) {
1702 frames->initial_pool_size += avctx->extra_hw_frames;
1703 } else {
1704 frames->initial_pool_size = default_pool_size;
1705 }
1706
1707 return 0;
1708}
1709
1711{
1712 FilterLinkInternal * const li = ff_link_internal(link);
1713 return li->frame_wanted_out;
1714}
1715
1717 void *arg, int *ret, int nb_jobs)
1718{
1719 return fffilterctx(ctx)->execute(ctx, func, arg, ret, nb_jobs);
1720}
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:1199
AVFilterContext * ff_filter_alloc(const AVFilter *filter, const char *inst_name)
Allocate a new filter context and return it.
Definition avfilter.c:707
int ff_inoutlink_check_flow(AVFilterLink *inlink, AVFilterLink *outlink)
Check for flow control between input and output.
Definition avfilter.c:1674
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:1015
int ff_append_inpad_free_name(AVFilterContext *f, AVFilterPad *p)
Definition avfilter.c:132
static void free_link(AVFilterLink *link)
Definition avfilter.c:781
static void consume_update(FilterLinkInternal *li, const AVFrame *frame)
Definition avfilter.c:1513
void ff_inlink_set_status(AVFilterLink *link, int status)
Set the status on an input link.
Definition avfilter.c:1652
@ VAR_H
Definition avfilter.c:571
@ VAR_W
Definition avfilter.c:570
int ff_outlink_get_status(AVFilterLink *link)
Get the status on an output link.
Definition avfilter.c:1668
static void * filter_child_next(void *obj, void *prev)
Definition avfilter.c:648
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:1471
int ff_inlink_check_available_frame(AVFilterLink *link)
Test if a frame is available on the link.
Definition avfilter.c:1493
int ff_inlink_check_available_samples(AVFilterLink *link, unsigned min)
Test if enough samples are available on the link.
Definition avfilter.c:1505
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:1076
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:1710
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:1688
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:914
static int take_samples(FilterLinkInternal *li, unsigned min, unsigned max, AVFrame **rframe)
Definition avfilter.c:1138
static const AVClass avfilter_class
Definition avfilter.c:683
static int set_enable_expr(FFFilterContext *ctxi, const char *expr)
Definition avfilter.c:575
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:670
size_t ff_inlink_queued_frames(AVFilterLink *link)
Get the number of frames available on the link.
Definition avfilter.c:1487
int ff_request_frame(AVFilterLink *link)
Request an input frame from the filter at the other end of the link.
Definition avfilter.c:489
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:861
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:1627
int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
Definition avfilter.c:1716
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:1544
static int filter_frame_framed(AVFilterLink *link, AVFrame *frame)
Definition avfilter.c:1044
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Definition avfilter.c:854
static int default_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
Definition avfilter.c:694
static int64_t guess_status_pts(AVFilterContext *ctx, int status, AVRational link_time_base)
Definition avfilter.c:516
AVFrame * ff_inlink_peek_frame(AVFilterLink *link, size_t idx)
Access a frame in the link fifo without consuming it.
Definition avfilter.c:1565
static const AVClass * filter_child_class_iterate(void **iter)
Definition avfilter.c:656
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:1587
int ff_inlink_check_frame_params(AVFilterLink *link, const AVFrame *frame, int dynamic_flags)
Check that a video frame has the size and pixel format its link was configured with.
Definition avfilter.c:1571
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:1524
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:1026
static int filter_activate_default(AVFilterContext *filter)
Definition avfilter.c:1267
#define OFFSET(x)
Definition avfilter.c:667
static void command_queue_pop(AVFilterContext *filter)
Definition avfilter.c:81
static const char * default_filter_name(void *filter_ctx)
Definition avfilter.c:642
static int request_frame_to_filter(AVFilterLink *link)
Definition avfilter.c:538
int ff_inlink_queued_samples(AVFilterLink *link)
Definition avfilter.c:1499
void ff_inlink_request_frame(AVFilterLink *link)
Mark that a frame is wanted on the link.
Definition avfilter.c:1643
int ff_filter_activate(AVFilterContext *filter)
Definition avfilter.c:1455
static int samples_ready(FilterLinkInternal *link, unsigned min)
Definition avfilter.c:1131
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:1232
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:968
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:808
enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx)
Get the type of an AVFilterPad.
Definition avfilter.c:1001
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:637
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:996
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:616
AVBufferRef * avfilter_link_get_hw_frames_ctx(AVFilterLink *link)
Get the hardware frames context of a filter link.
Definition avfilter.c:1006
#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:927
#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:1683
#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:236
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
Definition dict.c:43
#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:87
#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 FF_FILTER_FLAG_DYNAMIC_FRAME_SIZE
The filter handles input frames whose size differs from the one its input link was configured with.
Definition filters.h:214
#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
#define FF_FILTER_FLAG_DYNAMIC_FRAME_FORMAT
The filter handles input frames whose pixel format differs from the one its input link was configured...
Definition filters.h:220
static FilterLink * ff_filter_link(AVFilterLink *link)
Definition filters.h:199
static const FFFilter * fffilter(const AVFilter *f)
Definition filters.h:479
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:286
int(* init)(AVFilterContext *ctx)
Filter initialization function.
Definition filters.h:340
uint8_t nb_inputs
The number of entries in the list of inputs.
Definition filters.h:291
uint8_t nb_outputs
The number of entries in the list of outputs.
Definition filters.h:296
void(* uninit)(AVFilterContext *ctx)
Filter uninitialization function.
Definition filters.h:352
int flags_internal
Additional flags for avfilter internal use only.
Definition filters.h:448
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:462
int(* preinit)(AVFilterContext *ctx)
Filter pre-initialization function.
Definition filters.h:317
int(* activate)(AVFilterContext *ctx)
Filter activation function.
Definition filters.h:476
int priv_size
size of private data to allocate for the filter
Definition filters.h:446
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 cfg_format
Format and size of the video frames the link was configured with.
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]