Mercurial > mplayer.hg
diff mplayer.c @ 34772:d32f75f79517
Decode last frames for codecs with delay.
Previously they would get lost, which would be particularly
extreme when decoding with frame multithreading and lots of threads.
author | reimar |
---|---|
date | Sun, 15 Apr 2012 15:01:09 +0000 |
parents | 8c1a27b26502 |
children | 9b8a830767f2 |
line wrap: on
line diff
--- a/mplayer.c Sun Apr 15 13:12:56 2012 +0000 +++ b/mplayer.c Sun Apr 15 15:01:09 2012 +0000 @@ -1798,6 +1798,7 @@ if (in_size < 0) { // try to extract last frames in case of decoder lag in_size = 0; + start = NULL; pts = MP_NOPTS_VALUE; hit_eof = 1; } @@ -2425,6 +2426,7 @@ int full_frame; do { + int flush; current_module = "video_read_frame"; frame_time = sh_video->next_frame_time; in_size = video_read_frame(sh_video, &sh_video->next_frame_time, @@ -2441,6 +2443,11 @@ mpctx->stream->eof = 0; } else #endif + flush = in_size < 0 && mpctx->d_video->eof; + if (flush) { + start = NULL; + in_size = 0; + } if (in_size < 0) return -1; if (in_size > max_framesize) @@ -2450,12 +2457,15 @@ #ifdef CONFIG_DVDNAV full_frame = 1; decoded_frame = mp_dvdnav_restore_smpi(&in_size, &start, decoded_frame); +#endif // still frame has been reached, no need to decode - if (in_size > 0 && !decoded_frame) -#endif + if ((in_size > 0 || flush) && !decoded_frame) decoded_frame = decode_video(sh_video, start, in_size, drop_frame, sh_video->pts, &full_frame); + if (flush && !decoded_frame) + return -1; + if (full_frame) { sh_video->timer += frame_time; if (mpctx->sh_audio)