[vlc-commits] access: bluray: pass seek discontinuities as private data
vlc/vlc-3.0 | branch: master | Francois Cartegnie| Wed Apr 11 14:49:02 2018 +0200| [0d93df7fafc36b44fefe3d28b19e4700abbd7fec] | committer: Thomas Guillem access: bluray: pass seek discontinuities as private data fixes regression in ts module to handle streams with proper discontinuityies (cherry picked from commit df9a2a3592110d1bf47ca4a6621412a1e0d11776) Signed-off-by: Thomas Guillem > http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=0d93df7fafc36b44fefe3d28b19e4700abbd7fec --- 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 fd2d17e7a6..b240e1cf41 100644 --- a/modules/access/bluray.c +++ b/modules/access/bluray.c @@ -2008,6 +2008,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( _buf[sizeof(ts_header)], 0xFF, 192 - sizeof(ts_header) - i_payload ); +if( i_payload ) +memcpy( _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 ) { @@ -2019,18 +2040,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(_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); } @@ -2077,20 +2087,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(_sys->pl_info_lock); diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c index 8b8d28ed2c..e3ff94e277 100644 --- a/modules/demux/mpeg/ts.c +++ b/modules/demux/mpeg/ts.c @@ -2462,8 +2462,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
[vlc-commits] access: bluray: pass seek discontinuities as private data
vlc | branch: master | Francois Cartegnie| 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( _buf[sizeof(ts_header)], 0xFF, 192 - sizeof(ts_header) - i_payload ); +if( i_payload ) +memcpy( _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(_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(_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 *)[7], "VLC_STILLFRAME", 14)) +/* ... or don't ignore for our Bluray still frames and