mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-08 13:22:53 +02:00
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>
This commit is contained in:
commit
eb0f774d4b
@ -571,6 +571,9 @@ void avfilter_free(AVFilterContext *filter)
|
||||
if (!filter)
|
||||
return;
|
||||
|
||||
if (filter->graph)
|
||||
ff_filter_graph_remove_filter(filter->graph, filter);
|
||||
|
||||
if (filter->filter->uninit)
|
||||
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);
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
|
@ -59,12 +59,27 @@ AVFilterGraph *avfilter_graph_alloc(void)
|
||||
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)
|
||||
{
|
||||
if (!*graph)
|
||||
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)->scale_sws_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);
|
||||
if (!*filt_ctx)
|
||||
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;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -430,8 +430,8 @@ int avfilter_graph_parse2(AVFilterGraph *graph, const char *filters,
|
||||
return 0;
|
||||
|
||||
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);
|
||||
avfilter_inout_free(&open_inputs);
|
||||
avfilter_inout_free(&open_outputs);
|
||||
@ -498,8 +498,8 @@ int avfilter_graph_parse(AVFilterGraph *graph, const char *filters,
|
||||
|
||||
fail:
|
||||
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);
|
||||
}
|
||||
avfilter_inout_free(&inputs);
|
||||
|
@ -349,4 +349,9 @@ enum {
|
||||
*/
|
||||
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 */
|
||||
|
Loading…
Reference in New Issue
Block a user