|  | @@ -762,8 +762,6 @@ static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | AVIOContext *pb = matroska->ctx->pb; |  |  | AVIOContext *pb = matroska->ctx->pb; | 
														
													
														
															
																|  |  | uint32_t id; |  |  | uint32_t id; | 
														
													
														
															
																|  |  | matroska->current_id = 0; |  |  |  | 
														
													
														
															
																|  |  | matroska->num_levels = 0; |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | /* Try to seek to the last position to resync from. If this doesn't work, |  |  | /* Try to seek to the last position to resync from. If this doesn't work, | 
														
													
														
															
																|  |  | * we resync from the earliest position available: The start of the buffer. */ |  |  | * we resync from the earliest position available: The start of the buffer. */ | 
														
													
												
													
														
															
																|  | @@ -783,7 +781,13 @@ static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos) | 
														
													
														
															
																|  |  | id == MATROSKA_ID_CUES     || id == MATROSKA_ID_TAGS        || |  |  | id == MATROSKA_ID_CUES     || id == MATROSKA_ID_TAGS        || | 
														
													
														
															
																|  |  | id == MATROSKA_ID_SEEKHEAD || id == MATROSKA_ID_ATTACHMENTS || |  |  | id == MATROSKA_ID_SEEKHEAD || id == MATROSKA_ID_ATTACHMENTS || | 
														
													
														
															
																|  |  | id == MATROSKA_ID_CLUSTER  || id == MATROSKA_ID_CHAPTERS) { |  |  | id == MATROSKA_ID_CLUSTER  || id == MATROSKA_ID_CHAPTERS) { | 
														
													
														
															
																|  |  | matroska->current_id = id; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | /* Prepare the context for parsing of a level 1 element. */ | 
														
													
														
															
																|  |  |  |  |  | matroska_reset_status(matroska, id, -1); | 
														
													
														
															
																|  |  |  |  |  | /* Given that we are here means that an error has occured, | 
														
													
														
															
																|  |  |  |  |  | * so treat the segment as unknown length in order not to | 
														
													
														
															
																|  |  |  |  |  | * discard valid data that happens to be beyond the designated | 
														
													
														
															
																|  |  |  |  |  | * end of the segment. */ | 
														
													
														
															
																|  |  |  |  |  | matroska->levels[0].length = EBML_UNKNOWN_LENGTH; | 
														
													
														
															
																|  |  | return 0; |  |  | return 0; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | id = (id << 8) | avio_r8(pb); |  |  | id = (id << 8) | avio_r8(pb); | 
														
													
												
													
														
															
																|  | @@ -1679,18 +1683,11 @@ static int matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska, | 
														
													
														
															
																|  |  | matroska->current_id                   = 0; |  |  | matroska->current_id                   = 0; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | ret = ebml_parse(matroska, matroska_segment, matroska); |  |  | ret = ebml_parse(matroska, matroska_segment, matroska); | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | /* remove dummy level */ |  |  |  | 
														
													
														
															
																|  |  | while (matroska->num_levels) { |  |  |  | 
														
													
														
															
																|  |  | uint64_t length = matroska->levels[--matroska->num_levels].length; |  |  |  | 
														
													
														
															
																|  |  | if (length == EBML_UNKNOWN_LENGTH) |  |  |  | 
														
													
														
															
																|  |  | break; |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | /* seek back */ |  |  |  | 
														
													
														
															
																|  |  | avio_seek(matroska->ctx->pb, before_pos, SEEK_SET); |  |  |  | 
														
													
														
															
																|  |  | matroska->current_id = saved_id; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | /* Seek back - notice that in all instances where this is used it is safe | 
														
													
														
															
																|  |  |  |  |  | * to set the level to 1 and unset the position of the current cluster. */ | 
														
													
														
															
																|  |  |  |  |  | matroska_reset_status(matroska, saved_id, before_pos); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | return ret; |  |  | return ret; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
												
													
														
															
																|  | @@ -3604,9 +3601,7 @@ static int matroska_read_seek(AVFormatContext *s, int stream_index, | 
														
													
														
															
																|  |  | timestamp = FFMAX(timestamp, st->index_entries[0].timestamp); |  |  | timestamp = FFMAX(timestamp, st->index_entries[0].timestamp); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 || index == st->nb_index_entries - 1) { |  |  | if ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 || index == st->nb_index_entries - 1) { | 
														
													
														
															
																|  |  | avio_seek(s->pb, st->index_entries[st->nb_index_entries - 1].pos, |  |  |  | 
														
													
														
															
																|  |  | SEEK_SET); |  |  |  | 
														
													
														
															
																|  |  | matroska->current_id = 0; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | matroska_reset_status(matroska, 0, st->index_entries[st->nb_index_entries - 1].pos); | 
														
													
														
															
																|  |  | while ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 || index == st->nb_index_entries - 1) { |  |  | while ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 || index == st->nb_index_entries - 1) { | 
														
													
														
															
																|  |  | matroska_clear_queue(matroska); |  |  | matroska_clear_queue(matroska); | 
														
													
														
															
																|  |  | if (matroska_parse_cluster(matroska) < 0) |  |  | if (matroska_parse_cluster(matroska) < 0) | 
														
													
												
													
														
															
																|  | @@ -3626,8 +3621,8 @@ static int matroska_read_seek(AVFormatContext *s, int stream_index, | 
														
													
														
															
																|  |  | tracks[i].end_timecode         = 0; |  |  | tracks[i].end_timecode         = 0; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | avio_seek(s->pb, st->index_entries[index].pos, SEEK_SET); |  |  |  | 
														
													
														
															
																|  |  | matroska->current_id       = 0; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | /* We seek to a level 1 element, so set the appropriate status. */ | 
														
													
														
															
																|  |  |  |  |  | matroska_reset_status(matroska, 0, st->index_entries[index].pos); | 
														
													
														
															
																|  |  | if (flags & AVSEEK_FLAG_ANY) { |  |  | if (flags & AVSEEK_FLAG_ANY) { | 
														
													
														
															
																|  |  | st->skip_to_keyframe = 0; |  |  | st->skip_to_keyframe = 0; | 
														
													
														
															
																|  |  | matroska->skip_to_timecode = timestamp; |  |  | matroska->skip_to_timecode = timestamp; | 
														
													
												
													
														
															
																|  | @@ -3637,18 +3632,16 @@ static int matroska_read_seek(AVFormatContext *s, int stream_index, | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | matroska->skip_to_keyframe = 1; |  |  | matroska->skip_to_keyframe = 1; | 
														
													
														
															
																|  |  | matroska->done             = 0; |  |  | matroska->done             = 0; | 
														
													
														
															
																|  |  | matroska->num_levels       = 0; |  |  |  | 
														
													
														
															
																|  |  | ff_update_cur_dts(s, st, st->index_entries[index].timestamp); |  |  | ff_update_cur_dts(s, st, st->index_entries[index].timestamp); | 
														
													
														
															
																|  |  | return 0; |  |  | return 0; | 
														
													
														
															
																|  |  | err: |  |  | err: | 
														
													
														
															
																|  |  | // slightly hackish but allows proper fallback to |  |  | // slightly hackish but allows proper fallback to | 
														
													
														
															
																|  |  | // the generic seeking code. |  |  | // the generic seeking code. | 
														
													
														
															
																|  |  |  |  |  | matroska_reset_status(matroska, 0, -1); | 
														
													
														
															
																|  |  | matroska_clear_queue(matroska); |  |  | matroska_clear_queue(matroska); | 
														
													
														
															
																|  |  | matroska->current_id = 0; |  |  |  | 
														
													
														
															
																|  |  | st->skip_to_keyframe = |  |  | st->skip_to_keyframe = | 
														
													
														
															
																|  |  | matroska->skip_to_keyframe = 0; |  |  | matroska->skip_to_keyframe = 0; | 
														
													
														
															
																|  |  | matroska->done = 0; |  |  | matroska->done = 0; | 
														
													
														
															
																|  |  | matroska->num_levels = 0; |  |  |  | 
														
													
														
															
																|  |  | return -1; |  |  | return -1; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | @@ -3711,6 +3704,7 @@ static CueDesc get_cue_desc(AVFormatContext *s, int64_t ts, int64_t cues_start) | 
														
													
														
															
																|  |  | static int webm_clusters_start_with_keyframe(AVFormatContext *s) |  |  | static int webm_clusters_start_with_keyframe(AVFormatContext *s) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | MatroskaDemuxContext *matroska = s->priv_data; |  |  | MatroskaDemuxContext *matroska = s->priv_data; | 
														
													
														
															
																|  |  |  |  |  | uint32_t id = matroska->current_id; | 
														
													
														
															
																|  |  | int64_t cluster_pos, before_pos; |  |  | int64_t cluster_pos, before_pos; | 
														
													
														
															
																|  |  | int index, rv = 1; |  |  | int index, rv = 1; | 
														
													
														
															
																|  |  | if (s->streams[0]->nb_index_entries <= 0) return 0; |  |  | if (s->streams[0]->nb_index_entries <= 0) return 0; | 
														
													
												
													
														
															
																|  | @@ -3731,8 +3725,8 @@ static int webm_clusters_start_with_keyframe(AVFormatContext *s) | 
														
													
														
															
																|  |  | read = ebml_read_length(matroska, matroska->ctx->pb, &cluster_length); |  |  | read = ebml_read_length(matroska, matroska->ctx->pb, &cluster_length); | 
														
													
														
															
																|  |  | if (read < 0) |  |  | if (read < 0) | 
														
													
														
															
																|  |  | break; |  |  | break; | 
														
													
														
															
																|  |  | avio_seek(s->pb, cluster_pos, SEEK_SET); |  |  |  | 
														
													
														
															
																|  |  | matroska->current_id = 0; |  |  |  | 
														
													
														
															
																|  |  |  |  |  |  | 
														
													
														
															
																|  |  |  |  |  | matroska_reset_status(matroska, 0, cluster_pos); | 
														
													
														
															
																|  |  | matroska_clear_queue(matroska); |  |  | matroska_clear_queue(matroska); | 
														
													
														
															
																|  |  | if (matroska_parse_cluster(matroska) < 0 || |  |  | if (matroska_parse_cluster(matroska) < 0 || | 
														
													
														
															
																|  |  | !matroska->queue) { |  |  | !matroska->queue) { | 
														
													
												
													
														
															
																|  | @@ -3746,7 +3740,10 @@ static int webm_clusters_start_with_keyframe(AVFormatContext *s) | 
														
													
														
															
																|  |  | break; |  |  | break; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | avio_seek(s->pb, before_pos, SEEK_SET); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | /* Restore the status after matroska_read_header: */ | 
														
													
														
															
																|  |  |  |  |  | matroska_reset_status(matroska, id, before_pos); | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  | return rv; |  |  | return rv; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | 
 |