diff options
author | Gyan Doshi <gyandoshi@gmail.com> | 2018-03-15 16:45:51 +0530 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2018-03-20 22:59:40 +0100 |
commit | 8ad83044b47a2544907562f5e8fd11dd1a62ef82 (patch) | |
tree | 0b489106500075ee3a1233b028c7dc47e73d2732 /fftools/ffmpeg.c | |
parent | 2aac5ad2f72cf9a1f024187b78f949c5613ceacd (diff) | |
download | ffmpeg-8ad83044b47a2544907562f5e8fd11dd1a62ef82.tar.gz |
ffmpeg.c - drain all decoded frames during stream_loop flush
When a decoded stream is being looped, after each post-EOF rewind,
decoders are flushed in seek_to_start(). This only drains 1 frame, and
thus the output has a few frames missing at the tail of each iteration
except the last.
With this patch, process_input is looped till process_input_packet
reaches EOF.
Fixes #7081
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'fftools/ffmpeg.c')
-rw-r--r-- | fftools/ffmpeg.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index ee7258fcd1..3c18e06713 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -4170,12 +4170,6 @@ static int seek_to_start(InputFile *ifile, AVFormatContext *is) ist = input_streams[ifile->ist_index + i]; avctx = ist->dec_ctx; - // flush decoders - if (ist->decoding_needed) { - process_input_packet(ist, NULL, 1); - avcodec_flush_buffers(avctx); - } - /* duration is the length of the last frame in a stream * when audio stream is present we don't care about * last video frame length because it's not defined exactly */ @@ -4244,6 +4238,17 @@ static int process_input(int file_index) return ret; } if (ret < 0 && ifile->loop) { + AVCodecContext *avctx; + for (i = 0; i < ifile->nb_streams; i++) { + ist = input_streams[ifile->ist_index + i]; + avctx = ist->dec_ctx; + if (ist->decoding_needed) { + ret = process_input_packet(ist, NULL, 1); + if (ret>0) + return 0; + avcodec_flush_buffers(avctx); + } + } ret = seek_to_start(ifile, is); if (ret < 0) av_log(NULL, AV_LOG_WARNING, "Seek to start failed.\n"); |