diff options
author | wm4 <wm4@nowhere> | 2015-10-27 20:57:11 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-10-27 20:57:11 +0100 |
commit | a135c9cffc0be4dd980f41e424d88821ea1222c1 (patch) | |
tree | f1f78aa2c5b9bca9b366cc6cc16f1d0a996e538b /demux | |
parent | f891b24cb53c7690fc822beabdaa7a011e5b418b (diff) | |
download | mpv-a135c9cffc0be4dd980f41e424d88821ea1222c1.tar.bz2 mpv-a135c9cffc0be4dd980f41e424d88821ea1222c1.tar.xz |
demux_mkv: fix cluster skip with duration probing
The start time probing essentially broke it.
Diffstat (limited to 'demux')
-rw-r--r-- | demux/demux_mkv.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index dafc668b86..eca4b4cb63 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -234,7 +234,7 @@ const struct m_sub_options demux_mkv_conf = { // (Subtitle packets added before first A/V keyframe packet is found with seek.) #define NUM_SUB_PREROLL_PACKETS 500 -static void probe_last_timestamp(struct demuxer *demuxer); +static void probe_last_timestamp(struct demuxer *demuxer, int64_t start_pos); static void probe_first_timestamp(struct demuxer *demuxer); static void free_block(struct block_info *block); @@ -1903,7 +1903,7 @@ static int demux_mkv_open(demuxer_t *demuxer, enum demux_check check) probe_first_timestamp(demuxer); if (opts->demux_mkv->probe_duration) - probe_last_timestamp(demuxer); + probe_last_timestamp(demuxer, start_pos); return 0; } @@ -2867,10 +2867,9 @@ static void demux_mkv_seek(demuxer_t *demuxer, double rel_seek_secs, int flags) demux_mkv_fill_buffer(demuxer); } -static void probe_last_timestamp(struct demuxer *demuxer) +static void probe_last_timestamp(struct demuxer *demuxer, int64_t start_pos) { mkv_demuxer_t *mkv_d = demuxer->priv; - int64_t old_pos = stream_tell(demuxer->stream); if (!demuxer->seekable) return; @@ -2908,10 +2907,12 @@ static void probe_last_timestamp(struct demuxer *demuxer) int64_t size = stream_get_size(demuxer->stream); stream_seek(demuxer->stream, MPMAX(size - 10 * 1024 * 1024, 0)); if (ebml_resync_cluster(mp_null_log, demuxer->stream) < 0) - stream_seek(demuxer->stream, old_pos); // full scan otherwise + stream_seek(demuxer->stream, start_pos); // full scan otherwise } } + free_block(&mkv_d->tmp_block); + int64_t last_ts[STREAM_TYPE_COUNT] = {0}; while (1) { struct block_info block; @@ -2935,7 +2936,7 @@ static void probe_last_timestamp(struct demuxer *demuxer) if (last_ts[STREAM_VIDEO]) mkv_d->duration = last_ts[STREAM_VIDEO] / 1e9 - demuxer->start_time; - stream_seek(demuxer->stream, old_pos); + stream_seek(demuxer->stream, start_pos); mkv_d->cluster_start = mkv_d->cluster_end = 0; } |