[vlc-commits] access: bluray: pass seek discontinuities as private data

Francois Cartegnie git at videolan.org
Thu Apr 12 10:45:55 CEST 2018


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Apr 11 14:49:02 2018 +0200| [df9a2a3592110d1bf47ca4a6621412a1e0d11776] | committer: Francois Cartegnie

access: bluray: pass seek discontinuities as private data

fixes regression in ts module to handle streams with proper
discontinuityies

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

 modules/access/bluray.c | 48 +++++++++++++++++++++++-------------------------
 modules/demux/mpeg/ts.c |  4 ++--
 2 files changed, 25 insertions(+), 27 deletions(-)

diff --git a/modules/access/bluray.c b/modules/access/bluray.c
index 2fcea51abe..0cb088cd5f 100644
--- a/modules/access/bluray.c
+++ b/modules/access/bluray.c
@@ -2038,6 +2038,27 @@ static int blurayControl(demux_t *p_demux, int query, va_list args)
 /*****************************************************************************
  * libbluray event handling
  *****************************************************************************/
+static void writeTsPacketWDiscontinuity( uint8_t *p_buf, uint16_t i_pid,
+                                         const uint8_t *p_payload, uint8_t i_payload )
+{
+    uint8_t ts_header[] = {
+        0x00, 0x00, 0x00, 0x00,                /* TP extra header (ATC) */
+        0x47,
+        0x40 | ((i_pid & 0x1f00) >> 8), i_pid & 0xFF, /* PUSI + PID */
+        i_payload ? 0x30 : 0x20,               /* adaptation field, payload / no payload */
+        192 - (4 + 5) - i_payload,             /* adaptation field length */
+        0x82,                                  /* af: discontinuity indicator + priv data */
+        0x0E,                                  /* priv data size */
+         'V',  'L',  'C',  '_',
+         'D',  'I',  'S',  'C',  'O',  'N',  'T',  'I',  'N',  'U',
+    };
+
+    memcpy( p_buf, ts_header, sizeof(ts_header) );
+    memset( &p_buf[sizeof(ts_header)], 0xFF, 192 - sizeof(ts_header) - i_payload );
+    if( i_payload )
+        memcpy( &p_buf[192 - i_payload], p_payload, i_payload );
+}
+
 static void notifyStreamsDiscontinuity( vlc_demux_chained_t *p_parser,
                                         const BLURAY_STREAM_INFO *p_sinfo, size_t i_sinfo )
 {
@@ -2049,18 +2070,7 @@ static void notifyStreamsDiscontinuity( vlc_demux_chained_t *p_parser,
         if (!p_block)
             return;
 
-        uint8_t ts_header[] = {
-            0x00, 0x00, 0x00, 0x00,                /* TP extra header (ATC) */
-            0x47,
-            (i_pid & 0x1f00) >> 8, i_pid & 0xFF,   /* PID */
-            0x20,                                  /* adaptation field, no payload */
-            183,                                   /* adaptation field length */
-            0x80,                                  /* adaptation field: discontinuity indicator */
-        };
-
-        memcpy(p_block->p_buffer, ts_header, sizeof(ts_header));
-        memset(&p_block->p_buffer[sizeof(ts_header)], 0xFF, 192 - sizeof(ts_header));
-        p_block->i_buffer = 192;
+        writeTsPacketWDiscontinuity( p_block->p_buffer, i_pid, NULL, 0 );
 
         vlc_demux_chained_Send(p_parser, p_block);
     }
@@ -2107,20 +2117,8 @@ static void streamFlush( demux_sys_t *p_sys )
         0x00, 0x00, 0x01, 0xe0, 0x00, 0x07, 0x80, 0x00, 0x00,  /* PES header */
         0x00, 0x00, 0x01, 0xb7,                                /* PES payload: sequence end */
     };
-    static const uint8_t vid_pusi_ts[] = {
-        0x00, 0x00, 0x00, 0x00,                /* TP extra header (ATC) */
-        0x47, 0x50, 0x11, 0x30,                /* TP header */
-        (192 - (4 + 5) - sizeof(seq_end_pes)), /* adaptation field length */
-        0x82,                                  /* af: discontinuity indicator + priv data */
-        0x0E,                                  /* priv data size */
-         'V',  'L',  'C',  '_',
-         'S',  'T',  'I',  'L',  'L',  'F',  'R',  'A',  'M',  'E',
-    };
 
-    memset(p_block->p_buffer, 0, 192);
-    memcpy(p_block->p_buffer, vid_pusi_ts, sizeof(vid_pusi_ts));
-    memcpy(p_block->p_buffer + 192 - sizeof(seq_end_pes), seq_end_pes, sizeof(seq_end_pes));
-    p_block->i_buffer = 192;
+    writeTsPacketWDiscontinuity( p_block->p_buffer, 0x1011, seq_end_pes, sizeof(seq_end_pes) );
 
     /* set correct sequence end code */
     vlc_mutex_lock(&p_sys->pl_info_lock);
diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c
index 1b473bc012..9c7995edfc 100644
--- a/modules/demux/mpeg/ts.c
+++ b/modules/demux/mpeg/ts.c
@@ -2487,8 +2487,8 @@ static block_t * ProcessTSPacket( demux_t *p_demux, ts_pid_t *pid, block_t *p_pk
                 /* ignore, that's not that simple 2.4.3.5 */
                 //p_pkt->i_flags |= BLOCK_FLAG_DISCONTINUITY;
 
-                /* ... or don't ignore for our Bluray still frames hack */
-                if(p[5] == 0x82 && !strncmp((const char *)&p[7], "VLC_STILLFRAME", 14))
+                /* ... 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;
             }
 #if 0



More information about the vlc-commits mailing list