diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2015-07-19 14:24:19 +0200 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2015-07-19 15:36:54 +0200 |
commit | bc3f19641ce37d14f9cfd7e2693c4833b63fba7d (patch) | |
tree | d24e3d3a5823b99a225b58a19807448c9732b352 /ffmpeg_filter.c | |
parent | 8271a84094aafe142faa2305890413ddddea1110 (diff) | |
parent | 6d592fbd0d8e89ecade3fc93b36ea200213dc01c (diff) | |
download | ffmpeg-bc3f19641ce37d14f9cfd7e2693c4833b63fba7d.tar.gz |
Merge commit '6d592fbd0d8e89ecade3fc93b36ea200213dc01c'
* commit '6d592fbd0d8e89ecade3fc93b36ea200213dc01c':
avconv: split creating and (re-)configuring complex filtergraphs
Conflicts:
ffmpeg_filter.c
ffmpeg_opt.c
Merged-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'ffmpeg_filter.c')
-rw-r--r-- | ffmpeg_filter.c | 69 |
1 files changed, 45 insertions, 24 deletions
diff --git a/ffmpeg_filter.c b/ffmpeg_filter.c index 1ae8207eb0..b452fe0682 100644 --- a/ffmpeg_filter.c +++ b/ffmpeg_filter.c @@ -289,6 +289,45 @@ static void init_input_filter(FilterGraph *fg, AVFilterInOut *in) ist->filters[ist->nb_filters - 1] = fg->inputs[fg->nb_inputs - 1]; } +int init_complex_filtergraph(FilterGraph *fg) +{ + AVFilterInOut *inputs, *outputs, *cur; + AVFilterGraph *graph; + int ret = 0; + + /* this graph is only used for determining the kinds of inputs + * and outputs we have, and is discarded on exit from this function */ + graph = avfilter_graph_alloc(); + if (!graph) + return AVERROR(ENOMEM); + + ret = avfilter_graph_parse2(graph, fg->graph_desc, &inputs, &outputs); + if (ret < 0) + goto fail; + + for (cur = inputs; cur; cur = cur->next) + init_input_filter(fg, cur); + + for (cur = outputs; cur;) { + GROW_ARRAY(fg->outputs, fg->nb_outputs); + fg->outputs[fg->nb_outputs - 1] = av_mallocz(sizeof(*fg->outputs[0])); + if (!fg->outputs[fg->nb_outputs - 1]) + exit_program(1); + + fg->outputs[fg->nb_outputs - 1]->graph = fg; + fg->outputs[fg->nb_outputs - 1]->out_tmp = cur; + fg->outputs[fg->nb_outputs - 1]->type = avfilter_pad_get_type(cur->filter_ctx->output_pads, + cur->pad_idx); + cur = cur->next; + fg->outputs[fg->nb_outputs - 1]->out_tmp->next = NULL; + } + +fail: + avfilter_inout_free(&inputs); + avfilter_graph_free(&graph); + return ret; +} + static int insert_trim(int64_t start_time, int64_t duration, AVFilterContext **last_filter, int *pad_idx, const char *filter_name) @@ -904,7 +943,7 @@ static int configure_input_filter(FilterGraph *fg, InputFilter *ifilter, int configure_filtergraph(FilterGraph *fg) { AVFilterInOut *inputs, *outputs, *cur; - int ret, i, init = !fg->graph, simple = !fg->graph_desc; + int ret, i, simple = !fg->graph_desc; const char *graph_desc = simple ? fg->outputs[0]->ost->avfilter : fg->graph_desc; @@ -971,9 +1010,6 @@ int configure_filtergraph(FilterGraph *fg) return AVERROR(EINVAL); } - for (cur = inputs; !simple && init && cur; cur = cur->next) - init_input_filter(fg, cur); - for (cur = inputs, i = 0; cur; cur = cur->next, i++) if ((ret = configure_input_filter(fg, fg->inputs[i], cur)) < 0) { avfilter_inout_free(&inputs); @@ -982,27 +1018,12 @@ int configure_filtergraph(FilterGraph *fg) } avfilter_inout_free(&inputs); - if (!init || simple) { - /* we already know the mappings between lavfi outputs and output streams, - * so we can finish the setup */ - for (cur = outputs, i = 0; cur; cur = cur->next, i++) - configure_output_filter(fg, fg->outputs[i], cur); - avfilter_inout_free(&outputs); + for (cur = outputs, i = 0; cur; cur = cur->next, i++) + configure_output_filter(fg, fg->outputs[i], cur); + avfilter_inout_free(&outputs); - if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0) - return ret; - } else { - /* wait until output mappings are processed */ - for (cur = outputs; cur;) { - GROW_ARRAY(fg->outputs, fg->nb_outputs); - if (!(fg->outputs[fg->nb_outputs - 1] = av_mallocz(sizeof(*fg->outputs[0])))) - exit_program(1); - fg->outputs[fg->nb_outputs - 1]->graph = fg; - fg->outputs[fg->nb_outputs - 1]->out_tmp = cur; - cur = cur->next; - fg->outputs[fg->nb_outputs - 1]->out_tmp->next = NULL; - } - } + if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0) + return ret; fg->reconfiguration = 1; |