mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +02:00
ffmpeg: fix reinitializing with threads while flushing
With threads the decoder has a delay and will thus have multiple frames at EOF left in its buffers which will be returned when flushing the decoder. The code that extracts such frames from the decoder at the end does not pull frames from the filtergraph, thus when one of these frames causes the filtergraph to be reinited, the frames still inside the graph at that point re lost This commit changes the flushing to be more similar to normal decoding and 1 frame at a time Fixes hqx fate with threads Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
7e6cf36453
commit
c69f729947
13
ffmpeg.c
13
ffmpeg.c
@ -2147,6 +2147,8 @@ static int output_packet(InputStream *ist, const AVPacket *pkt)
|
||||
if (!got_output) {
|
||||
continue;
|
||||
}
|
||||
if (got_output && !pkt)
|
||||
break;
|
||||
}
|
||||
|
||||
/* handle stream copy */
|
||||
@ -2185,7 +2187,7 @@ static int output_packet(InputStream *ist, const AVPacket *pkt)
|
||||
do_streamcopy(ist, ost, pkt);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return got_output;
|
||||
}
|
||||
|
||||
static void print_sdp(void)
|
||||
@ -3315,12 +3317,14 @@ static int process_input(int file_index)
|
||||
if (exit_on_error)
|
||||
exit_program(1);
|
||||
}
|
||||
ifile->eof_reached = 1;
|
||||
|
||||
for (i = 0; i < ifile->nb_streams; i++) {
|
||||
ist = input_streams[ifile->ist_index + i];
|
||||
if (ist->decoding_needed)
|
||||
output_packet(ist, NULL);
|
||||
if (ist->decoding_needed) {
|
||||
ret = output_packet(ist, NULL);
|
||||
if (ret>0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* mark all outputs that don't go through lavfi as finished */
|
||||
for (j = 0; j < nb_output_streams; j++) {
|
||||
@ -3332,6 +3336,7 @@ static int process_input(int file_index)
|
||||
}
|
||||
}
|
||||
|
||||
ifile->eof_reached = 1;
|
||||
return AVERROR(EAGAIN);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user