[vlc-commits] demux: ts: resync on next code on packet loss

Francois Cartegnie git at videolan.org
Sat Jun 1 22:06:08 CEST 2019


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Fri May 10 17:41:35 2019 +0200| [cab9ed68cfd3b44b24af4576c536b18ed9ac0ddb] | committer: Francois Cartegnie

demux: ts: resync on next code on packet loss

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

 modules/demux/mpeg/ts.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c
index 3ff513a2e9..41926aad3e 100644
--- a/modules/demux/mpeg/ts.c
+++ b/modules/demux/mpeg/ts.c
@@ -206,6 +206,8 @@ static void PCRFixHandle( demux_t *, ts_pmt_t *, block_t * );
 #define PROBE_CHUNK_COUNT 500
 #define PROBE_MAX         (PROBE_CHUNK_COUNT * 10)
 
+#define BLOCK_FLAG_SOURCE_RANDOM_ACCESS (1 << BLOCK_FLAG_PRIVATE_SHIFT)
+
 static int DetectPacketSize( demux_t *p_demux, unsigned *pi_header_size, int i_offset )
 {
     const uint8_t *p_peek;
@@ -1407,6 +1409,9 @@ static void SendDataChain( demux_t *p_demux, ts_es_t *p_es, block_t *p_chain )
         p_chain = p_block->p_next;
         p_block->p_next = NULL;
 
+        /* clean up any private flag */
+        p_block->i_flags &= ~BLOCK_FLAG_PRIVATE_MASK;
+
         if( b_lowdelay )
             p_block->i_flags |= BLOCK_FLAG_AU_END;
 
@@ -2503,7 +2508,7 @@ static block_t * ProcessTSPacket( demux_t *p_demux, ts_pid_t *pid, block_t *p_pk
 
                 /* ... or don't ignore for our Bluray still frames and seek hacks */
                 if(p[5] == 0x82 && !strncmp((const char *)&p[7], "VLC_DISCONTINU", 14))
-                    p_pkt->i_flags |= BLOCK_FLAG_DISCONTINUITY;
+                    p_pkt->i_flags |= BLOCK_FLAG_SOURCE_RANDOM_ACCESS;
             }
 #if 0
             if( p[5]&0x40 )
@@ -2674,10 +2679,9 @@ static bool GatherPESData( demux_t *p_demux, ts_pid_t *pid, block_t *p_pkt, size
         return PushPESBlock( p_demux, pid, NULL, true );
     }
 
-    /* Data discontinuity, we need to drop or output currently
-     * gathered data as it can't match the target size or can
-     * have dropped next sync code */
-    if( p_pkt->i_flags & BLOCK_FLAG_DISCONTINUITY )
+    /* Seek discontinuity, we need to drop or output currently
+     * gathered data */
+    if( p_pkt->i_flags & BLOCK_FLAG_SOURCE_RANDOM_ACCESS )
     {
         p_pes->gather.i_saved = 0;
         /* Flush/output current */
@@ -2686,6 +2690,17 @@ static bool GatherPESData( demux_t *p_demux, ts_pid_t *pid, block_t *p_pkt, size
         if( p_pes->p_es )
             p_pes->p_es->i_next_block_flags |= BLOCK_FLAG_DISCONTINUITY;
     }
+    /* On dropped blocks discontinuity */
+    else if( p_pkt->i_flags & BLOCK_FLAG_DISCONTINUITY )
+    {
+        /* it can't match the target size and need to resync on sync code */
+        p_pes->gather.i_data_size = 0;
+        /* can't reuse prev bytes to lookup sync code */
+        p_pes->gather.i_saved = 0;
+        /* Propagate to output block to notify packetizers/decoders */
+        if( p_pes->p_es )
+            p_pes->p_es->i_next_block_flags |= BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED;
+    }
 
     if ( unlikely(p_pes->gather.i_saved > 0) )
     {



More information about the vlc-commits mailing list