1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-01-24 13:56:33 +02:00

lavfi: make avfilter_free() remove the filter from its graph.

This commit is contained in:
Anton Khirnov 2013-03-31 13:02:55 +02:00
parent 111367263a
commit 1565cbc65c
5 changed files with 31 additions and 7 deletions

View File

@ -430,6 +430,9 @@ void avfilter_free(AVFilterContext *filter)
int i; int i;
AVFilterLink *link; AVFilterLink *link;
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);

View File

@ -658,7 +658,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
*/ */

View File

@ -46,12 +46,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)->scale_sws_opts); av_freep(&(*graph)->scale_sws_opts);
av_freep(&(*graph)->resample_lavr_opts); av_freep(&(*graph)->resample_lavr_opts);
av_freep(&(*graph)->filters); av_freep(&(*graph)->filters);

View File

@ -430,8 +430,8 @@ int avfilter_graph_parse2(AVFilterGraph *graph, const char *filters,
return 0; return 0;
fail: fail:
for (; graph->nb_filters > 0; graph->nb_filters--) while (graph->nb_filters)
avfilter_free(graph->filters[graph->nb_filters - 1]); 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);
@ -495,8 +495,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--) while (graph->nb_filters)
avfilter_free(graph->filters[graph->nb_filters - 1]); avfilter_free(graph->filters[0]);
av_freep(&graph->filters); av_freep(&graph->filters);
} }
avfilter_inout_free(&inputs); avfilter_inout_free(&inputs);

View File

@ -206,4 +206,9 @@ int ff_filter_frame(AVFilterLink *link, AVFrame *frame);
*/ */
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 */