mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-18 04:47:12 +00:00
lavfi/buffersrc: push the frame deeper if requested.
Reduce peak memory consumption with ffmpeg in certain cases.
This commit is contained in:
parent
3b64e3ea45
commit
0ff5567a30
@ -173,6 +173,20 @@ int attribute_align_arg av_buffersrc_add_frame_flags(AVFilterContext *ctx, AVFra
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int push_frame(AVFilterGraph *graph)
|
||||
{
|
||||
int ret;
|
||||
|
||||
while (1) {
|
||||
ret = ff_filter_graph_run_once(graph);
|
||||
if (ret == AVERROR(EAGAIN))
|
||||
break;
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
|
||||
AVFrame *frame, int flags)
|
||||
{
|
||||
@ -185,6 +199,11 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
|
||||
if (!frame) {
|
||||
s->eof = 1;
|
||||
ff_avfilter_link_set_in_status(ctx->outputs[0], AVERROR_EOF, AV_NOPTS_VALUE);
|
||||
if ((flags & AV_BUFFERSRC_FLAG_PUSH)) {
|
||||
ret = push_frame(ctx->graph);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
} else if (s->eof)
|
||||
return AVERROR(EINVAL);
|
||||
@ -239,6 +258,12 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
|
||||
if ((ret = ctx->output_pads[0].request_frame(ctx->outputs[0])) < 0)
|
||||
return ret;
|
||||
|
||||
if ((flags & AV_BUFFERSRC_FLAG_PUSH)) {
|
||||
ret = push_frame(ctx->graph);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user