* commit '1565cbc65cbb9f95c11367314a080068895e0cf0': lavfi: make avfilter_free() remove the filter from its graph. Conflicts: libavfilter/avfilter.c libavfilter/avfiltergraph.c libavfilter/graphparser.c Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.0
| @@ -571,6 +571,9 @@ void avfilter_free(AVFilterContext *filter) | |||||
| if (!filter) | if (!filter) | ||||
| return; | return; | ||||
| if (filter->graph) | |||||
| ff_filter_graph_remove_filter(filter->graph, filter); | |||||
| if (filter->filter->uninit) | if (filter->filter->uninit) | ||||
| filter->filter->uninit(filter); | filter->filter->uninit(filter); | ||||
| @@ -873,7 +873,8 @@ int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *in | |||||
| int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque); | int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque); | ||||
| /** | /** | ||||
| * Free a filter context. | |||||
| * Free a filter context. This will also remove the filter from its | |||||
| * filtergraph's list of filters. | |||||
| * | * | ||||
| * @param filter the filter to free | * @param filter the filter to free | ||||
| */ | */ | ||||
| @@ -59,12 +59,27 @@ AVFilterGraph *avfilter_graph_alloc(void) | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| void ff_filter_graph_remove_filter(AVFilterGraph *graph, AVFilterContext *filter) | |||||
| { | |||||
| int i; | |||||
| for (i = 0; i < graph->nb_filters; i++) { | |||||
| if (graph->filters[i] == filter) { | |||||
| FFSWAP(AVFilterContext*, graph->filters[i], | |||||
| graph->filters[graph->nb_filters - 1]); | |||||
| graph->nb_filters--; | |||||
| return; | |||||
| } | |||||
| } | |||||
| } | |||||
| void avfilter_graph_free(AVFilterGraph **graph) | void avfilter_graph_free(AVFilterGraph **graph) | ||||
| { | { | ||||
| if (!*graph) | if (!*graph) | ||||
| return; | return; | ||||
| for (; (*graph)->nb_filters > 0; (*graph)->nb_filters--) | |||||
| avfilter_free((*graph)->filters[(*graph)->nb_filters - 1]); | |||||
| while ((*graph)->nb_filters) | |||||
| avfilter_free((*graph)->filters[0]); | |||||
| av_freep(&(*graph)->sink_links); | av_freep(&(*graph)->sink_links); | ||||
| av_freep(&(*graph)->scale_sws_opts); | av_freep(&(*graph)->scale_sws_opts); | ||||
| av_freep(&(*graph)->aresample_swr_opts); | av_freep(&(*graph)->aresample_swr_opts); | ||||
| @@ -103,10 +118,8 @@ int avfilter_graph_create_filter(AVFilterContext **filt_ctx, AVFilter *filt, | |||||
| *filt_ctx = avfilter_graph_alloc_filter(graph_ctx, filt, name); | *filt_ctx = avfilter_graph_alloc_filter(graph_ctx, filt, name); | ||||
| if (!*filt_ctx) | if (!*filt_ctx) | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| if ((ret = avfilter_init_filter(*filt_ctx, args, opaque)) < 0) { | |||||
| graph_ctx->filters[graph_ctx->nb_filters-1] = NULL; | |||||
| if ((ret = avfilter_init_filter(*filt_ctx, args, opaque)) < 0) | |||||
| goto fail; | goto fail; | ||||
| } | |||||
| return 0; | return 0; | ||||
| @@ -430,8 +430,8 @@ int avfilter_graph_parse2(AVFilterGraph *graph, const char *filters, | |||||
| return 0; | return 0; | ||||
| fail:end: | fail:end: | ||||
| for (; graph->nb_filters > 0; graph->nb_filters--) | |||||
| avfilter_free(graph->filters[graph->nb_filters - 1]); | |||||
| while (graph->nb_filters) | |||||
| avfilter_free(graph->filters[0]); | |||||
| av_freep(&graph->filters); | av_freep(&graph->filters); | ||||
| avfilter_inout_free(&open_inputs); | avfilter_inout_free(&open_inputs); | ||||
| avfilter_inout_free(&open_outputs); | avfilter_inout_free(&open_outputs); | ||||
| @@ -498,8 +498,8 @@ int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, | |||||
| fail: | fail: | ||||
| if (ret < 0) { | if (ret < 0) { | ||||
| for (; graph->nb_filters > 0; graph->nb_filters--) | |||||
| avfilter_free(graph->filters[graph->nb_filters - 1]); | |||||
| while (graph->nb_filters) | |||||
| avfilter_free(graph->filters[0]); | |||||
| av_freep(&graph->filters); | av_freep(&graph->filters); | ||||
| } | } | ||||
| avfilter_inout_free(&inputs); | avfilter_inout_free(&inputs); | ||||
| @@ -349,4 +349,9 @@ enum { | |||||
| */ | */ | ||||
| AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name); | AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name); | ||||
| /** | |||||
| * Remove a filter from a graph; | |||||
| */ | |||||
| void ff_filter_graph_remove_filter(AVFilterGraph *graph, AVFilterContext *filter); | |||||
| #endif /* AVFILTER_INTERNAL_H */ | #endif /* AVFILTER_INTERNAL_H */ | ||||