vlc | branch: master | Francois Cartegnie <[email protected]> | Thu Dec 22 
15:58:18 2016 +0100| [dd12f84ea33f10b38d39bb8b686fdc50c1a2c2e4] | committer: 
Francois Cartegnie

demux: ts: don't pass corrupted packets to sections handler

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

 modules/demux/mpeg/ts.c | 28 ++++++++++++++++++++++++----
 1 file changed, 24 insertions(+), 4 deletions(-)

diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c
index 2464cbe..8414819 100644
--- a/modules/demux/mpeg/ts.c
+++ b/modules/demux/mpeg/ts.c
@@ -176,6 +176,7 @@ static mtime_t GetPCR( const block_t * );
 
 static block_t * ProcessTSPacket( demux_t *p_demux, ts_pid_t *pid, block_t 
*p_pkt, int * );
 static bool GatherPESData( demux_t *p_demux, ts_pid_t *pid, block_t *p_bk, 
size_t );
+static bool GatherSectionsData( demux_t *p_demux, ts_pid_t *, block_t *, 
size_t );
 static void ProgramSetPCR( demux_t *p_demux, ts_pmt_t *p_prg, mtime_t i_pcr );
 
 static block_t* ReadTSPacket( demux_t *p_demux );
@@ -706,11 +707,9 @@ static int Demux( demux_t *p_demux )
             {
                 b_frame = GatherPESData( p_demux, p_pid, p_pkt, i_header );
             }
-            else if( p_pid->u.p_pes->transport == TS_TRANSPORT_SECTIONS &&
-                    !(p_pkt->i_flags & BLOCK_FLAG_SCRAMBLED) )
+            else if( p_pid->u.p_pes->transport == TS_TRANSPORT_SECTIONS )
             {
-                ts_sections_processor_Push( p_pid->u.p_pes->p_sections_proc, 
p_pkt->p_buffer );
-                b_frame = true;
+                b_frame = GatherSectionsData( p_demux, p_pid, p_pkt, i_header 
);
             }
             else // pid->u.p_pes->transport == TS_TRANSPORT_IGNORE
             {
@@ -2670,6 +2669,27 @@ static bool GatherPESData( demux_t *p_demux, ts_pid_t 
*pid, block_t *p_pkt, size
     return b_ret;
 }
 
+static bool GatherSectionsData( demux_t *p_demux, ts_pid_t *p_pid, block_t 
*p_pkt, size_t i_skip )
+{
+    VLC_UNUSED(i_skip); VLC_UNUSED(p_demux);
+    bool b_ret = false;
+
+    if( p_pkt->i_flags & BLOCK_FLAG_DISCONTINUITY )
+    {
+        ts_sections_processor_Reset( p_pid->u.p_pes->p_sections_proc );
+    }
+
+    if( (p_pkt->i_flags & (BLOCK_FLAG_SCRAMBLED | BLOCK_FLAG_CORRUPTED)) == 0 )
+    {
+        ts_sections_processor_Push( p_pid->u.p_pes->p_sections_proc, 
p_pkt->p_buffer );
+        b_ret = true;
+    }
+
+    block_Release( p_pkt );
+
+    return b_ret;
+}
+
 void TsChangeStandard( demux_sys_t *p_sys, ts_standards_e v )
 {
     if( p_sys->standard != TS_STANDARD_AUTO &&

_______________________________________________
vlc-commits mailing list
[email protected]
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to