summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-04-11 23:28:27 +0200
committerwm4 <wm4@nowhere>2013-04-20 23:28:21 +0200
commit75178af8b4dd9f42e29fcad62778679888234ef0 (patch)
tree848cf5d06db3882e7f6aff84f3cfc5b99ec69dfe /demux
parentc2bf06f63e6080503ff19db10ef892252e441156 (diff)
downloadmpv-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.c10
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;