@ -1242,8 +1242,11 @@ static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
continue ;
}
if ( matroska_parse_seekhead_entry ( matroska , i ) < 0 )
if ( matroska_parse_seekhead_entry ( matroska , i ) < 0 ) {
// mark index as broken
matroska - > cues_parsing_deferred = - 1 ;
break ;
}
}
}
@ -1284,7 +1287,8 @@ static void matroska_parse_cues(MatroskaDemuxContext *matroska) {
break ;
assert ( i < = seekhead_list - > nb_elem ) ;
matroska_parse_seekhead_entry ( matroska , i ) ;
if ( matroska_parse_seekhead_entry ( matroska , i ) < 0 )
matroska - > cues_parsing_deferred = - 1 ;
matroska_add_index_entries ( matroska ) ;
}
@ -2023,13 +2027,13 @@ static int matroska_read_seek(AVFormatContext *s, int stream_index,
int i , index , index_sub , index_min ;
/* Parse the CUES now since we need the index data to seek. */
if ( matroska - > cues_parsing_deferred ) {
matroska_parse_cues ( matroska ) ;
if ( matroska - > cues_parsing_deferred > 0 ) {
matroska - > cues_parsing_deferred = 0 ;
matroska_parse_cues ( matroska ) ;
}
if ( ! st - > nb_index_entries )
return 0 ;
goto err ;
timestamp = FFMAX ( timestamp , st - > index_entries [ 0 ] . timestamp ) ;
if ( ( index = av_index_search_timestamp ( st , timestamp , flags ) ) < 0 ) {
@ -2043,8 +2047,8 @@ static int matroska_read_seek(AVFormatContext *s, int stream_index,
}
matroska_clear_queue ( matroska ) ;
if ( index < 0 )
return 0 ;
if ( index < 0 | | ( matroska - > cues_parsing_deferred < 0 & & index = = st - > nb_index_entries - 1 ) )
goto err ;
index_min = index ;
for ( i = 0 ; i < matroska - > tracks . nb_elem ; i + + ) {
@ -2070,6 +2074,15 @@ static int matroska_read_seek(AVFormatContext *s, int stream_index,
matroska - > num_levels = 0 ;
ff_update_cur_dts ( s , st , st - > index_entries [ index ] . timestamp ) ;
return 0 ;
err :
// slightly hackish but allows proper fallback to
// the generic seeking code.
matroska_clear_queue ( matroska ) ;
matroska - > current_id = 0 ;
matroska - > skip_to_keyframe = 0 ;
matroska - > done = 0 ;
matroska - > num_levels = 0 ;
return - 1 ;
}
static int matroska_read_close ( AVFormatContext * s )