changeset 20887:bf66030474ae

Split some from main() into separate functions.
author uau
date Tue, 14 Nov 2006 01:40:06 +0000
parents c215b6e501a5
children 0c750c3c1aed
files mplayer.c
diffstat 1 files changed, 116 insertions(+), 103 deletions(-) [+]
line wrap: on
line diff
--- a/mplayer.c	Mon Nov 13 21:12:25 2006 +0000
+++ b/mplayer.c	Tue Nov 14 01:40:06 2006 +0000
@@ -2804,6 +2804,119 @@
         *dx, *dy, vo_screenwidth, vo_screenheight,  vo_dwidth, vo_dheight, vo_fs);
 }
 
+#ifdef HAVE_RTC
+    int rtc_fd = -1;
+#endif
+
+static float timing_sleep(float time_frame)
+{
+#ifdef HAVE_RTC
+    if (rtc_fd >= 0){
+	// -------- RTC -----------
+	current_module="sleep_rtc";
+        while (time_frame > 0.000) {
+	    unsigned long rtc_ts;
+	    if (read(rtc_fd, &rtc_ts, sizeof(rtc_ts)) <= 0)
+		mp_msg(MSGT_CPLAYER, MSGL_ERR, MSGTR_LinuxRTCReadError, strerror(errno));
+    	    time_frame -= GetRelativeTime();
+	}
+    } else
+#endif
+#ifdef SYS_DARWIN
+	{
+	    current_module = "sleep_darwin";
+	    while (time_frame > 0.005) {
+		usec_sleep(1000000*time_frame);
+		time_frame -= GetRelativeTime();
+	    }
+	}
+#else
+    {
+	// assume kernel HZ=100 for softsleep, works with larger HZ but with
+	// unnecessarily high CPU usage
+	float margin = softsleep ? 0.011 : 0;
+	current_module = "sleep_timer";
+	while (time_frame > margin) {
+	    usec_sleep(1000000 * (time_frame - margin));
+	    time_frame -= GetRelativeTime();
+	}
+	if (softsleep){
+	    current_module = "sleep_soft";
+	    if (time_frame < 0)
+		mp_msg(MSGT_AVSYNC, MSGL_WARN, MSGTR_SoftsleepUnderflow);
+	    while (time_frame > 0)
+		time_frame-=GetRelativeTime(); // burn the CPU
+	}
+    }
+#endif /* SYS_DARWIN */
+    return time_frame;
+}
+
+static void adjust_sync_and_print_status(int between_frames, float timing_error)
+{
+    current_module="av_sync";
+
+    if(sh_audio){
+	double a_pts, v_pts;
+
+	if (autosync)
+	    /*
+	     * If autosync is enabled, the value for delay must be calculated
+	     * a bit differently.  It is set only to the difference between
+	     * the audio and video timers.  Any attempt to include the real
+	     * or corrected delay causes the pts_correction code below to
+	     * try to correct for the changes in delay which autosync is
+	     * trying to measure.  This keeps the two from competing, but still
+	     * allows the code to correct for PTS drift *only*.  (Using a delay
+	     * value here, even a "corrected" one, would be incompatible with
+	     * autosync mode.)
+	     */
+	    a_pts = written_audio_pts(sh_audio, d_audio) - sh_audio->delay;
+	else
+	    a_pts = playing_audio_pts(sh_audio, d_audio, audio_out);
+
+	v_pts = sh_video ? sh_video->pts : d_video->pts;
+
+	{
+	    static int drop_message=0;
+	    double AV_delay = a_pts - audio_delay - v_pts;
+	    double x;
+	    if (AV_delay>0.5 && drop_frame_cnt>50 && drop_message==0){
+		++drop_message;
+		mp_msg(MSGT_AVSYNC,MSGL_WARN,MSGTR_SystemTooSlow);
+	    }
+	    if (autosync)
+		x = AV_delay*0.1f;
+	    else
+		/* Do not correct target time for the next frame if this frame
+		 * was late not because of wrong target time but because the
+		 * target time could not be met */
+		x = (AV_delay + timing_error * playback_speed) * 0.1f;
+	    if (x < -max_pts_correction)
+		x = -max_pts_correction;
+	    else if (x> max_pts_correction)
+		x = max_pts_correction;
+	    if (default_max_pts_correction >= 0)
+		max_pts_correction = default_max_pts_correction;
+	    else
+		max_pts_correction = sh_video->frametime*0.10; // +-10% of time
+	    if (!between_frames) {
+		sh_audio->delay+=x;
+		c_total+=x;
+	    }
+	    if(!quiet)
+		print_status(a_pts - audio_delay, AV_delay, c_total);
+	}
+    
+    } else {
+	// No audio:
+    
+	if (!quiet)
+	    print_status(0, 0, 0);
+    }
+}
+
+
 int main(int argc,char* argv[]){
 
 
@@ -2813,10 +2926,6 @@
 
 // movie info:
 
-#ifdef HAVE_RTC
-int rtc_fd=-1;
-#endif
-
 /* Flag indicating whether MPlayer should exit without playing anything. */
 int opt_exit = 0;
 
@@ -4312,49 +4421,8 @@
 time_frame/=playback_speed;
 
 // flag 256 means: libvo driver does its timing (dvb card)
-if(time_frame>0.001 && !(vo_flags&256)){
-
-#ifdef HAVE_RTC
-    if(rtc_fd>=0){
-	// -------- RTC -----------
-	current_module="sleep_rtc";
-        while (time_frame > 0.000) {
-	    unsigned long rtc_ts;
-	    if (read (rtc_fd, &rtc_ts, sizeof(rtc_ts)) <= 0)
-		    mp_msg(MSGT_CPLAYER, MSGL_ERR, MSGTR_LinuxRTCReadError, strerror(errno));
-    	    time_frame-=GetRelativeTime();
-	}
-    } else
-#endif
-#ifdef SYS_DARWIN
-    {
-		current_module="sleep_darwin";
-        while(time_frame>0.005) {
-			usec_sleep(1000000*time_frame);
-			time_frame-=GetRelativeTime();
-        }
-	}
-#else
-    {
-	// -------- TIMER + SOFTSLEEP -----------
-	// assume kernel HZ=100 for softsleep, works with larger HZ but with
-	// unnecessarily high CPU usage
-	float margin = softsleep ? 0.011 : 0;
-	current_module="sleep_timer";
-	while (time_frame > margin) {
-	    usec_sleep(1000000 * (time_frame - margin));
-	    time_frame -= GetRelativeTime();
-	}
-	if(softsleep){
-	    current_module="sleep_soft";
-	    if(time_frame<0) mp_msg(MSGT_AVSYNC, MSGL_WARN, MSGTR_SoftsleepUnderflow);
-	    while(time_frame>0) time_frame-=GetRelativeTime(); // burn the CPU
-	}
-    }
-#endif /* SYS_DARWIN */
-}
-
-//if(!frame_time_remaining){	// should we display the frame now?
+if(time_frame>0.001 && !(vo_flags&256))
+    time_frame = timing_sleep(time_frame);
 
 //====================== FLIP PAGE (VIDEO BLT): =========================
 
@@ -4403,62 +4471,7 @@
         }
 //====================== A-V TIMESTAMP CORRECTION: =========================
 
-  current_module="av_sync";
-
-  if(sh_audio){
-    double a_pts, v_pts;
-
-    if (autosync)
-      /*
-       * If autosync is enabled, the value for delay must be calculated
-       * a bit differently.  It is set only to the difference between
-       * the audio and video timers.  Any attempt to include the real
-       * or corrected delay causes the pts_correction code below to
-       * try to correct for the changes in delay which autosync is
-       * trying to measure.  This keeps the two from competing, but still
-       * allows the code to correct for PTS drift *only*.  (Using a delay
-       * value here, even a "corrected" one, would be incompatible with
-       * autosync mode.)
-       */
-	a_pts = written_audio_pts(sh_audio, d_audio) - sh_audio->delay;
-    else
-	a_pts = playing_audio_pts(sh_audio, d_audio, audio_out);
-
-    v_pts=sh_video ? sh_video->pts : d_video->pts;
-
-      {
-	static int drop_message=0;
-	double AV_delay = a_pts - audio_delay - v_pts;
-	double x;
-	if(AV_delay>0.5 && drop_frame_cnt>50 && drop_message==0){
-	  ++drop_message;
-	  mp_msg(MSGT_AVSYNC,MSGL_WARN,MSGTR_SystemTooSlow);
-	}
-	if (autosync)
-	    x = AV_delay*0.1f;
-	else
-	    /* Do not correct target time for the next frame if this frame
-	     * was late not because of wrong target time but because the
-	     * target time could not be met */
-	    x = (AV_delay + time_frame * playback_speed) * 0.1f;
-        if(x<-max_pts_correction) x=-max_pts_correction; else
-        if(x> max_pts_correction) x= max_pts_correction;
-        if(default_max_pts_correction>=0)
-          max_pts_correction=default_max_pts_correction;
-        else
-          max_pts_correction=sh_video->frametime*0.10; // +-10% of time
-	if(!frame_time_remaining){ sh_audio->delay+=x; c_total+=x;} // correction
-        if(!quiet)
-          print_status(a_pts - audio_delay, AV_delay, c_total);
-      }
-    
-  } else {
-    // No audio:
-    
-    if(!quiet)
-      print_status(0, 0, 0);
-
-  }
+  adjust_sync_and_print_status(frame_time_remaining, time_frame);
 
 //============================ Auto QUALITY ============================