[vlc-devel] [PATCH] decoder: always rebase clock of pts only packets

Francois Cartegnie fcvlcdev at free.fr
Thu Apr 19 16:13:26 CEST 2018


In case of missing pts, the clock is not rebase to
system clock which then breaks when mixed with other streams.

Ex: rtsp video has no dts, but audio has since this is pts.
---
 src/input/decoder.c | 31 ++++++++++++++++++++++---------
 1 file changed, 22 insertions(+), 9 deletions(-)

diff --git a/src/input/decoder.c b/src/input/decoder.c
index 98817e6f39..8ab09f6aa3 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -781,6 +781,7 @@ static void DecoderFixTs( decoder_t *p_dec, mtime_t *pi_ts0, mtime_t *pi_ts1,
     const bool b_ephemere = pi_ts1 && *pi_ts0 == *pi_ts1;
     int i_rate;
 
+    int i_ret;
     if( *pi_ts0 > VLC_TS_INVALID )
     {
         *pi_ts0 += i_es_delay;
@@ -788,21 +789,33 @@ static void DecoderFixTs( decoder_t *p_dec, mtime_t *pi_ts0, mtime_t *pi_ts1,
             *pi_ts1 += i_es_delay;
         if( i_ts_bound != INT64_MAX )
             i_ts_bound += i_es_delay;
-        if( input_clock_ConvertTS( VLC_OBJECT(p_dec), p_clock, &i_rate, pi_ts0, pi_ts1, i_ts_bound ) ) {
-            const char *psz_name = module_get_name( p_dec->p_module, false );
-            if( pi_ts1 != NULL )
-                msg_Err(p_dec, "Could not convert timestamps %"PRId64
-                        ", %"PRId64" for %s", *pi_ts0, *pi_ts1, psz_name );
-            else
-                msg_Err(p_dec, "Could not convert timestamp %"PRId64" for %s", *pi_ts0, psz_name );
-            *pi_ts0 = VLC_TS_INVALID;
-        }
+        i_ret = input_clock_ConvertTS( VLC_OBJECT(p_dec), p_clock, &i_rate, pi_ts0, pi_ts1, i_ts_bound );
+    }
+    else if( pi_ts1 && *pi_ts1 > VLC_TS_INVALID )
+    {
+        i_ret = input_clock_ConvertTS( VLC_OBJECT(p_dec), p_clock, &i_rate, pi_ts1, NULL, i_ts_bound );
     }
     else
     {
+        i_ret = 0;
         i_rate = input_clock_GetRate( p_clock );
     }
 
+    if( i_ret != 0 )
+    {
+        const char *psz_name = module_get_name( p_dec->p_module, false );
+        if( pi_ts1 != NULL )
+        {
+            msg_Err(p_dec, "Could not convert timestamps %"PRId64
+                    ", %"PRId64" for %s", *pi_ts0, *pi_ts1, psz_name );
+            *pi_ts1 = VLC_TS_INVALID;
+            pi_ts1 = NULL; /* to skip rounding check */
+        }
+        else
+            msg_Err(p_dec, "Could not convert timestamp %"PRId64" for %s", *pi_ts0, psz_name );
+        *pi_ts0 = VLC_TS_INVALID;
+    }
+
     /* Do not create ephemere data because of rounding errors */
     if( !b_ephemere && pi_ts1 && *pi_ts0 == *pi_ts1 )
         *pi_ts1 += 1;
-- 
2.14.3



More information about the vlc-devel mailing list