diff options
Diffstat (limited to 'demux')
-rw-r--r-- | demux/demux.c | 3 | ||||
-rw-r--r-- | demux/demux_lavf.c | 25 | ||||
-rw-r--r-- | demux/demux_mkv.c | 17 | ||||
-rw-r--r-- | demux/demux_raw.c | 9 |
4 files changed, 32 insertions, 22 deletions
diff --git a/demux/demux.c b/demux/demux.c index 4da1adb134..ba231b5af6 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -587,8 +587,7 @@ static struct demuxer *open_given_type(struct mpv_global *global, .type = desc->type, .stream = stream, .stream_pts = MP_NOPTS_VALUE, - .seekable = (stream->flags & MP_STREAM_SEEK) == MP_STREAM_SEEK && - stream->end_pos > 0, + .seekable = stream->seekable, .accurate_seek = true, .filepos = -1, .opts = global->opts, diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c index b5a6ef998c..2b43f4f27f 100644 --- a/demux/demux_lavf.c +++ b/demux/demux_lavf.c @@ -135,17 +135,18 @@ static int64_t mp_seek(void *opaque, int64_t pos, int whence) return -1; MP_DBG(demuxer, "mp_seek(%p, %"PRId64", %d)\n", stream, pos, whence); - if (whence == SEEK_CUR) + if (whence == SEEK_END || whence == AVSEEK_SIZE) { + int64_t end; + if (stream_control(stream, STREAM_CTRL_GET_SIZE, &end) != STREAM_OK) + return -1; + if (whence == AVSEEK_SIZE) + return end; + pos += end; + } else if (whence == SEEK_CUR) { pos += stream_tell(stream); - else if (whence == SEEK_END && stream->end_pos > 0) - pos += stream->end_pos; - else if (whence == SEEK_SET) - /* ok */; - else if (whence == AVSEEK_SIZE && stream->end_pos > 0) { - stream_update_size(stream); - return stream->end_pos; - } else + } else if (whence != SEEK_SET) { return -1; + } if (pos < 0) return -1; @@ -824,11 +825,13 @@ static void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs, int flags) if (flags & SEEK_FACTOR) { struct stream *s = demuxer->stream; - if (s->end_pos > 0 && demuxer->ts_resets_possible && + int64_t end = 0; + stream_control(s, STREAM_CTRL_GET_SIZE, &end); + if (end > 0 && demuxer->ts_resets_possible && !(priv->avif->flags & AVFMT_NO_BYTE_SEEK)) { avsflags |= AVSEEK_FLAG_BYTE; - priv->last_pts = s->end_pos * rel_seek_secs; + priv->last_pts = end * rel_seek_secs; } else if (priv->avfc->duration != 0 && priv->avfc->duration != AV_NOPTS_VALUE) { diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 20864aa297..4b08ce2a13 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -1058,7 +1058,9 @@ static int demux_mkv_read_seekhead(demuxer_t *demuxer) (unsigned)seek->seek_id, pos); get_header_element(demuxer, seek->seek_id, pos); // This is nice to warn against incomplete files. - if (pos >= s->end_pos) + int64_t end = 0; + stream_control(s, STREAM_CTRL_GET_SIZE, &end); + if (pos >= end) MP_WARN(demuxer, "SeekHead position beyond " "end of file - incomplete file?\n"); } @@ -1723,7 +1725,9 @@ static int read_mkv_segment_header(demuxer_t *demuxer, int64_t *segment_end) MP_VERBOSE(demuxer, " (skipping)\n"); if (*segment_end <= 0) break; - if (*segment_end >= s->end_pos) + int64_t end = 0; + stream_control(s, STREAM_CTRL_GET_SIZE, &end); + if (*segment_end >= end) return 0; if (!stream_seek(s, *segment_end)) { MP_WARN(demuxer, "Failed to seek in file\n"); @@ -1794,7 +1798,9 @@ static int demux_mkv_open(demuxer_t *demuxer, enum demux_check check) } MP_VERBOSE(demuxer, "Seeking to %"PRIu64" to read header element 0x%x.\n", elem->pos, (unsigned)elem->id); - if (elem->pos >= s->end_pos) { + int64_t end = 0; + stream_control(s, STREAM_CTRL_GET_SIZE, &end); + if (elem->pos >= end) { MP_WARN(demuxer, "SeekHead position beyond " "end of file - incomplete file?\n"); continue; @@ -2748,7 +2754,10 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs, int flags) return; } - target_filepos = (uint64_t) (s->end_pos * rel_seek_secs); + int64_t size = 0; + stream_control(s, STREAM_CTRL_GET_SIZE, &size); + + target_filepos = (uint64_t) (size * rel_seek_secs); for (i = 0; i < mkv_d->num_indexes; i++) if (mkv_d->indexes[i].tnum == v_tnum) if ((index == NULL) diff --git a/demux/demux_raw.c b/demux/demux_raw.c index 9d649c07a0..3c605e3f96 100644 --- a/demux/demux_raw.c +++ b/demux/demux_raw.c @@ -214,8 +214,8 @@ static void raw_seek(demuxer_t *demuxer, float rel_seek_secs, int flags) { struct priv *p = demuxer->priv; stream_t *s = demuxer->stream; - stream_update_size(s); - int64_t end = s->end_pos; + int64_t end = 0; + stream_control(s, STREAM_CTRL_GET_SIZE, &end); int64_t pos = (flags & SEEK_ABSOLUTE) ? 0 : stream_tell(s); if (flags & SEEK_FACTOR) pos += end * rel_seek_secs; @@ -235,9 +235,8 @@ static int raw_control(demuxer_t *demuxer, int cmd, void *arg) switch (cmd) { case DEMUXER_CTRL_GET_TIME_LENGTH: { stream_t *s = demuxer->stream; - stream_update_size(s); - int64_t end = s->end_pos; - if (!end) + int64_t end = 0; + if (stream_control(s, STREAM_CTRL_GET_SIZE, &end) != STREAM_OK) return DEMUXER_CTRL_DONTKNOW; *((double *) arg) = (end / p->frame_size) / p->frame_rate; |