[vlc-commits] demux: ts: workaround broken teletext

Francois Cartegnie git at videolan.org
Mon Jul 15 08:52:01 CEST 2019


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Sat Jul 13 17:25:32 2019 +0200| [4d37595856b6164c4b9b6ce104ae97f21242295c] | committer: Francois Cartegnie

demux: ts: workaround broken teletext

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

 modules/demux/mpeg/ts.c | 46 +++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 43 insertions(+), 3 deletions(-)

diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c
index 23c4b080cc..69843bc1db 100644
--- a/modules/demux/mpeg/ts.c
+++ b/modules/demux/mpeg/ts.c
@@ -1339,6 +1339,33 @@ invalid:
     return NULL;
 }
 
+static vlc_tick_t GetTimeForUntimed( const ts_pmt_t *p_pmt )
+{
+    vlc_tick_t i_ts = p_pmt->pcr.i_current;
+    const ts_stream_t *p_cand = NULL;
+    for( int i=0; i< p_pmt->e_streams.i_size; i++ )
+    {
+        const ts_pid_t *p_pid = p_pmt->e_streams.p_elems[i];
+        if( (p_pid->i_flags & FLAG_FILTERED) && SEEN(p_pid) &&
+             p_pid->type == TYPE_STREAM &&
+             p_pid->u.p_stream->p_es &&
+             SETANDVALID(p_pid->u.p_stream->i_last_dts) )
+        {
+            const ts_es_t *p_es = p_pid->u.p_stream->p_es;
+            if( p_es->fmt.i_cat == VIDEO_ES || p_es->fmt.i_cat == AUDIO_ES )
+            {
+                if( !p_cand || (p_es->fmt.i_cat == VIDEO_ES &&
+                                p_cand->p_es->fmt.i_cat != VIDEO_ES) )
+                {
+                    p_cand = p_pid->u.p_stream;
+                    i_ts = p_cand->i_last_dts;
+                }
+            }
+        }
+    }
+    return i_ts;
+}
+
 static block_t * ConvertPESBlock( demux_t *p_demux, ts_es_t *p_es,
                                   size_t i_pes_size, uint8_t i_stream_id,
                                   block_t *p_block )
@@ -1359,13 +1386,26 @@ static block_t * ConvertPESBlock( demux_t *p_demux, ts_es_t *p_es,
     }
     else if( p_es->fmt.i_codec == VLC_CODEC_TELETEXT )
     {
+        const ts_pmt_t *p_pmt = p_es->p_program;
+        if( p_block->i_pts != VLC_TICK_INVALID &&
+            p_pmt->pcr.i_current > -1 )
+        {
+            /* Teletext can have totally offset timestamps... RAI1, German */
+            vlc_tick_t i_pcr = FROM_SCALE(TimeStampWrapAround( p_pmt->pcr.i_first,
+                                                               p_pmt->pcr.i_current ));
+            if( i_pcr < p_block->i_pts || i_pcr - p_block->i_pts > CLOCK_FREQ )
+                p_block->i_dts = p_block->i_pts = VLC_TICK_INVALID;
+        }
         if( p_block->i_pts == VLC_TICK_INVALID )
         {
             /* Teletext may have missing PTS (ETSI EN 300 472 Annexe A)
              * In this case use the last PCR + 40ms */
-            stime_t i_pcr = p_es->p_program->pcr.i_current;
-            if( SETANDVALID(i_pcr) )
-                p_block->i_pts = FROM_SCALE(i_pcr) + VLC_TICK_FROM_MS(40);
+            stime_t i_ts = GetTimeForUntimed( p_es->p_program );
+            if( SETANDVALID(i_ts) )
+            {
+                i_ts = TimeStampWrapAround( p_pmt->pcr.i_first, i_ts );
+                p_block->i_dts = p_block->i_pts = FROM_SCALE(i_ts) + VLC_TICK_FROM_MS(40);
+            }
         }
     }
     else if( p_es->fmt.i_codec == VLC_CODEC_ARIB_A ||



More information about the vlc-commits mailing list