[vlc-devel] commit: Reduce locking and mdate count in input clock. (Laurent Aimar )

git version control git at videolan.org
Thu Jan 22 00:02:26 CET 2009


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Wed Jan 21 19:46:39 2009 +0100| [8f05427a612b1df706492bfb5c41468449deb9e8] | committer: Laurent Aimar 

Reduce locking and mdate count in input clock.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8f05427a612b1df706492bfb5c41468449deb9e8
---

 src/input/clock.c   |   43 +++++++++++++++++++++++++++++--------------
 src/input/clock.h   |   16 +++++++++++-----
 src/input/decoder.c |   24 +++++++++++++-----------
 3 files changed, 53 insertions(+), 30 deletions(-)

diff --git a/src/input/clock.c b/src/input/clock.c
index 62b3062..a89f8aa 100644
--- a/src/input/clock.c
+++ b/src/input/clock.c
@@ -136,7 +136,7 @@ struct input_clock_t
      * It is used to detect unexpected stream discontinuities */
     clock_point_t last;
 
-    /* Maximal timestamp returned by input_clock_GetTS (in system unit) */
+    /* Maximal timestamp returned by input_clock_ConvertTS (in system unit) */
     mtime_t i_ts_max;
 
     /* Clock drift */
@@ -325,13 +325,15 @@ mtime_t input_clock_GetWakeup( input_clock_t *cl )
 }
 
 /*****************************************************************************
- * input_clock_GetTS: manages a PTS or DTS
+ * input_clock_ConvertTS
  *****************************************************************************/
-mtime_t input_clock_GetTS( input_clock_t *cl, int *pi_rate,
-                           mtime_t i_ts, mtime_t i_ts_bound )
+int input_clock_ConvertTS( input_clock_t *cl,
+                           int *pi_rate, mtime_t *pi_ts0, mtime_t *pi_ts1,
+                           mtime_t i_ts_bound )
 {
-    mtime_t i_converted_ts;
+    mtime_t i_pts_delay;
 
+    assert( pi_ts0 );
     vlc_mutex_lock( &cl->lock );
 
     if( pi_rate )
@@ -340,24 +342,37 @@ mtime_t input_clock_GetTS( input_clock_t *cl, int *pi_rate,
     if( !cl->b_has_reference )
     {
         vlc_mutex_unlock( &cl->lock );
-        return 0;
+        *pi_ts0 = 0;
+        if( pi_ts1 )
+            *pi_ts1 = 0;
+        return VLC_EGENERIC;
     }
 
     /* */
-    i_converted_ts = ClockStreamToSystem( cl, i_ts + AvgGet( &cl->drift ) );
-    if( i_converted_ts > cl->i_ts_max )
-        cl->i_ts_max = i_converted_ts;
+    if( *pi_ts0 > 0 )
+    {
+        *pi_ts0 = ClockStreamToSystem( cl, *pi_ts0 + AvgGet( &cl->drift ) );
+        if( *pi_ts0 > cl->i_ts_max )
+            cl->i_ts_max = *pi_ts0;
+        *pi_ts0 += cl->i_pts_delay;
+    }
 
-    vlc_mutex_unlock( &cl->lock );
+    /* XXX we do not ipdate i_ts_max on purpose */
+    if( pi_ts1 && *pi_ts1 > 0 )
+    {
+        *pi_ts1 = ClockStreamToSystem( cl, *pi_ts1 + AvgGet( &cl->drift ) ) +
+                  cl->i_pts_delay;
+    }
 
-    i_converted_ts += cl->i_pts_delay;
+    i_pts_delay = cl->i_pts_delay;
+    vlc_mutex_unlock( &cl->lock );
 
     /* Check ts validity */
     if( i_ts_bound != INT64_MAX &&
-        i_converted_ts >= mdate() + cl->i_pts_delay + i_ts_bound )
-        return 0;
+        *pi_ts0 > 0 && *pi_ts0 >= mdate() + cl->i_pts_delay + i_ts_bound )
+        return VLC_EGENERIC;
 
-    return i_converted_ts;
+    return VLC_SUCCESS;
 }
 /*****************************************************************************
  * input_clock_GetRate: Return current rate
diff --git a/src/input/clock.h b/src/input/clock.h
index 7798b13..1384793 100644
--- a/src/input/clock.h
+++ b/src/input/clock.h
@@ -85,14 +85,20 @@ void    input_clock_ChangePause( input_clock_t *, bool b_paused, mtime_t i_date
 void    input_clock_ChangeSystemOrigin( input_clock_t *, mtime_t i_system );
 
 /**
- * This function converts a timestamp from stream clock to system clock.
+ * This function converts a pair of timestamp from stream clock to system clock.
  *
- * If pi_rate is provided it will be field with the rate value used for
+ * If pi_rate is provided it will be filled with the rate value used for
  * the conversion.
- * If i_ts_bound is not INT64_MAX, the value will be invalidated if not
- * before mdate() + i_pts_delay + i_ts_bound.
+ * p_ts0 is a pointer to a timestamp to be converted (in place) and must be non NULL.
+ * p_ts1 is a pointer to a timestamp to be converted (in place) and can be NULL.
+ *
+ * It will return VLC_EGENERIC if i_ts_bound is not INT64_MAX and if the value *p_ts0
+ * after conversion is not before the deadline mdate() + i_pts_delay + i_ts_bound.
+ * It will also return VLC_EGENERIC if the conversion cannot be done successfully. In
+ * this case, *p_ts0 and *p_ts1 will hold an invalid timestamp.
+ * Otherwise it will return VLC_SUCCESS.
  */
-mtime_t input_clock_GetTS( input_clock_t *, int *pi_rate, mtime_t i_ts, mtime_t i_ts_bound );
+int input_clock_ConvertTS( input_clock_t *, int *pi_rate, mtime_t *pi_ts0, mtime_t *pi_ts1, mtime_t i_ts_bound );
 
 /**
  * This function returns the current rate.
diff --git a/src/input/decoder.c b/src/input/decoder.c
index b3481cd..21f0733 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -652,7 +652,10 @@ static mtime_t DecoderGetDisplayDate( decoder_t *p_dec, mtime_t i_ts )
     if( !p_owner->p_clock || !i_ts )
         return i_ts;
 
-    return input_clock_GetTS( p_owner->p_clock, NULL, i_ts, INT64_MAX );
+    if( input_clock_ConvertTS( p_owner->p_clock, NULL, &i_ts, NULL, INT64_MAX ) )
+        return 0;
+
+    return i_ts;
 }
 static int DecoderGetDisplayRate( decoder_t *p_dec )
 {
@@ -1039,7 +1042,6 @@ static void DecoderFixTs( decoder_t *p_dec, mtime_t *pi_ts0, mtime_t *pi_ts1,
 {
     decoder_owner_sys_t *p_owner = p_dec->p_owner;
     input_clock_t   *p_clock = p_owner->p_clock;
-    int i_rate = 0;
 
     vlc_assert_locked( &p_owner->lock );
 
@@ -1048,24 +1050,24 @@ static void DecoderFixTs( decoder_t *p_dec, mtime_t *pi_ts0, mtime_t *pi_ts1,
     if( p_clock )
     {
         const bool b_ephemere = pi_ts1 && *pi_ts0 == *pi_ts1;
+        int i_rate;
 
         if( *pi_ts0 > 0 )
-            *pi_ts0 = input_clock_GetTS( p_clock, &i_rate, *pi_ts0 + i_es_delay, i_ts_bound );
-        if( pi_ts1 && *pi_ts1 > 0 )
         {
-            if( *pi_ts0 > 0 )
-                *pi_ts1 = input_clock_GetTS( p_clock, &i_rate, *pi_ts1 + i_es_delay, INT64_MAX );
-            else
-                *pi_ts1 = 0;
+            *pi_ts0 += i_es_delay;
+            if( pi_ts1 && *pi_ts1 > 0 )
+                *pi_ts1 += i_es_delay;
+            input_clock_ConvertTS( p_clock, &i_rate, pi_ts0, pi_ts1, i_ts_bound );
+        }
+        else
+        {
+            i_rate = input_clock_GetRate( p_clock );
         }
 
         /* Do not create ephemere data because of rounding errors */
         if( !b_ephemere && pi_ts1 && *pi_ts0 == *pi_ts1 )
             *pi_ts1 += 1;
 
-        if( i_rate <= 0 )
-            i_rate = input_clock_GetRate( p_clock ); 
-
         if( pi_duration )
             *pi_duration = ( *pi_duration * i_rate +
                                     INPUT_RATE_DEFAULT-1 ) / INPUT_RATE_DEFAULT;




More information about the vlc-devel mailing list