Mercurial > mplayer.hg
diff mencoder.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 | cc658103f214 |
children | a8e554318057 |
line wrap: on
line diff
--- a/mencoder.c Sun Apr 15 13:12:56 2012 +0000 +++ b/mencoder.c Sun Apr 15 15:01:09 2012 +0000 @@ -232,6 +232,7 @@ int in_size; float frame_time; int already_read; + int flush; } s_frame_data; static edl_record_ptr edl_records = NULL; ///< EDL entries memory area @@ -433,6 +434,11 @@ if (!frame_data->already_read) { // when called after fixdelay, a frame is already read frame_data->in_size = video_read_frame(sh_video, &frame_data->frame_time, &frame_data->start, force_fps); + frame_data->flush = frame_data->in_size < 0 && d_video->eof; + if (frame_data->flush) { + frame_data->in_size = 0; + frame_data->start = NULL; + } if(frame_data->in_size<0) return 2; sh_video->timer += frame_data->frame_time; } @@ -454,6 +460,8 @@ void *decoded_frame = decode_video(sh_video, frame_data->start, frame_data->in_size, !softskip, MP_NOPTS_VALUE, NULL); if (decoded_frame) filter_video(sh_video, decoded_frame, MP_NOPTS_VALUE); + else if (frame_data->flush) + return 2; } if (print_info) mp_msg(MSGT_MENCODER, MSGL_STATUS, @@ -1392,6 +1400,11 @@ if (!frame_data.already_read) { frame_data.in_size=video_read_frame(sh_video,&frame_data.frame_time,&frame_data.start,force_fps); + frame_data.flush = frame_data.in_size < 0 && d_video->eof; + if (frame_data.flush) { + frame_data.in_size = 0; + frame_data.start = NULL; + } sh_video->timer+=frame_data.frame_time; } frame_data.frame_time /= playback_speed; @@ -1469,6 +1482,8 @@ ((vf_instance_t *)sh_video->vfilter)->control(sh_video->vfilter, VFCTRL_SKIP_NEXT_FRAME, 0) != CONTROL_TRUE); void *decoded_frame = decode_video(sh_video,frame_data.start,frame_data.in_size, drop_frame, MP_NOPTS_VALUE, NULL); + if (frame_data.flush && !decoded_frame) + at_eof = 1; if (did_seek && sh_video->pts != MP_NOPTS_VALUE) { did_seek = 0; sub_offset = sh_video->pts;