]> git.sesse.net Git - ffmpeg/blob - libavfilter/avfilter.c
avfilter: avoid testing float == 0
[ffmpeg] / libavfilter / avfilter.c
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/atomic.h"
23 #include "libavutil/avassert.h"
24 #include "libavutil/avstring.h"
25 #include "libavutil/channel_layout.h"
26 #include "libavutil/common.h"
27 #include "libavutil/eval.h"
28 #include "libavutil/imgutils.h"
29 #include "libavutil/internal.h"
30 #include "libavutil/opt.h"
31 #include "libavutil/pixdesc.h"
32 #include "libavutil/rational.h"
33 #include "libavutil/samplefmt.h"
34
35 #include "audio.h"
36 #include "avfilter.h"
37 #include "formats.h"
38 #include "internal.h"
39 #include "audio.h"
40
41 static int ff_filter_frame_framed(AVFilterLink *link, AVFrame *frame);
42
43 void ff_tlog_ref(void *ctx, AVFrame *ref, int end)
44 {
45     av_unused char buf[16];
46     ff_tlog(ctx,
47             "ref[%p buf:%p data:%p linesize[%d, %d, %d, %d] pts:%"PRId64" pos:%"PRId64,
48             ref, ref->buf, ref->data[0],
49             ref->linesize[0], ref->linesize[1], ref->linesize[2], ref->linesize[3],
50             ref->pts, av_frame_get_pkt_pos(ref));
51
52     if (ref->width) {
53         ff_tlog(ctx, " a:%d/%d s:%dx%d i:%c iskey:%d type:%c",
54                 ref->sample_aspect_ratio.num, ref->sample_aspect_ratio.den,
55                 ref->width, ref->height,
56                 !ref->interlaced_frame     ? 'P' :         /* Progressive  */
57                 ref->top_field_first ? 'T' : 'B',    /* Top / Bottom */
58                 ref->key_frame,
59                 av_get_picture_type_char(ref->pict_type));
60     }
61     if (ref->nb_samples) {
62         ff_tlog(ctx, " cl:%"PRId64"d n:%d r:%d",
63                 ref->channel_layout,
64                 ref->nb_samples,
65                 ref->sample_rate);
66     }
67
68     ff_tlog(ctx, "]%s", end ? "\n" : "");
69 }
70
71 unsigned avfilter_version(void)
72 {
73     av_assert0(LIBAVFILTER_VERSION_MICRO >= 100);
74     return LIBAVFILTER_VERSION_INT;
75 }
76
77 const char *avfilter_configuration(void)
78 {
79     return FFMPEG_CONFIGURATION;
80 }
81
82 const char *avfilter_license(void)
83 {
84 #define LICENSE_PREFIX "libavfilter license: "
85     return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
86 }
87
88 void ff_command_queue_pop(AVFilterContext *filter)
89 {
90     AVFilterCommand *c= filter->command_queue;
91     av_freep(&c->arg);
92     av_freep(&c->command);
93     filter->command_queue= c->next;
94     av_free(c);
95 }
96
97 int ff_insert_pad(unsigned idx, unsigned *count, size_t padidx_off,
98                    AVFilterPad **pads, AVFilterLink ***links,
99                    AVFilterPad *newpad)
100 {
101     AVFilterLink **newlinks;
102     AVFilterPad *newpads;
103     unsigned i;
104
105     idx = FFMIN(idx, *count);
106
107     newpads  = av_realloc_array(*pads,  *count + 1, sizeof(AVFilterPad));
108     newlinks = av_realloc_array(*links, *count + 1, sizeof(AVFilterLink*));
109     if (newpads)
110         *pads  = newpads;
111     if (newlinks)
112         *links = newlinks;
113     if (!newpads || !newlinks)
114         return AVERROR(ENOMEM);
115
116     memmove(*pads  + idx + 1, *pads  + idx, sizeof(AVFilterPad)   * (*count - idx));
117     memmove(*links + idx + 1, *links + idx, sizeof(AVFilterLink*) * (*count - idx));
118     memcpy(*pads + idx, newpad, sizeof(AVFilterPad));
119     (*links)[idx] = NULL;
120
121     (*count)++;
122     for (i = idx + 1; i < *count; i++)
123         if (*links[i])
124             (*(unsigned *)((uint8_t *) *links[i] + padidx_off))++;
125
126     return 0;
127 }
128
129 int avfilter_link(AVFilterContext *src, unsigned srcpad,
130                   AVFilterContext *dst, unsigned dstpad)
131 {
132     AVFilterLink *link;
133
134     if (src->nb_outputs <= srcpad || dst->nb_inputs <= dstpad ||
135         src->outputs[srcpad]      || dst->inputs[dstpad])
136         return -1;
137
138     if (src->output_pads[srcpad].type != dst->input_pads[dstpad].type) {
139         av_log(src, AV_LOG_ERROR,
140                "Media type mismatch between the '%s' filter output pad %d (%s) and the '%s' filter input pad %d (%s)\n",
141                src->name, srcpad, (char *)av_x_if_null(av_get_media_type_string(src->output_pads[srcpad].type), "?"),
142                dst->name, dstpad, (char *)av_x_if_null(av_get_media_type_string(dst-> input_pads[dstpad].type), "?"));
143         return AVERROR(EINVAL);
144     }
145
146     link = av_mallocz(sizeof(*link));
147     if (!link)
148         return AVERROR(ENOMEM);
149
150     src->outputs[srcpad] = dst->inputs[dstpad] = link;
151
152     link->src     = src;
153     link->dst     = dst;
154     link->srcpad  = &src->output_pads[srcpad];
155     link->dstpad  = &dst->input_pads[dstpad];
156     link->type    = src->output_pads[srcpad].type;
157     av_assert0(AV_PIX_FMT_NONE == -1 && AV_SAMPLE_FMT_NONE == -1);
158     link->format  = -1;
159
160     return 0;
161 }
162
163 void avfilter_link_free(AVFilterLink **link)
164 {
165     if (!*link)
166         return;
167
168     av_frame_free(&(*link)->partial_buf);
169
170     av_freep(link);
171 }
172
173 int avfilter_link_get_channels(AVFilterLink *link)
174 {
175     return link->channels;
176 }
177
178 void avfilter_link_set_closed(AVFilterLink *link, int closed)
179 {
180     link->closed = closed;
181 }
182
183 int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt,
184                            unsigned filt_srcpad_idx, unsigned filt_dstpad_idx)
185 {
186     int ret;
187     unsigned dstpad_idx = link->dstpad - link->dst->input_pads;
188
189     av_log(link->dst, AV_LOG_VERBOSE, "auto-inserting filter '%s' "
190            "between the filter '%s' and the filter '%s'\n",
191            filt->name, link->src->name, link->dst->name);
192
193     link->dst->inputs[dstpad_idx] = NULL;
194     if ((ret = avfilter_link(filt, filt_dstpad_idx, link->dst, dstpad_idx)) < 0) {
195         /* failed to link output filter to new filter */
196         link->dst->inputs[dstpad_idx] = link;
197         return ret;
198     }
199
200     /* re-hookup the link to the new destination filter we inserted */
201     link->dst                     = filt;
202     link->dstpad                  = &filt->input_pads[filt_srcpad_idx];
203     filt->inputs[filt_srcpad_idx] = link;
204
205     /* if any information on supported media formats already exists on the
206      * link, we need to preserve that */
207     if (link->out_formats)
208         ff_formats_changeref(&link->out_formats,
209                              &filt->outputs[filt_dstpad_idx]->out_formats);
210     if (link->out_samplerates)
211         ff_formats_changeref(&link->out_samplerates,
212                              &filt->outputs[filt_dstpad_idx]->out_samplerates);
213     if (link->out_channel_layouts)
214         ff_channel_layouts_changeref(&link->out_channel_layouts,
215                                      &filt->outputs[filt_dstpad_idx]->out_channel_layouts);
216
217     return 0;
218 }
219
220 int avfilter_config_links(AVFilterContext *filter)
221 {
222     int (*config_link)(AVFilterLink *);
223     unsigned i;
224     int ret;
225
226     for (i = 0; i < filter->nb_inputs; i ++) {
227         AVFilterLink *link = filter->inputs[i];
228         AVFilterLink *inlink;
229
230         if (!link) continue;
231
232         inlink = link->src->nb_inputs ? link->src->inputs[0] : NULL;
233         link->current_pts = AV_NOPTS_VALUE;
234
235         switch (link->init_state) {
236         case AVLINK_INIT:
237             continue;
238         case AVLINK_STARTINIT:
239             av_log(filter, AV_LOG_INFO, "circular filter chain detected\n");
240             return 0;
241         case AVLINK_UNINIT:
242             link->init_state = AVLINK_STARTINIT;
243
244             if ((ret = avfilter_config_links(link->src)) < 0)
245                 return ret;
246
247             if (!(config_link = link->srcpad->config_props)) {
248                 if (link->src->nb_inputs != 1) {
249                     av_log(link->src, AV_LOG_ERROR, "Source filters and filters "
250                                                     "with more than one input "
251                                                     "must set config_props() "
252                                                     "callbacks on all outputs\n");
253                     return AVERROR(EINVAL);
254                 }
255             } else if ((ret = config_link(link)) < 0) {
256                 av_log(link->src, AV_LOG_ERROR,
257                        "Failed to configure output pad on %s\n",
258                        link->src->name);
259                 return ret;
260             }
261
262             switch (link->type) {
263             case AVMEDIA_TYPE_VIDEO:
264                 if (!link->time_base.num && !link->time_base.den)
265                     link->time_base = inlink ? inlink->time_base : AV_TIME_BASE_Q;
266
267                 if (!link->sample_aspect_ratio.num && !link->sample_aspect_ratio.den)
268                     link->sample_aspect_ratio = inlink ?
269                         inlink->sample_aspect_ratio : (AVRational){1,1};
270
271                 if (inlink && !link->frame_rate.num && !link->frame_rate.den)
272                     link->frame_rate = inlink->frame_rate;
273
274                 if (inlink) {
275                     if (!link->w)
276                         link->w = inlink->w;
277                     if (!link->h)
278                         link->h = inlink->h;
279                 } else if (!link->w || !link->h) {
280                     av_log(link->src, AV_LOG_ERROR,
281                            "Video source filters must set their output link's "
282                            "width and height\n");
283                     return AVERROR(EINVAL);
284                 }
285                 break;
286
287             case AVMEDIA_TYPE_AUDIO:
288                 if (inlink) {
289                     if (!link->time_base.num && !link->time_base.den)
290                         link->time_base = inlink->time_base;
291                 }
292
293                 if (!link->time_base.num && !link->time_base.den)
294                     link->time_base = (AVRational) {1, link->sample_rate};
295             }
296
297             if ((config_link = link->dstpad->config_props))
298                 if ((ret = config_link(link)) < 0) {
299                     av_log(link->src, AV_LOG_ERROR,
300                            "Failed to configure input pad on %s\n",
301                            link->dst->name);
302                     return ret;
303                 }
304
305             link->init_state = AVLINK_INIT;
306         }
307     }
308
309     return 0;
310 }
311
312 void ff_tlog_link(void *ctx, AVFilterLink *link, int end)
313 {
314     if (link->type == AVMEDIA_TYPE_VIDEO) {
315         ff_tlog(ctx,
316                 "link[%p s:%dx%d fmt:%s %s->%s]%s",
317                 link, link->w, link->h,
318                 av_get_pix_fmt_name(link->format),
319                 link->src ? link->src->filter->name : "",
320                 link->dst ? link->dst->filter->name : "",
321                 end ? "\n" : "");
322     } else {
323         char buf[128];
324         av_get_channel_layout_string(buf, sizeof(buf), -1, link->channel_layout);
325
326         ff_tlog(ctx,
327                 "link[%p r:%d cl:%s fmt:%s %s->%s]%s",
328                 link, (int)link->sample_rate, buf,
329                 av_get_sample_fmt_name(link->format),
330                 link->src ? link->src->filter->name : "",
331                 link->dst ? link->dst->filter->name : "",
332                 end ? "\n" : "");
333     }
334 }
335
336 int ff_request_frame(AVFilterLink *link)
337 {
338     int ret = -1;
339     FF_TPRINTF_START(NULL, request_frame); ff_tlog_link(NULL, link, 1);
340
341     if (link->closed)
342         return AVERROR_EOF;
343     av_assert0(!link->frame_requested);
344     link->frame_requested = 1;
345     while (link->frame_requested) {
346         if (link->srcpad->request_frame)
347             ret = link->srcpad->request_frame(link);
348         else if (link->src->inputs[0])
349             ret = ff_request_frame(link->src->inputs[0]);
350         if (ret == AVERROR_EOF && link->partial_buf) {
351             AVFrame *pbuf = link->partial_buf;
352             link->partial_buf = NULL;
353             ret = ff_filter_frame_framed(link, pbuf);
354         }
355         if (ret < 0) {
356             link->frame_requested = 0;
357             if (ret == AVERROR_EOF)
358                 link->closed = 1;
359         } else {
360             av_assert0(!link->frame_requested ||
361                        link->flags & FF_LINK_FLAG_REQUEST_LOOP);
362         }
363     }
364     return ret;
365 }
366
367 int ff_poll_frame(AVFilterLink *link)
368 {
369     int i, min = INT_MAX;
370
371     if (link->srcpad->poll_frame)
372         return link->srcpad->poll_frame(link);
373
374     for (i = 0; i < link->src->nb_inputs; i++) {
375         int val;
376         if (!link->src->inputs[i])
377             return -1;
378         val = ff_poll_frame(link->src->inputs[i]);
379         min = FFMIN(min, val);
380     }
381
382     return min;
383 }
384
385 static const char *const var_names[] = {   "t",   "n",   "pos",        NULL };
386 enum                                   { VAR_T, VAR_N, VAR_POS, VAR_VARS_NB };
387
388 static int set_enable_expr(AVFilterContext *ctx, const char *expr)
389 {
390     int ret;
391     char *expr_dup;
392     AVExpr *old = ctx->enable;
393
394     if (!(ctx->filter->flags & AVFILTER_FLAG_SUPPORT_TIMELINE)) {
395         av_log(ctx, AV_LOG_ERROR, "Timeline ('enable' option) not supported "
396                "with filter '%s'\n", ctx->filter->name);
397         return AVERROR_PATCHWELCOME;
398     }
399
400     expr_dup = av_strdup(expr);
401     if (!expr_dup)
402         return AVERROR(ENOMEM);
403
404     if (!ctx->var_values) {
405         ctx->var_values = av_calloc(VAR_VARS_NB, sizeof(*ctx->var_values));
406         if (!ctx->var_values) {
407             av_free(expr_dup);
408             return AVERROR(ENOMEM);
409         }
410     }
411
412     ret = av_expr_parse((AVExpr**)&ctx->enable, expr_dup, var_names,
413                         NULL, NULL, NULL, NULL, 0, ctx->priv);
414     if (ret < 0) {
415         av_log(ctx->priv, AV_LOG_ERROR,
416                "Error when evaluating the expression '%s' for enable\n",
417                expr_dup);
418         av_free(expr_dup);
419         return ret;
420     }
421
422     av_expr_free(old);
423     av_free(ctx->enable_str);
424     ctx->enable_str = expr_dup;
425     return 0;
426 }
427
428 void ff_update_link_current_pts(AVFilterLink *link, int64_t pts)
429 {
430     if (pts == AV_NOPTS_VALUE)
431         return;
432     link->current_pts = av_rescale_q(pts, link->time_base, AV_TIME_BASE_Q);
433     /* TODO use duration */
434     if (link->graph && link->age_index >= 0)
435         ff_avfilter_graph_update_heap(link->graph, link);
436 }
437
438 int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags)
439 {
440     if(!strcmp(cmd, "ping")){
441         char local_res[256] = {0};
442
443         if (!res) {
444             res = local_res;
445             res_len = sizeof(local_res);
446         }
447         av_strlcatf(res, res_len, "pong from:%s %s\n", filter->filter->name, filter->name);
448         if (res == local_res)
449             av_log(filter, AV_LOG_INFO, "%s", res);
450         return 0;
451     }else if(!strcmp(cmd, "enable")) {
452         return set_enable_expr(filter, arg);
453     }else if(filter->filter->process_command) {
454         return filter->filter->process_command(filter, cmd, arg, res, res_len, flags);
455     }
456     return AVERROR(ENOSYS);
457 }
458
459 static AVFilter *first_filter;
460
461 AVFilter *avfilter_get_by_name(const char *name)
462 {
463     const AVFilter *f = NULL;
464
465     if (!name)
466         return NULL;
467
468     while ((f = avfilter_next(f)))
469         if (!strcmp(f->name, name))
470             return (AVFilter *)f;
471
472     return NULL;
473 }
474
475 int avfilter_register(AVFilter *filter)
476 {
477     AVFilter **f = &first_filter;
478     int i;
479
480     /* the filter must select generic or internal exclusively */
481     av_assert0((filter->flags & AVFILTER_FLAG_SUPPORT_TIMELINE) != AVFILTER_FLAG_SUPPORT_TIMELINE);
482
483     for(i=0; filter->inputs && filter->inputs[i].name; i++) {
484         const AVFilterPad *input = &filter->inputs[i];
485         av_assert0(     !input->filter_frame
486                     || (!input->start_frame && !input->end_frame));
487     }
488
489     filter->next = NULL;
490
491     while(avpriv_atomic_ptr_cas((void * volatile *)f, NULL, filter))
492         f = &(*f)->next;
493
494     return 0;
495 }
496
497 const AVFilter *avfilter_next(const AVFilter *prev)
498 {
499     return prev ? prev->next : first_filter;
500 }
501
502 #if FF_API_OLD_FILTER_REGISTER
503 AVFilter **av_filter_next(AVFilter **filter)
504 {
505     return filter ? &(*filter)->next : &first_filter;
506 }
507
508 void avfilter_uninit(void)
509 {
510 }
511 #endif
512
513 int avfilter_pad_count(const AVFilterPad *pads)
514 {
515     int count;
516
517     if (!pads)
518         return 0;
519
520     for (count = 0; pads->name; count++)
521         pads++;
522     return count;
523 }
524
525 static const char *default_filter_name(void *filter_ctx)
526 {
527     AVFilterContext *ctx = filter_ctx;
528     return ctx->name ? ctx->name : ctx->filter->name;
529 }
530
531 static void *filter_child_next(void *obj, void *prev)
532 {
533     AVFilterContext *ctx = obj;
534     if (!prev && ctx->filter && ctx->filter->priv_class && ctx->priv)
535         return ctx->priv;
536     return NULL;
537 }
538
539 static const AVClass *filter_child_class_next(const AVClass *prev)
540 {
541     const AVFilter *f = NULL;
542
543     /* find the filter that corresponds to prev */
544     while (prev && (f = avfilter_next(f)))
545         if (f->priv_class == prev)
546             break;
547
548     /* could not find filter corresponding to prev */
549     if (prev && !f)
550         return NULL;
551
552     /* find next filter with specific options */
553     while ((f = avfilter_next(f)))
554         if (f->priv_class)
555             return f->priv_class;
556
557     return NULL;
558 }
559
560 #define OFFSET(x) offsetof(AVFilterContext, x)
561 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM
562 static const AVOption avfilter_options[] = {
563     { "thread_type", "Allowed thread types", OFFSET(thread_type), AV_OPT_TYPE_FLAGS,
564         { .i64 = AVFILTER_THREAD_SLICE }, 0, INT_MAX, FLAGS, "thread_type" },
565         { "slice", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVFILTER_THREAD_SLICE }, .unit = "thread_type" },
566     { "enable", "set enable expression", OFFSET(enable_str), AV_OPT_TYPE_STRING, {.str=NULL}, .flags = FLAGS },
567     { NULL },
568 };
569
570 static const AVClass avfilter_class = {
571     .class_name = "AVFilter",
572     .item_name  = default_filter_name,
573     .version    = LIBAVUTIL_VERSION_INT,
574     .category   = AV_CLASS_CATEGORY_FILTER,
575     .child_next = filter_child_next,
576     .child_class_next = filter_child_class_next,
577     .option           = avfilter_options,
578 };
579
580 static int default_execute(AVFilterContext *ctx, action_func *func, void *arg,
581                            int *ret, int nb_jobs)
582 {
583     int i;
584
585     for (i = 0; i < nb_jobs; i++) {
586         int r = func(ctx, arg, i, nb_jobs);
587         if (ret)
588             ret[i] = r;
589     }
590     return 0;
591 }
592
593 AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name)
594 {
595     AVFilterContext *ret;
596
597     if (!filter)
598         return NULL;
599
600     ret = av_mallocz(sizeof(AVFilterContext));
601     if (!ret)
602         return NULL;
603
604     ret->av_class = &avfilter_class;
605     ret->filter   = filter;
606     ret->name     = inst_name ? av_strdup(inst_name) : NULL;
607     if (filter->priv_size) {
608         ret->priv     = av_mallocz(filter->priv_size);
609         if (!ret->priv)
610             goto err;
611     }
612
613     av_opt_set_defaults(ret);
614     if (filter->priv_class) {
615         *(const AVClass**)ret->priv = filter->priv_class;
616         av_opt_set_defaults(ret->priv);
617     }
618
619     ret->internal = av_mallocz(sizeof(*ret->internal));
620     if (!ret->internal)
621         goto err;
622     ret->internal->execute = default_execute;
623
624     ret->nb_inputs = avfilter_pad_count(filter->inputs);
625     if (ret->nb_inputs ) {
626         ret->input_pads   = av_malloc(sizeof(AVFilterPad) * ret->nb_inputs);
627         if (!ret->input_pads)
628             goto err;
629         memcpy(ret->input_pads, filter->inputs, sizeof(AVFilterPad) * ret->nb_inputs);
630         ret->inputs       = av_mallocz(sizeof(AVFilterLink*) * ret->nb_inputs);
631         if (!ret->inputs)
632             goto err;
633     }
634
635     ret->nb_outputs = avfilter_pad_count(filter->outputs);
636     if (ret->nb_outputs) {
637         ret->output_pads  = av_malloc(sizeof(AVFilterPad) * ret->nb_outputs);
638         if (!ret->output_pads)
639             goto err;
640         memcpy(ret->output_pads, filter->outputs, sizeof(AVFilterPad) * ret->nb_outputs);
641         ret->outputs      = av_mallocz(sizeof(AVFilterLink*) * ret->nb_outputs);
642         if (!ret->outputs)
643             goto err;
644     }
645 #if FF_API_FOO_COUNT
646 FF_DISABLE_DEPRECATION_WARNINGS
647     ret->output_count = ret->nb_outputs;
648     ret->input_count  = ret->nb_inputs;
649 FF_ENABLE_DEPRECATION_WARNINGS
650 #endif
651
652     return ret;
653
654 err:
655     av_freep(&ret->inputs);
656     av_freep(&ret->input_pads);
657     ret->nb_inputs = 0;
658     av_freep(&ret->outputs);
659     av_freep(&ret->output_pads);
660     ret->nb_outputs = 0;
661     av_freep(&ret->priv);
662     av_freep(&ret->internal);
663     av_free(ret);
664     return NULL;
665 }
666
667 #if FF_API_AVFILTER_OPEN
668 int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name)
669 {
670     *filter_ctx = ff_filter_alloc(filter, inst_name);
671     return *filter_ctx ? 0 : AVERROR(ENOMEM);
672 }
673 #endif
674
675 static void free_link(AVFilterLink *link)
676 {
677     if (!link)
678         return;
679
680     if (link->src)
681         link->src->outputs[link->srcpad - link->src->output_pads] = NULL;
682     if (link->dst)
683         link->dst->inputs[link->dstpad - link->dst->input_pads] = NULL;
684
685     ff_formats_unref(&link->in_formats);
686     ff_formats_unref(&link->out_formats);
687     ff_formats_unref(&link->in_samplerates);
688     ff_formats_unref(&link->out_samplerates);
689     ff_channel_layouts_unref(&link->in_channel_layouts);
690     ff_channel_layouts_unref(&link->out_channel_layouts);
691     avfilter_link_free(&link);
692 }
693
694 void avfilter_free(AVFilterContext *filter)
695 {
696     int i;
697
698     if (!filter)
699         return;
700
701     if (filter->graph)
702         ff_filter_graph_remove_filter(filter->graph, filter);
703
704     if (filter->filter->uninit)
705         filter->filter->uninit(filter);
706
707     for (i = 0; i < filter->nb_inputs; i++) {
708         free_link(filter->inputs[i]);
709     }
710     for (i = 0; i < filter->nb_outputs; i++) {
711         free_link(filter->outputs[i]);
712     }
713
714     if (filter->filter->priv_class)
715         av_opt_free(filter->priv);
716
717     av_freep(&filter->name);
718     av_freep(&filter->input_pads);
719     av_freep(&filter->output_pads);
720     av_freep(&filter->inputs);
721     av_freep(&filter->outputs);
722     av_freep(&filter->priv);
723     while(filter->command_queue){
724         ff_command_queue_pop(filter);
725     }
726     av_opt_free(filter);
727     av_expr_free(filter->enable);
728     filter->enable = NULL;
729     av_freep(&filter->var_values);
730     av_freep(&filter->internal);
731     av_free(filter);
732 }
733
734 static int process_options(AVFilterContext *ctx, AVDictionary **options,
735                            const char *args)
736 {
737     const AVOption *o = NULL;
738     int ret, count = 0;
739     char *av_uninit(parsed_key), *av_uninit(value);
740     const char *key;
741     int offset= -1;
742
743     if (!args)
744         return 0;
745
746     while (*args) {
747         const char *shorthand = NULL;
748
749         o = av_opt_next(ctx->priv, o);
750         if (o) {
751             if (o->type == AV_OPT_TYPE_CONST || o->offset == offset)
752                 continue;
753             offset = o->offset;
754             shorthand = o->name;
755         }
756
757         ret = av_opt_get_key_value(&args, "=", ":",
758                                    shorthand ? AV_OPT_FLAG_IMPLICIT_KEY : 0,
759                                    &parsed_key, &value);
760         if (ret < 0) {
761             if (ret == AVERROR(EINVAL))
762                 av_log(ctx, AV_LOG_ERROR, "No option name near '%s'\n", args);
763             else
764                 av_log(ctx, AV_LOG_ERROR, "Unable to parse '%s': %s\n", args,
765                        av_err2str(ret));
766             return ret;
767         }
768         if (*args)
769             args++;
770         if (parsed_key) {
771             key = parsed_key;
772             while ((o = av_opt_next(ctx->priv, o))); /* discard all remaining shorthand */
773         } else {
774             key = shorthand;
775         }
776
777         av_log(ctx, AV_LOG_DEBUG, "Setting '%s' to value '%s'\n", key, value);
778
779         if (av_opt_find(ctx, key, NULL, 0, 0)) {
780             ret = av_opt_set(ctx, key, value, 0);
781             if (ret < 0) {
782                 av_free(value);
783                 av_free(parsed_key);
784                 return ret;
785             }
786         } else {
787         av_dict_set(options, key, value, 0);
788         if ((ret = av_opt_set(ctx->priv, key, value, 0)) < 0) {
789             if (!av_opt_find(ctx->priv, key, NULL, 0, AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ)) {
790             if (ret == AVERROR_OPTION_NOT_FOUND)
791                 av_log(ctx, AV_LOG_ERROR, "Option '%s' not found\n", key);
792             av_free(value);
793             av_free(parsed_key);
794             return ret;
795             }
796         }
797         }
798
799         av_free(value);
800         av_free(parsed_key);
801         count++;
802     }
803
804     if (ctx->enable_str) {
805         ret = set_enable_expr(ctx, ctx->enable_str);
806         if (ret < 0)
807             return ret;
808     }
809     return count;
810 }
811
812 #if FF_API_AVFILTER_INIT_FILTER
813 int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque)
814 {
815     return avfilter_init_str(filter, args);
816 }
817 #endif
818
819 int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options)
820 {
821     int ret = 0;
822
823     ret = av_opt_set_dict(ctx, options);
824     if (ret < 0) {
825         av_log(ctx, AV_LOG_ERROR, "Error applying generic filter options.\n");
826         return ret;
827     }
828
829     if (ctx->filter->flags & AVFILTER_FLAG_SLICE_THREADS &&
830         ctx->thread_type & ctx->graph->thread_type & AVFILTER_THREAD_SLICE &&
831         ctx->graph->internal->thread_execute) {
832         ctx->thread_type       = AVFILTER_THREAD_SLICE;
833         ctx->internal->execute = ctx->graph->internal->thread_execute;
834     } else {
835         ctx->thread_type = 0;
836     }
837
838     if (ctx->filter->priv_class) {
839         ret = av_opt_set_dict(ctx->priv, options);
840         if (ret < 0) {
841             av_log(ctx, AV_LOG_ERROR, "Error applying options to the filter.\n");
842             return ret;
843         }
844     }
845
846     if (ctx->filter->init_opaque)
847         ret = ctx->filter->init_opaque(ctx, NULL);
848     else if (ctx->filter->init)
849         ret = ctx->filter->init(ctx);
850     else if (ctx->filter->init_dict)
851         ret = ctx->filter->init_dict(ctx, options);
852
853     return ret;
854 }
855
856 int avfilter_init_str(AVFilterContext *filter, const char *args)
857 {
858     AVDictionary *options = NULL;
859     AVDictionaryEntry *e;
860     int ret = 0;
861
862     if (args && *args) {
863         if (!filter->filter->priv_class) {
864             av_log(filter, AV_LOG_ERROR, "This filter does not take any "
865                    "options, but options were provided: %s.\n", args);
866             return AVERROR(EINVAL);
867         }
868
869 #if FF_API_OLD_FILTER_OPTS
870             if (   !strcmp(filter->filter->name, "format")     ||
871                    !strcmp(filter->filter->name, "noformat")   ||
872                    !strcmp(filter->filter->name, "frei0r")     ||
873                    !strcmp(filter->filter->name, "frei0r_src") ||
874                    !strcmp(filter->filter->name, "ocv")        ||
875                    !strcmp(filter->filter->name, "pan")        ||
876                    !strcmp(filter->filter->name, "pp")         ||
877                    !strcmp(filter->filter->name, "aevalsrc")) {
878             /* a hack for compatibility with the old syntax
879              * replace colons with |s */
880             char *copy = av_strdup(args);
881             char *p    = copy;
882             int nb_leading = 0; // number of leading colons to skip
883             int deprecated = 0;
884
885             if (!copy) {
886                 ret = AVERROR(ENOMEM);
887                 goto fail;
888             }
889
890             if (!strcmp(filter->filter->name, "frei0r") ||
891                 !strcmp(filter->filter->name, "ocv"))
892                 nb_leading = 1;
893             else if (!strcmp(filter->filter->name, "frei0r_src"))
894                 nb_leading = 3;
895
896             while (nb_leading--) {
897                 p = strchr(p, ':');
898                 if (!p) {
899                     p = copy + strlen(copy);
900                     break;
901                 }
902                 p++;
903             }
904
905             deprecated = strchr(p, ':') != NULL;
906
907             if (!strcmp(filter->filter->name, "aevalsrc")) {
908                 deprecated = 0;
909                 while ((p = strchr(p, ':')) && p[1] != ':') {
910                     const char *epos = strchr(p + 1, '=');
911                     const char *spos = strchr(p + 1, ':');
912                     const int next_token_is_opt = epos && (!spos || epos < spos);
913                     if (next_token_is_opt) {
914                         p++;
915                         break;
916                     }
917                     /* next token does not contain a '=', assume a channel expression */
918                     deprecated = 1;
919                     *p++ = '|';
920                 }
921                 if (p && *p == ':') { // double sep '::' found
922                     deprecated = 1;
923                     memmove(p, p + 1, strlen(p));
924                 }
925             } else
926             while ((p = strchr(p, ':')))
927                 *p++ = '|';
928
929             if (deprecated)
930                 av_log(filter, AV_LOG_WARNING, "This syntax is deprecated. Use "
931                        "'|' to separate the list items.\n");
932
933             av_log(filter, AV_LOG_DEBUG, "compat: called with args=[%s]\n", copy);
934             ret = process_options(filter, &options, copy);
935             av_freep(&copy);
936
937             if (ret < 0)
938                 goto fail;
939 #endif
940         } else {
941 #if CONFIG_MP_FILTER
942             if (!strcmp(filter->filter->name, "mp")) {
943                 char *escaped;
944
945                 if (!strncmp(args, "filter=", 7))
946                     args += 7;
947                 ret = av_escape(&escaped, args, ":=", AV_ESCAPE_MODE_BACKSLASH, 0);
948                 if (ret < 0) {
949                     av_log(filter, AV_LOG_ERROR, "Unable to escape MPlayer filters arg '%s'\n", args);
950                     goto fail;
951                 }
952                 ret = process_options(filter, &options, escaped);
953                 av_free(escaped);
954             } else
955 #endif
956             ret = process_options(filter, &options, args);
957             if (ret < 0)
958                 goto fail;
959         }
960     }
961
962     ret = avfilter_init_dict(filter, &options);
963     if (ret < 0)
964         goto fail;
965
966     if ((e = av_dict_get(options, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
967         av_log(filter, AV_LOG_ERROR, "No such option: %s.\n", e->key);
968         ret = AVERROR_OPTION_NOT_FOUND;
969         goto fail;
970     }
971
972 fail:
973     av_dict_free(&options);
974
975     return ret;
976 }
977
978 const char *avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx)
979 {
980     return pads[pad_idx].name;
981 }
982
983 enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx)
984 {
985     return pads[pad_idx].type;
986 }
987
988 static int default_filter_frame(AVFilterLink *link, AVFrame *frame)
989 {
990     return ff_filter_frame(link->dst->outputs[0], frame);
991 }
992
993 static int ff_filter_frame_framed(AVFilterLink *link, AVFrame *frame)
994 {
995     int (*filter_frame)(AVFilterLink *, AVFrame *);
996     AVFilterContext *dstctx = link->dst;
997     AVFilterPad *dst = link->dstpad;
998     AVFrame *out;
999     int ret;
1000     AVFilterCommand *cmd= link->dst->command_queue;
1001     int64_t pts;
1002
1003     if (link->closed) {
1004         av_frame_free(&frame);
1005         return AVERROR_EOF;
1006     }
1007
1008     if (!(filter_frame = dst->filter_frame))
1009         filter_frame = default_filter_frame;
1010
1011     /* copy the frame if needed */
1012     if (dst->needs_writable && !av_frame_is_writable(frame)) {
1013         av_log(link->dst, AV_LOG_DEBUG, "Copying data in avfilter.\n");
1014
1015         /* Maybe use ff_copy_buffer_ref instead? */
1016         switch (link->type) {
1017         case AVMEDIA_TYPE_VIDEO:
1018             out = ff_get_video_buffer(link, link->w, link->h);
1019             break;
1020         case AVMEDIA_TYPE_AUDIO:
1021             out = ff_get_audio_buffer(link, frame->nb_samples);
1022             break;
1023         default: return AVERROR(EINVAL);
1024         }
1025         if (!out) {
1026             av_frame_free(&frame);
1027             return AVERROR(ENOMEM);
1028         }
1029         av_frame_copy_props(out, frame);
1030
1031         switch (link->type) {
1032         case AVMEDIA_TYPE_VIDEO:
1033             av_image_copy(out->data, out->linesize, (const uint8_t **)frame->data, frame->linesize,
1034                           frame->format, frame->width, frame->height);
1035             break;
1036         case AVMEDIA_TYPE_AUDIO:
1037             av_samples_copy(out->extended_data, frame->extended_data,
1038                             0, 0, frame->nb_samples,
1039                             av_get_channel_layout_nb_channels(frame->channel_layout),
1040                             frame->format);
1041             break;
1042         default: return AVERROR(EINVAL);
1043         }
1044
1045         av_frame_free(&frame);
1046     } else
1047         out = frame;
1048
1049     while(cmd && cmd->time <= out->pts * av_q2d(link->time_base)){
1050         av_log(link->dst, AV_LOG_DEBUG,
1051                "Processing command time:%f command:%s arg:%s\n",
1052                cmd->time, cmd->command, cmd->arg);
1053         avfilter_process_command(link->dst, cmd->command, cmd->arg, 0, 0, cmd->flags);
1054         ff_command_queue_pop(link->dst);
1055         cmd= link->dst->command_queue;
1056     }
1057
1058     pts = out->pts;
1059     if (dstctx->enable_str) {
1060         int64_t pos = av_frame_get_pkt_pos(out);
1061         dstctx->var_values[VAR_N] = link->frame_count;
1062         dstctx->var_values[VAR_T] = pts == AV_NOPTS_VALUE ? NAN : pts * av_q2d(link->time_base);
1063         dstctx->var_values[VAR_POS] = pos == -1 ? NAN : pos;
1064
1065         dstctx->is_disabled = fabs(av_expr_eval(dstctx->enable, dstctx->var_values, NULL)) < 0.5;
1066         if (dstctx->is_disabled &&
1067             (dstctx->filter->flags & AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC))
1068             filter_frame = default_filter_frame;
1069     }
1070     ret = filter_frame(link, out);
1071     link->frame_count++;
1072     link->frame_requested = 0;
1073     ff_update_link_current_pts(link, pts);
1074     return ret;
1075 }
1076
1077 static int ff_filter_frame_needs_framing(AVFilterLink *link, AVFrame *frame)
1078 {
1079     int insamples = frame->nb_samples, inpos = 0, nb_samples;
1080     AVFrame *pbuf = link->partial_buf;
1081     int nb_channels = av_frame_get_channels(frame);
1082     int ret = 0;
1083
1084     link->flags |= FF_LINK_FLAG_REQUEST_LOOP;
1085     /* Handle framing (min_samples, max_samples) */
1086     while (insamples) {
1087         if (!pbuf) {
1088             AVRational samples_tb = { 1, link->sample_rate };
1089             pbuf = ff_get_audio_buffer(link, link->partial_buf_size);
1090             if (!pbuf) {
1091                 av_log(link->dst, AV_LOG_WARNING,
1092                        "Samples dropped due to memory allocation failure.\n");
1093                 return 0;
1094             }
1095             av_frame_copy_props(pbuf, frame);
1096             pbuf->pts = frame->pts +
1097                         av_rescale_q(inpos, samples_tb, link->time_base);
1098             pbuf->nb_samples = 0;
1099         }
1100         nb_samples = FFMIN(insamples,
1101                            link->partial_buf_size - pbuf->nb_samples);
1102         av_samples_copy(pbuf->extended_data, frame->extended_data,
1103                         pbuf->nb_samples, inpos,
1104                         nb_samples, nb_channels, link->format);
1105         inpos                   += nb_samples;
1106         insamples               -= nb_samples;
1107         pbuf->nb_samples += nb_samples;
1108         if (pbuf->nb_samples >= link->min_samples) {
1109             ret = ff_filter_frame_framed(link, pbuf);
1110             pbuf = NULL;
1111         }
1112     }
1113     av_frame_free(&frame);
1114     link->partial_buf = pbuf;
1115     return ret;
1116 }
1117
1118 int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
1119 {
1120     FF_TPRINTF_START(NULL, filter_frame); ff_tlog_link(NULL, link, 1); ff_tlog(NULL, " "); ff_tlog_ref(NULL, frame, 1);
1121
1122     /* Consistency checks */
1123     if (link->type == AVMEDIA_TYPE_VIDEO) {
1124         if (strcmp(link->dst->filter->name, "scale")) {
1125             av_assert1(frame->format                 == link->format);
1126             av_assert1(frame->width               == link->w);
1127             av_assert1(frame->height               == link->h);
1128         }
1129     } else {
1130         av_assert1(frame->format                == link->format);
1131         av_assert1(av_frame_get_channels(frame) == link->channels);
1132         av_assert1(frame->channel_layout        == link->channel_layout);
1133         av_assert1(frame->sample_rate           == link->sample_rate);
1134     }
1135
1136     /* Go directly to actual filtering if possible */
1137     if (link->type == AVMEDIA_TYPE_AUDIO &&
1138         link->min_samples &&
1139         (link->partial_buf ||
1140          frame->nb_samples < link->min_samples ||
1141          frame->nb_samples > link->max_samples)) {
1142         return ff_filter_frame_needs_framing(link, frame);
1143     } else {
1144         return ff_filter_frame_framed(link, frame);
1145     }
1146 }
1147
1148 const AVClass *avfilter_get_class(void)
1149 {
1150     return &avfilter_class;
1151 }