mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-12-07 05:39:49 +00:00
fftools/ffmpeg_dec: decode the first frame synchronously
In an ideal world, a filtergraph like `-i A -i B ... -filter_complex concat` would only keep resources in memory related to the file currently being output by the concat filter. So ideally, we'd open and fully decode A, then open and fully decode B, and so on. Practically, however, fftools wants to get one frame from each input file in order to initialize the filter graph (buffersrc parameters). So what happens currently is that fftools will request a single frame from each input A, B, etc that is plugged into the filtergraph. When using frame threading, the design of the decoder (ff_thread_receive_frame) is that it will not output any frames until we have received enough packets to saturate all threads. This, however, forces the decoder to buffer at least as many frames for each input file as we have threads, before outputting anything. By decoding the first frame synchronously, we avoid this issue and allow configuring the filter graph more quickly and without wasting excess resources on frames that will not (yet) be used.
This commit is contained in:
parent
5e56937b74
commit
929a2ced9b
1 changed files with 4 additions and 1 deletions
|
|
@ -744,11 +744,14 @@ static int packet_decode(DecoderPriv *dp, AVPacket *pkt, AVFrame *frame)
|
|||
while (1) {
|
||||
FrameData *fd;
|
||||
unsigned outputs_mask = 1;
|
||||
unsigned flags = 0;
|
||||
if (!dp->dec.frames_decoded)
|
||||
flags |= AV_CODEC_RECEIVE_FRAME_FLAG_SYNCHRONOUS;
|
||||
|
||||
av_frame_unref(frame);
|
||||
|
||||
update_benchmark(NULL);
|
||||
ret = avcodec_receive_frame(dec, frame);
|
||||
ret = avcodec_receive_frame2(dec, frame, flags);
|
||||
update_benchmark("decode_%s %s", type_desc, dp->parent_name);
|
||||
|
||||
if (ret == AVERROR(EAGAIN)) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue