diff options
author | wm4 <wm4@nowhere> | 2013-04-11 23:28:27 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2013-04-20 23:28:21 +0200 |
commit | 75178af8b4dd9f42e29fcad62778679888234ef0 (patch) | |
tree | 848cf5d06db3882e7f6aff84f3cfc5b99ec69dfe | |
parent | c2bf06f63e6080503ff19db10ef892252e441156 (diff) | |
download | mpv-75178af8b4dd9f42e29fcad62778679888234ef0.tar.bz2 mpv-75178af8b4dd9f42e29fcad62778679888234ef0.tar.xz |
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.
-rw-r--r-- | demux/demux_mkv.c | 10 |
1 files changed, 9 insertions, 1 deletions
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; |