]> git.sesse.net Git - vlc/blobdiff - modules/demux/ps.c
ASF: do not display GUID when not in debug mode
[vlc] / modules / demux / ps.c
index 51361bf5b0e44d21e354c837d554ac3e162e83a4..e363f15366c823c6b5f90fbd712acdf54ed0c483 100644 (file)
@@ -82,6 +82,7 @@ struct demux_sys_t
     ps_track_t  tk[PS_TK_COUNT];
 
     int64_t     i_scr;
+    int64_t     i_last_scr;
     int         i_mux_rate;
     int64_t     i_length;
     int         i_time_track;
@@ -134,6 +135,7 @@ static int OpenCommon( vlc_object_t *p_this, bool b_force )
     /* Init p_sys */
     p_sys->i_mux_rate = 0;
     p_sys->i_scr      = -1;
+    p_sys->i_last_scr = -1;
     p_sys->i_length   = -1;
     p_sys->i_current_pts = (mtime_t) 0;
     p_sys->i_time_track = -1;
@@ -218,7 +220,7 @@ static int Demux2( demux_t *p_demux, bool b_end )
     if( (i_id = ps_pkt_id( p_pkt )) >= 0xc0 )
     {
         ps_track_t *tk = &p_sys->tk[PS_ID_TO_TK(i_id)];
-        if( !ps_pkt_parse_pes( p_pkt, tk->i_skip ) )
+        if( !ps_pkt_parse_pes( p_pkt, tk->i_skip ) && p_pkt->i_pts > VLC_TS_INVALID )
         {
             if( b_end && p_pkt->i_pts > tk->i_last_pts )
             {
@@ -252,7 +254,7 @@ static void FindLength( demux_t *p_demux )
 
         /* Check end */
         i_size = stream_Size( p_demux->s );
-        i_end = __MAX( 0, __MIN( 200000, i_size ) );
+        i_end = VLC_CLIP( i_size, 0, 200000 );
         stream_Seek( p_demux->s, i_size - i_end );
 
         i = 0;
@@ -260,20 +262,21 @@ static void FindLength( demux_t *p_demux )
         if( i_current_pos >= 0 ) stream_Seek( p_demux->s, i_current_pos );
     }
 
+    /* Find the longest track */
     for( int i = 0; i < PS_TK_COUNT; i++ )
     {
         ps_track_t *tk = &p_sys->tk[i];
-        if( tk->i_first_pts >= 0 && tk->i_last_pts > 0 )
-            if( tk->i_last_pts > tk->i_first_pts )
+        if( tk->i_first_pts >= 0 && tk->i_last_pts > 0 &&
+            tk->i_last_pts > tk->i_first_pts )
+        {
+            int64_t i_length = (int64_t)tk->i_last_pts - tk->i_first_pts;
+            if( i_length > p_sys->i_length )
             {
-                int64_t i_length = (int64_t)tk->i_last_pts - tk->i_first_pts;
-                if( i_length > p_sys->i_length )
-                {
-                    p_sys->i_length = i_length;
-                    p_sys->i_time_track = i;
-                    msg_Dbg( p_demux, "we found a length of: %"PRId64, p_sys->i_length );
-                }
+                p_sys->i_length = i_length;
+                p_sys->i_time_track = i;
+                msg_Dbg( p_demux, "we found a length of: %"PRId64, p_sys->i_length );
             }
+        }
     }
 }
 
@@ -321,6 +324,7 @@ static int Demux( demux_t *p_demux )
     case 0x1ba:
         if( !ps_pkt_parse_pack( p_pkt, &p_sys->i_scr, &i_mux_rate ) )
         {
+            p_sys->i_last_scr = p_sys->i_scr;
             if( !p_sys->b_have_pack ) p_sys->b_have_pack = true;
             /* done later on to work around bad vcd/svcd streams */
             /* es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_sys->i_scr ); */
@@ -394,6 +398,7 @@ static int Demux( demux_t *p_demux )
                   tk->fmt.i_codec == VLC_CODEC_CVD ) )
             {
                 p_sys->i_scr = -1;
+                p_sys->i_last_scr = -1;
             }
 
             if( p_sys->i_scr >= 0 )
@@ -402,11 +407,7 @@ static int Demux( demux_t *p_demux )
             p_sys->i_scr = -1;
 
             if( tk->b_seen && tk->es &&
-                (
-#ifdef ZVBI_COMPILED /* FIXME!! */
-                tk->fmt.i_codec == VLC_CODEC_TELETEXT ||
-#endif
-                !ps_pkt_parse_pes( p_pkt, tk->i_skip ) ) )
+                !ps_pkt_parse_pes( p_pkt, tk->i_skip ) )
             {
                 if( !b_new && !p_sys->b_have_pack &&
                     (tk->fmt.i_cat == AUDIO_ES) &&
@@ -416,6 +417,13 @@ static int Demux( demux_t *p_demux )
                     msg_Dbg( p_demux, "force SCR: %"PRId64, p_pkt->i_pts );
                     es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_pkt->i_pts );
                 }
+                if( tk->fmt.i_codec == VLC_CODEC_TELETEXT &&
+                    p_pkt->i_pts <= VLC_TS_INVALID && p_sys->i_last_scr >= 0 )
+                {
+                    /* Teletext may have missing PTS (ETSI EN 300 472 Annexe A)
+                     * In this case use the last SCR + 40ms */
+                    p_pkt->i_pts = VLC_TS_0 + p_sys->i_last_scr + 40000;
+                }
 
                 if( (int64_t)p_pkt->i_pts > p_sys->i_current_pts )
                 {
@@ -468,6 +476,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
             f = (double) va_arg( args, double );
             i64 = stream_Size( p_demux->s );
             p_sys->i_current_pts = 0;
+            p_sys->i_last_scr = -1;
 
             return stream_Seek( p_demux->s, (int64_t)(i64 * f) );
 
@@ -514,6 +523,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
                     return i64 ? VLC_EGENERIC : VLC_SUCCESS;
 
                 p_sys->i_current_pts = 0;
+                p_sys->i_last_scr = -1;
                 i_pos *= (float)i64 / (float)i_now;
                 stream_Seek( p_demux->s, i_pos );
                 return VLC_SUCCESS;