diff options
author | Anton Khirnov <anton@khirnov.net> | 2023-06-08 13:28:33 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2023-07-20 20:30:13 +0200 |
commit | 3a89e6d35261a261bae10fa856ea512385df6076 (patch) | |
tree | 42aa993b7d6ade3bc049e3c22cf0ff084b3000da /fftools/ffmpeg_filter.c | |
parent | 9d44eb8af5392ee208ca22e5997c27ab3aa2afc2 (diff) |
fftools/ffmpeg_filter: restrict reap_filters() to a single filtergraph
This is more natural, as all except one of its callers require
processing only one filtergraph.
Diffstat (limited to 'fftools/ffmpeg_filter.c')
-rw-r--r-- | fftools/ffmpeg_filter.c | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c index e14b8f0f3c..49e0800e6e 100644 --- a/fftools/ffmpeg_filter.c +++ b/fftools/ffmpeg_filter.c @@ -1695,23 +1695,22 @@ int filtergraph_is_simple(const FilterGraph *fg) return fgp->is_simple; } -int reap_filters(int flush) +int reap_filters(FilterGraph *fg, int flush) { - /* Reap all buffers present in the buffer sinks */ - for (OutputStream *ost = ost_iter(NULL); ost; ost = ost_iter(ost)) { - OutputFilterPriv *ofp; - FilterGraphPriv *fgp; - AVFrame *filtered_frame; - AVFilterContext *filter; - int ret = 0; + FilterGraphPriv *fgp = fgp_from_fg(fg); + AVFrame *filtered_frame = fgp->frame; - if (!ost->filter || !ost->filter->graph->graph) - continue; - fgp = fgp_from_fg(ost->filter->graph); - ofp = ofp_from_ofilter(ost->filter); - filter = ofp->filter; + if (!fg->graph) + return 0; + + /* Reap all buffers present in the buffer sinks */ + for (int i = 0; i < fg->nb_outputs; i++) { + OutputFilter *ofilter = fg->outputs[i]; + OutputStream *ost = ofilter->ost; + OutputFilterPriv *ofp = ofp_from_ofilter(ofilter); + AVFilterContext *filter = ofp->filter; - filtered_frame = fgp->frame; + int ret = 0; while (1) { FrameData *fd; @@ -1931,7 +1930,7 @@ int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame, int keep_reference) return ret; } - ret = reap_filters(0); + ret = reap_filters(fg, 0); if (ret < 0 && ret != AVERROR_EOF) { av_log(fg, AV_LOG_ERROR, "Error while filtering: %s\n", av_err2str(ret)); return ret; @@ -2000,10 +1999,10 @@ int fg_transcode_step(FilterGraph *graph, InputStream **best_ist) *best_ist = NULL; ret = avfilter_graph_request_oldest(graph->graph); if (ret >= 0) - return reap_filters(0); + return reap_filters(graph, 0); if (ret == AVERROR_EOF) { - reap_filters(1); + reap_filters(graph, 1); for (int i = 0; i < graph->nb_outputs; i++) { OutputFilter *ofilter = graph->outputs[i]; OutputFilterPriv *ofp = ofp_from_ofilter(ofilter); |