lavfi: make filter_frame non-recursive.

A lot of changes happen at the same time:

- Add a framequeue fifo to AVFilterLink.

- split AVFilterLink.status into status_in and status_out: requires
  changes to the few filters and programs that use it directly
  (f_interleave, split, filtfmts).

- Add a field ready to AVFilterContext, marking when the filter is ready
  and its activation priority.

- Add flags to mark blocked links.

- Change ff_filter_frame() to enqueue the frame.

- Change all filtering functions to update the ready field and the
  blocked flags.

- Update ff_filter_graph_run_once() to use the ready field.

- buffersrc: always push the frame immediately.
This commit is contained in:
Nicolas George
2016-01-03 15:44:42 +01:00
parent 62b11db0a0
commit 02aa0701ae
10 changed files with 492 additions and 142 deletions

View File

@@ -30,6 +30,9 @@
#include "libavutil/mem.h"
#include "libavutil/opt.h"
#define FF_INTERNAL_FIELDS 1
#include "framequeue.h"
#include "avfilter.h"
#include "audio.h"
#include "formats.h"
@@ -78,7 +81,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
for (i = 0; i < ctx->nb_outputs; i++) {
AVFrame *buf_out;
if (ctx->outputs[i]->status)
if (ctx->outputs[i]->status_in)
continue;
buf_out = av_frame_clone(frame);
if (!buf_out) {