diff options
author | Martin Storsjö <martin@martin.st> | 2015-04-29 22:24:48 +0300 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2015-05-02 22:06:29 +0300 |
commit | 21180b73239c6360aa28496d4879713b7ba4a8e5 (patch) | |
tree | 7374d7425baa4bf310b9d15b71b61ed761e68735 /avplay.c | |
parent | 3ecb82dd4110108244373f007710df4c2ae572b6 (diff) | |
download | ffmpeg-21180b73239c6360aa28496d4879713b7ba4a8e5.tar.gz |
avplay: Factorize code for adding filters to the filter pipeline
Significantly based on a patch by Clément Bœsch.
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'avplay.c')
-rw-r--r-- | avplay.c | 34 |
1 files changed, 24 insertions, 10 deletions
@@ -1504,7 +1504,7 @@ static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const c char sws_flags_str[128]; char buffersrc_args[256]; int ret; - AVFilterContext *filt_src = NULL, *filt_out = NULL, *filt_format; + AVFilterContext *filt_src = NULL, *filt_out = NULL, *last_filter; AVCodecContext *codec = is->video_st->codec; snprintf(sws_flags_str, sizeof(sws_flags_str), "flags=%"PRId64, sws_flags); @@ -1526,13 +1526,27 @@ static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const c "out", NULL, NULL, graph)) < 0) return ret; - if ((ret = avfilter_graph_create_filter(&filt_format, - avfilter_get_by_name("format"), - "format", "yuv420p", NULL, graph)) < 0) - return ret; - if ((ret = avfilter_link(filt_format, 0, filt_out, 0)) < 0) - return ret; - + last_filter = filt_out; + +/* Note: this macro adds a filter before the lastly added filter, so the + * processing order of the filters is in reverse */ +#define INSERT_FILT(name, arg) do { \ + AVFilterContext *filt_ctx; \ + \ + ret = avfilter_graph_create_filter(&filt_ctx, \ + avfilter_get_by_name(name), \ + "avplay_" name, arg, NULL, graph); \ + if (ret < 0) \ + return ret; \ + \ + ret = avfilter_link(filt_ctx, 0, last_filter, 0); \ + if (ret < 0) \ + return ret; \ + \ + last_filter = filt_ctx; \ +} while (0) + + INSERT_FILT("format", "yuv420p"); if (vfilters) { AVFilterInOut *outputs = avfilter_inout_alloc(); @@ -1544,14 +1558,14 @@ static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const c outputs->next = NULL; inputs->name = av_strdup("out"); - inputs->filter_ctx = filt_format; + inputs->filter_ctx = last_filter; inputs->pad_idx = 0; inputs->next = NULL; if ((ret = avfilter_graph_parse(graph, vfilters, inputs, outputs, NULL)) < 0) return ret; } else { - if ((ret = avfilter_link(filt_src, 0, filt_format, 0)) < 0) + if ((ret = avfilter_link(filt_src, 0, last_filter, 0)) < 0) return ret; } |