changeset 30176:6fb92182aff3

At startup and while seeking avoid to introduce pointless sleeps and possibly desync due to codec delay.
author reimar
date Mon, 04 Jan 2010 21:38:45 +0000
parents b7bb4a899a6b
children c02b833051a7
files mp_core.h mplayer.c
diffstat 2 files changed, 14 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mp_core.h	Mon Jan 04 21:27:08 2010 +0000
+++ b/mp_core.h	Mon Jan 04 21:38:45 2010 +0000
@@ -72,6 +72,8 @@
     // struct.
     int num_buffered_frames;
 
+    // used to retry decoding after startup/seeking to compensate for codec delay
+    int startup_decode_retry;
     // how long until we need to display the "current" frame
     float time_frame;
 
--- a/mplayer.c	Mon Jan 04 21:27:08 2010 +0000
+++ b/mplayer.c	Mon Jan 04 21:38:45 2010 +0000
@@ -203,6 +203,7 @@
 int benchmark=0;
 
 // options:
+#define DEFAULT_STARTUP_DECODE_RETRY 8
        int auto_quality=0;
 static int output_quality=0;
 
@@ -2539,6 +2540,7 @@
     if (demux_seek(mpctx->demuxer, amount, audio_delay, style) == 0)
 	return -1;
 
+    mpctx->startup_decode_retry = DEFAULT_STARTUP_DECODE_RETRY;
     if (mpctx->sh_video) {
 	current_module = "seek_video_reset";
 	resync_video_stream(mpctx->sh_video);
@@ -3697,6 +3699,7 @@
 audio_time_usage=0; video_time_usage=0; vout_time_usage=0;
 total_frame_cnt=0; drop_frame_cnt=0; // fix for multifile fps benchmark
 play_n_frames=play_n_frames_mf;
+mpctx->startup_decode_retry = DEFAULT_STARTUP_DECODE_RETRY;
 
 if(play_n_frames==0){
   mpctx->eof=PT_NEXT_ENTRY; goto goto_next_file;
@@ -3769,6 +3772,15 @@
 
   if (!mpctx->num_buffered_frames) {
       double frame_time = update_video(&blit_frame);
+      while (!blit_frame && mpctx->startup_decode_retry > 0) {
+          double delay = mpctx->delay;
+          // these initial decode failures are probably due to codec delay,
+          // ignore them and also their probably nonsense durations
+          update_video(&blit_frame);
+          mpctx->delay = delay;
+          mpctx->startup_decode_retry--;
+      }
+      mpctx->startup_decode_retry = 0;
       mp_dbg(MSGT_AVSYNC,MSGL_DBG2,"*** ftime=%5.3f ***\n",frame_time);
       if (mpctx->sh_video->vf_initialized < 0) {
 	  mp_msg(MSGT_CPLAYER,MSGL_FATAL, MSGTR_NotInitializeVOPorVO);