Browse Source

Merge commit '1565cbc65cbb9f95c11367314a080068895e0cf0'

* 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
Michael Niedermayer 12 years ago
parent
commit
eb0f774d4b
5 changed files with 32 additions and 10 deletions
  1. +3
    -0
      libavfilter/avfilter.c
  2. +2
    -1
      libavfilter/avfilter.h
  3. +18
    -5
      libavfilter/avfiltergraph.c
  4. +4
    -4
      libavfilter/graphparser.c
  5. +5
    -0
      libavfilter/internal.h

+ 3
- 0
libavfilter/avfilter.c View File

@@ -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);




+ 2
- 1
libavfilter/avfilter.h View File

@@ -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
*/ */


+ 18
- 5
libavfilter/avfiltergraph.c View File

@@ -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;




+ 4
- 4
libavfilter/graphparser.c View File

@@ -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);


+ 5
- 0
libavfilter/internal.h View File

@@ -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 */

Loading…
Cancel
Save