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