vlc | branch: master | Francois Cartegnie <[email protected]> | Thu Apr 27 18:19:46 2017 +0200| [0ea06aa027534bd5d4f75523cab36c68012e1805] | committer: Francois Cartegnie
access: bluray: flag discontinuity on seek Note: this can't prevent all other issues due to stream_demux > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0ea06aa027534bd5d4f75523cab36c68012e1805 --- modules/access/bluray.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/modules/access/bluray.c b/modules/access/bluray.c index 831af1ecff..c3c148951d 100644 --- a/modules/access/bluray.c +++ b/modules/access/bluray.c @@ -277,6 +277,7 @@ static int onIntfEvent(vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void *); static void blurayResetParser(demux_t *p_demux); +static void notifyDiscontinuity( demux_sys_t *p_sys ); #define FROM_TICKS(a) ((a)*CLOCK_FREQ / INT64_C(90000)) #define TO_TICKS(a) ((a)*INT64_C(90000)/CLOCK_FREQ) @@ -1828,6 +1829,7 @@ static int blurayControl(demux_t *p_demux, int query, va_list args) if (bluraySetTitle(p_demux, i_title) != VLC_SUCCESS) { /* make sure GUI restores the old setting in title menu ... */ p_demux->info.i_update |= INPUT_UPDATE_TITLE | INPUT_UPDATE_SEEKPOINT; + notifyDiscontinuity( p_sys ); return VLC_EGENERIC; } break; @@ -1870,6 +1872,7 @@ static int blurayControl(demux_t *p_demux, int query, va_list args) { int64_t i_time = va_arg(args, int64_t); bd_seek_time(p_sys->bluray, TO_TICKS(i_time)); + notifyDiscontinuity( p_sys ); return VLC_SUCCESS; } case DEMUX_GET_TIME: @@ -1890,6 +1893,7 @@ static int blurayControl(demux_t *p_demux, int query, va_list args) { double f_position = va_arg(args, double); bd_seek_time(p_sys->bluray, TO_TICKS(f_position*CUR_LENGTH)); + notifyDiscontinuity( p_sys ); return VLC_SUCCESS; } @@ -1989,6 +1993,36 @@ static int blurayControl(demux_t *p_demux, int query, va_list args) /***************************************************************************** * libbluray event handling *****************************************************************************/ +static void notifyDiscontinuity( demux_sys_t *p_sys ) +{ + for( size_t i=0; i< vlc_array_count(&p_sys->es); i++ ) + { + const fmt_es_pair_t *p_pair = vlc_array_item_at_index( &p_sys->es, i ); + if( !p_pair->p_es ) + continue; + + const uint16_t i_pid = p_pair->i_id; + + block_t *p_block = block_Alloc(192); + 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; + + vlc_demux_chained_Send(p_sys->p_parser, p_block); + } +} static void streamFlush( demux_sys_t *p_sys ) { _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
