summaryrefslogtreecommitdiff
path: root/avplay.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2015-04-29 22:24:48 +0300
committerMartin Storsjö <martin@martin.st>2015-05-02 22:06:29 +0300
commit21180b73239c6360aa28496d4879713b7ba4a8e5 (patch)
tree7374d7425baa4bf310b9d15b71b61ed761e68735 /avplay.c
parent3ecb82dd4110108244373f007710df4c2ae572b6 (diff)
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.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/avplay.c b/avplay.c
index 5e5518eeac..e353a66245 100644
--- a/avplay.c
+++ b/avplay.c
@@ -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;
}