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 /demux | |
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.
Diffstat (limited to 'demux')
-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; |