| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -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) | 
		
		
	
	
		
			
				| 
				
					
				
				
				
				 | 
			
			 | 
			
  |