vlc | branch: master | Francois Cartegnie <[email protected]> | Wed Oct 16 12:35:15 2013 +0200| [5c15aa3de2401e625a132550d3e08420ccb08647] | committer: Francois Cartegnie
demux: ogg: don't use arbitrary granule as lower search bound Should fix seeking case on time 0 > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5c15aa3de2401e625a132550d3e08420ccb08647 --- modules/demux/oggseek.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/modules/demux/oggseek.c b/modules/demux/oggseek.c index d304f1a..0f69d71 100644 --- a/modules/demux/oggseek.c +++ b/modules/demux/oggseek.c @@ -1154,7 +1154,7 @@ static int64_t OggBisectSearchByTime( demux_t *p_demux, logical_stream_t *p_stre int64_t i_pos; int64_t i_timestamp; int64_t i_granule; - } bestlower = { p_stream->i_data_start, 0, p_stream->i_keyframe_offset }, + } bestlower = { p_stream->i_data_start, -1, -1 }, current = { -1, -1, -1 }; demux_sys_t *p_sys = p_demux->p_sys; @@ -1233,8 +1233,9 @@ static int64_t OggBisectSearchByTime( demux_t *p_demux, logical_stream_t *p_stre i_segsize = ( i_end_pos - i_start_pos + 1 ) >> 1; i_start_pos += i_segsize; - } while ( i_segsize > 64 && current.i_granule != -1 ); + } while ( i_segsize > 64 ); + if ( bestlower.i_granule == -1 ) return -1; if ( p_stream->b_oggds ) { @@ -1253,7 +1254,7 @@ static int64_t OggBisectSearchByTime( demux_t *p_demux, logical_stream_t *p_stre i_keyframegranule >> p_stream->i_granule_shift, bestlower.i_granule, i_pos_upper, - Oggseek_GranuleToAbsTimestamp( p_stream, i_keyframegranule, true ) ) ); + Oggseek_GranuleToAbsTimestamp( p_stream, i_keyframegranule, false ) ) ); OggDebug( msg_Dbg( p_demux, "Seeking back to %"PRId64, __MAX ( bestlower.i_pos - OGGSEEK_BYTES_TO_READ, p_stream->i_data_start ) ) ); @@ -1275,16 +1276,16 @@ int Oggseek_BlindSeektoAbsoluteTime( demux_t *p_demux, logical_stream_t *p_strea int64_t i_time, bool b_fastseek ) { demux_sys_t *p_sys = p_demux->p_sys; - int64_t i_pos = -1; - int64_t i_unusedpos = -1; + int64_t i_lowerpos = -1; + int64_t i_upperpos = -1; bool b_found = false; /* Search in skeleton */ - Ogg_GetBoundsUsingSkeletonIndex( p_stream, i_time, &i_pos, &i_unusedpos ); - if ( i_pos != -1 ) b_found = true; + Ogg_GetBoundsUsingSkeletonIndex( p_stream, i_time, &i_lowerpos, &i_upperpos ); + if ( i_lowerpos != -1 ) b_found = true; /* And also search in our own index */ - if ( !b_found && OggSeekIndexFind( p_stream, i_time, &i_pos, &i_unusedpos ) ) + if ( !b_found && OggSeekIndexFind( p_stream, i_time, &i_lowerpos, &i_upperpos ) ) { b_found = true; } @@ -1295,29 +1296,29 @@ int Oggseek_BlindSeektoAbsoluteTime( demux_t *p_demux, logical_stream_t *p_strea { /* But only if there's no keyframe/preload requirements */ /* FIXME: add function to get preload time by codec, ex: opus */ - i_pos = i_time * p_sys->i_bitrate / INT64_C(8000000); + i_lowerpos = i_time * p_sys->i_bitrate / INT64_C(8000000); b_found = true; } /* or search */ if ( !b_found && b_fastseek ) { - i_pos = OggBisectSearchByTime( p_demux, p_stream, i_time, - p_stream->i_data_start, p_sys->i_total_length ); - b_found = ( i_pos != -1 ); + i_lowerpos = OggBisectSearchByTime( p_demux, p_stream, i_time, + p_stream->i_data_start, p_sys->i_total_length ); + b_found = ( i_lowerpos != -1 ); } if ( !b_found ) return -1; - if ( i_pos < p_stream->i_data_start || i_unusedpos > p_sys->i_total_length ) + if ( i_lowerpos < p_stream->i_data_start || i_upperpos > p_sys->i_total_length ) return -1; /* And really do seek */ - p_sys->i_input_position = i_pos; + p_sys->i_input_position = i_lowerpos; seek_byte( p_demux, p_sys->i_input_position ); ogg_stream_reset( &p_stream->os ); - return i_pos; + return i_lowerpos; } int Oggseek_BlindSeektoPosition( demux_t *p_demux, logical_stream_t *p_stream, _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
