[vlc-commits] demux: ts: update probing

Francois Cartegnie git at videolan.org
Mon Mar 16 20:13:07 CET 2015


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Mar 16 20:10:38 2015 +0100| [1dec820c43290fe19ac8b291d70353943275b8fc] | committer: Francois Cartegnie

demux: ts: update probing

fixes invalid length/time with arib
and handles shared pid

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

 modules/demux/ts.c |   65 ++++++++++++++++++++++++++++++----------------------
 1 file changed, 38 insertions(+), 27 deletions(-)

diff --git a/modules/demux/ts.c b/modules/demux/ts.c
index 3182989..2b61d3b 100644
--- a/modules/demux/ts.c
+++ b/modules/demux/ts.c
@@ -2778,35 +2778,41 @@ static int ProbeChunk( demux_t *p_demux, int i_program, bool b_end, int64_t *pi_
     demux_sys_t *p_sys = p_demux->p_sys;
     int i_count = 0;
     block_t *p_pkt = NULL;
-    *pi_pcr = -1;
 
     for( ;; )
     {
+        *pi_pcr = -1;
+
         if( i_count++ > PROBE_CHUNK_COUNT || !( p_pkt = ReadTSPacket( p_demux ) ) )
         {
             break;
         }
 
-        int i_pid = PIDGet( p_pkt );
-        p_sys->pid[i_pid].i_flags |= FLAG_SEEN;
+        const int i_pid = PIDGet( p_pkt );
+        ts_pid_t *p_pid = &p_sys->pid[i_pid];
+
+        p_pid->i_flags |= FLAG_SEEN;
 
-        if( i_pid != 0x1FFF && p_sys->pid[i_pid].type == TYPE_PES &&
-           (p_pkt->p_buffer[1] & 0xC0) == 0x40 && /* Payload start but not corrupt */
-           (p_pkt->p_buffer[3] & 0xD0) == 0x10    /* Has payload but is not encrypted */
-          )
+        if( i_pid != 0x1FFF && (p_pkt->p_buffer[1] & 0x80) == 0 ) /* not corrupt */
         {
             bool b_pcrresult = true;
+            bool b_adaptfield = p_pkt->p_buffer[3] & 0x20;
 
-            if( p_pkt->i_buffer >= 4 + 2 + 5 )
+            if( b_adaptfield && p_pkt->i_buffer >= 4 + 2 + 5 )
                 *pi_pcr = GetPCR( p_pkt );
 
-            if( *pi_pcr == -1 )
+            if( *pi_pcr == -1 &&
+                (p_pkt->p_buffer[1] & 0xC0) == 0x40 && /* payload start */
+                (p_pkt->p_buffer[3] & 0xD0) == 0x10 && /* Has payload but is not encrypted */
+                p_pid->type == TYPE_PES &&
+                p_pid->p_parent->u.p_pes->es.fmt.i_cat != UNKNOWN_ES
+              )
             {
                 b_pcrresult = false;
                 mtime_t i_dts = -1;
                 mtime_t i_pts = -1;
                 unsigned i_skip = 4;
-                if ( p_pkt->p_buffer[3] & 0x20 ) // adaptation field
+                if ( b_adaptfield ) // adaptation field
                     i_skip += 1 + p_pkt->p_buffer[4];
 
                 if ( VLC_SUCCESS == ParsePESHeader( p_demux, &p_pkt->p_buffer[i_skip],
@@ -2820,27 +2826,32 @@ static int ProbeChunk( demux_t *p_demux, int i_program, bool b_end, int64_t *pi_
                 }
             }
 
-            if( *pi_pcr != -1 ) // TODO: non ES PCR
+            if( *pi_pcr != -1 )
             {
-                ts_pid_t *pmtpid = p_sys->pid[i_pid].p_parent;
-                assert(pmtpid->type == TYPE_PMT);
-
-                if( i_program == 0 || i_program == pmtpid->u.p_pmt->i_number )
+                ts_pat_t *p_pat = p_sys->pid[0].u.p_pat;
+                for( int i=0; i<p_pat->programs.i_size; i++ )
                 {
-                    if( b_end )
-                    {
-                        pmtpid->u.p_pmt->i_last_dts = *pi_pcr;
-                    }
-                    /* Start, only keep first */
-                    else if( b_pcrresult && pmtpid->u.p_pmt->pcr.i_first == -1 )
-                    {
-                        pmtpid->u.p_pmt->pcr.i_first = *pi_pcr;
-                    }
-                    else if( pmtpid->u.p_pmt->pcr.i_first_dts < VLC_TS_0 )
+                    ts_pmt_t *p_pmt = p_pat->programs.p_elems[i]->u.p_pmt;
+                    if( ( p_pmt->i_pid_pcr == p_pid->i_pid ||
+                        ( p_pmt->i_pid_pcr == 0x1FFF && p_pid->p_parent == p_pat->programs.p_elems[i] ) ) )
                     {
-                        pmtpid->u.p_pmt->pcr.i_first_dts = VLC_TS_0 + *pi_pcr * 100 / 9;
+                        if( b_end )
+                        {
+                            p_pmt->i_last_dts = *pi_pcr;
+                        }
+                        /* Start, only keep first */
+                        else if( b_pcrresult && p_pmt->pcr.i_first == -1 )
+                        {
+                            p_pmt->pcr.i_first = *pi_pcr;
+                        }
+                        else if( p_pmt->pcr.i_first_dts < VLC_TS_0 )
+                        {
+                            p_pmt->pcr.i_first_dts = FROM_SCALE(*pi_pcr);
+                        }
+
+                        if( i_program == 0 || i_program == p_pmt->i_number )
+                            *pb_found = true;
                     }
-                    *pb_found = true;
                 }
             }
         }



More information about the vlc-commits mailing list