vlc | branch: master | Francois Cartegnie <[email protected]> | Thu Nov 10 12:17:52 2016 +0100| [38b209594db2d4e045d9f76ebb1edc692388324e] | committer: Francois Cartegnie
demux: ts: convert seektotime for unsigned stream_Tell > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=38b209594db2d4e045d9f76ebb1edc692388324e --- modules/demux/mpeg/ts.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c index d309809..40fa287 100644 --- a/modules/demux/mpeg/ts.c +++ b/modules/demux/mpeg/ts.c @@ -1816,14 +1816,15 @@ static int SeekToTime( demux_t *p_demux, const ts_pmt_t *p_pmt, int64_t i_scaled if( p_pmt->pcr.i_first == i_scaledtime && p_sys->b_canseek ) return vlc_stream_Seek( p_sys->stream, 0 ); - if( !p_sys->b_canfastseek ) + const int64_t i_stream_size = stream_Size( p_sys->stream ); + if( !p_sys->b_canfastseek || i_stream_size < p_sys->i_packet_size ) return VLC_EGENERIC; - int64_t i_initial_pos = vlc_stream_Tell( p_sys->stream ); + const uint64_t i_initial_pos = vlc_stream_Tell( p_sys->stream ); /* Find the time position by using binary search algorithm. */ - int64_t i_head_pos = 0; - int64_t i_tail_pos = stream_Size( p_sys->stream ) - p_sys->i_packet_size; + uint64_t i_head_pos = 0; + uint64_t i_tail_pos = (uint64_t) i_stream_size - p_sys->i_packet_size; if( i_head_pos >= i_tail_pos ) return VLC_EGENERIC; @@ -1831,15 +1832,15 @@ static int SeekToTime( demux_t *p_demux, const ts_pmt_t *p_pmt, int64_t i_scaled while( (i_head_pos + p_sys->i_packet_size) <= i_tail_pos && !b_found ) { /* Round i_pos to a multiple of p_sys->i_packet_size */ - int64_t i_splitpos = i_head_pos + (i_tail_pos - i_head_pos) / 2; - int64_t i_div = i_splitpos % p_sys->i_packet_size; + uint64_t i_splitpos = i_head_pos + (i_tail_pos - i_head_pos) / 2; + uint64_t i_div = i_splitpos % p_sys->i_packet_size; i_splitpos -= i_div; if ( vlc_stream_Seek( p_sys->stream, i_splitpos ) != VLC_SUCCESS ) break; - int64_t i_pos = i_splitpos; - while( i_pos > -1 && i_pos < i_tail_pos ) + uint64_t i_pos = i_splitpos; + while( i_pos < i_tail_pos ) { int64_t i_pcr = -1; block_t *p_pkt = ReadTSPacket( p_demux ); @@ -1888,7 +1889,7 @@ static int SeekToTime( demux_t *p_demux, const ts_pmt_t *p_pmt, int64_t i_scaled { int64_t i_diff = i_scaledtime - TimeStampWrapAround( p_pmt->pcr.i_first, i_pcr ); if ( i_diff < 0 ) - i_tail_pos = i_splitpos - p_sys->i_packet_size; + i_tail_pos = (i_splitpos >= p_sys->i_packet_size) ? i_splitpos - p_sys->i_packet_size : 0; else if( i_diff < TO_SCALE(VLC_TS_0 + CLOCK_FREQ / 2) ) // 500ms b_found = true; else @@ -1897,8 +1898,8 @@ static int SeekToTime( demux_t *p_demux, const ts_pmt_t *p_pmt, int64_t i_scaled } } - if ( !b_found && i_pos > i_tail_pos - p_sys->i_packet_size ) - i_tail_pos = i_splitpos - p_sys->i_packet_size; + if ( !b_found && i_pos + p_sys->i_packet_size > i_tail_pos ) + i_tail_pos = (i_splitpos >= p_sys->i_packet_size) ? i_splitpos - p_sys->i_packet_size : 0; } if( !b_found ) _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
