OSDN Git Service

Maintain an accurate job ETA across pause/resume
authorjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Sat, 7 Nov 2009 17:29:03 +0000 (17:29 +0000)
committerjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Sat, 7 Nov 2009 17:29:03 +0000 (17:29 +0000)
Keeps track of how much time is spent paused and factors that into
the ETA calculation

git-svn-id: svn://localhost/HandBrake/trunk@2918 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/common.h
libhb/hb.c
libhb/sync.c

index 15ab737..b6c5e57 100644 (file)
@@ -277,6 +277,9 @@ struct hb_job_s
     volatile int  * die;
     volatile int    done;
 
+    uint64_t        st_pause_date;
+    uint64_t        st_paused;
+
     hb_fifo_t     * fifo_mpeg2;   /* MPEG-2 video ES */
     hb_fifo_t     * fifo_raw;     /* Raw pictures */
     hb_fifo_t     * fifo_sync;    /* Raw pictures, framerate corrected */
index 898650a..34fe53b 100644 (file)
@@ -1195,6 +1195,8 @@ void hb_pause( hb_handle_t * h )
         hb_lock( h->pause_lock );
         h->paused = 1;
 
+        hb_current_job( h )->st_pause_date = hb_get_date();
+
         hb_lock( h->state_lock );
         h->state.state = HB_STATE_PAUSED;
         hb_unlock( h->state_lock );
@@ -1209,6 +1211,13 @@ void hb_resume( hb_handle_t * h )
 {
     if( h->paused )
     {
+#define job hb_current_job( h )
+        if( job->st_pause_date != -1 )
+        {
+           job->st_paused += hb_get_date() - job->st_pause_date;
+        }
+#undef job
+
         hb_unlock( h->pause_lock );
         h->paused = 0;
     }
index 514b1fb..94b8411 100644 (file)
@@ -973,6 +973,8 @@ static void UpdateState( hb_work_object_t * w )
     if( !pv->count_frames )
     {
         pv->st_first = hb_get_date();
+        pv->job->st_pause_date = -1;
+        pv->job->st_paused = 0;
     }
     pv->count_frames++;
 
@@ -1000,7 +1002,7 @@ static void UpdateState( hb_work_object_t * w )
     {
         int eta;
         p.rate_avg = 1000.0 * (float) pv->st_counts[3] /
-            (float) ( pv->st_dates[3] - pv->st_first );
+            (float) ( pv->st_dates[3] - pv->st_first - pv->job->st_paused);
         eta = (float) ( pv->count_frames_max - pv->st_counts[3] ) /
             p.rate_avg;
         p.hours   = eta / 3600;