From 75178af8b4dd9f42e29fcad62778679888234ef0 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 11 Apr 2013 23:28:27 +0200 Subject: demux_mkv: fix streaming clusters Matroska files prepared for streaming have clusters with unknown size. These files are pretty rare, see e.g. test4.mkv from the official Matroska test file collection. --- demux/demux_mkv.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'demux/demux_mkv.c') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 77abbab85f..5f41cdbab6 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -2252,6 +2252,7 @@ static int demux_mkv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds) } if (stream_tell(s) < mkv_d->cluster_end) { + int64_t start_filepos = stream_tell(s); switch (ebml_read_id(s, NULL)) { case MATROSKA_ID_TIMECODE:; uint64_t num = ebml_read_uint(s, NULL); @@ -2287,6 +2288,10 @@ static int demux_mkv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds) return 1; break; + case MATROSKA_ID_CLUSTER: + mkv_d->cluster_start = start_filepos; + goto next_cluster; + case EBML_ID_INVALID: ebml_resync_cluster(s); goto find_next_cluster; @@ -2310,8 +2315,11 @@ static int demux_mkv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds) return 0; ebml_read_skip_or_resync_cluster(s, NULL); } + next_cluster: mkv_d->cluster_end = ebml_read_length(s, NULL); - mkv_d->cluster_end += stream_tell(s); + // mkv files for "streaming" can have this legally + if (mkv_d->cluster_end != EBML_UINT_INVALID) + mkv_d->cluster_end += stream_tell(s); } return 0; -- cgit v1.2.3