summaryrefslogtreecommitdiff
path: root/libavfilter/avfiltergraph.c
diff options
context:
space:
mode:
authorNicolas George <george@nsup.org>2016-12-24 13:17:21 +0100
committerNicolas George <george@nsup.org>2017-01-12 14:06:16 +0100
commit32c59a115d3cc757676b5384a5ea44b5a7a7b872 (patch)
treed2722b5332b0883bd5d67b40dcfcd8e12360d021 /libavfilter/avfiltergraph.c
parentc619a4e5259b6304475d889d0eae8ff661d518a7 (diff)
lavfi: do not call ff_filter_frame() with activate.
avfilter_graph_request_oldest() does work that should be done by either the filter or the application. The principle of this function, calling ff_request_frame() from outside the filter was always shaky. This version is less elegant since it requires making special cases for each filter, but it is more robust since it no longer calls ff_request_frame() directly without notifying the filter. Eventually, avfilter_graph_request_oldest() will be deprecated for a function to just run the graph.
Diffstat (limited to 'libavfilter/avfiltergraph.c')
-rw-r--r--libavfilter/avfiltergraph.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c
index 6670a4f2c8..97f242ebec 100644
--- a/libavfilter/avfiltergraph.c
+++ b/libavfilter/avfiltergraph.c
@@ -36,6 +36,7 @@
#include "framequeue.h"
#include "avfilter.h"
+#include "buffersink.h"
#include "formats.h"
#include "internal.h"
#include "thread.h"
@@ -1389,6 +1390,11 @@ int avfilter_graph_request_oldest(AVFilterGraph *graph)
while (graph->sink_links_count) {
oldest = graph->sink_links[0];
+ if (oldest->dst->filter->activate) {
+ /* For now, buffersink is the only filter implementing activate. */
+ return av_buffersink_get_frame_flags(oldest->dst, NULL,
+ AV_BUFFERSINK_FLAG_PEEK);
+ }
r = ff_request_frame(oldest);
if (r != AVERROR_EOF)
break;
@@ -1403,6 +1409,7 @@ int avfilter_graph_request_oldest(AVFilterGraph *graph)
}
if (!graph->sink_links_count)
return AVERROR_EOF;
+ av_assert1(!oldest->dst->filter->activate);
av_assert1(oldest->age_index >= 0);
frame_count = oldest->frame_count_out;
while (frame_count == oldest->frame_count_out) {