diff options
Diffstat (limited to 'demux')
-rw-r--r-- | demux/demux.c | 3 | ||||
-rw-r--r-- | demux/demux_lavf.c | 8 | ||||
-rw-r--r-- | demux/demux_raw.c | 10 |
3 files changed, 10 insertions, 11 deletions
diff --git a/demux/demux.c b/demux/demux.c index 5dcd7a31ea..4da1adb134 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -599,7 +599,7 @@ static struct demuxer *open_given_type(struct mpv_global *global, .metadata = talloc_zero(demuxer, struct mp_tags), }; demuxer->params = params; // temporary during open() - stream_seek(stream, stream->start_pos); + int64_t start_pos = stream_tell(stream); mp_verbose(log, "Trying demuxer: %s (force-level: %s)\n", desc->name, d_level(check)); @@ -634,6 +634,7 @@ static struct demuxer *open_given_type(struct mpv_global *global, } free_demuxer(demuxer); + stream_seek(stream, start_pos); return NULL; } diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c index d493e9f631..b5a6ef998c 100644 --- a/demux/demux_lavf.c +++ b/demux/demux_lavf.c @@ -140,10 +140,10 @@ static int64_t mp_seek(void *opaque, int64_t pos, int whence) else if (whence == SEEK_END && stream->end_pos > 0) pos += stream->end_pos; else if (whence == SEEK_SET) - pos += stream->start_pos; + /* ok */; else if (whence == AVSEEK_SIZE && stream->end_pos > 0) { stream_update_size(stream); - return stream->end_pos - stream->start_pos; + return stream->end_pos; } else return -1; @@ -155,7 +155,7 @@ static int64_t mp_seek(void *opaque, int64_t pos, int whence) return -1; } - return pos - stream->start_pos; + return pos; } static int64_t mp_read_seek(void *opaque, int stream_idx, int64_t ts, int flags) @@ -828,7 +828,7 @@ static void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs, int flags) !(priv->avif->flags & AVFMT_NO_BYTE_SEEK)) { avsflags |= AVSEEK_FLAG_BYTE; - priv->last_pts = (s->end_pos - s->start_pos) * rel_seek_secs; + priv->last_pts = s->end_pos * rel_seek_secs; } else if (priv->avfc->duration != 0 && priv->avfc->duration != AV_NOPTS_VALUE) { diff --git a/demux/demux_raw.c b/demux/demux_raw.c index 63674cea0c..9d649c07a0 100644 --- a/demux/demux_raw.c +++ b/demux/demux_raw.c @@ -200,7 +200,7 @@ static int raw_fill_buffer(demuxer_t *demuxer) return 0; struct demux_packet *dp = new_demux_packet(p->frame_size * p->read_frames); - dp->pos = stream_tell(demuxer->stream) - demuxer->stream->start_pos; + dp->pos = stream_tell(demuxer->stream); dp->pts = (dp->pos / p->frame_size) / p->frame_rate; int len = stream_read(demuxer->stream, dp->buffer, dp->len); @@ -215,11 +215,10 @@ 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 start = s->start_pos; int64_t end = s->end_pos; - int64_t pos = (flags & SEEK_ABSOLUTE) ? start : stream_tell(s); + int64_t pos = (flags & SEEK_ABSOLUTE) ? 0 : stream_tell(s); if (flags & SEEK_FACTOR) - pos += (end - start) * rel_seek_secs; + pos += end * rel_seek_secs; else pos += rel_seek_secs * p->frame_rate * p->frame_size; if (pos < 0) @@ -237,12 +236,11 @@ static int raw_control(demuxer_t *demuxer, int cmd, void *arg) case DEMUXER_CTRL_GET_TIME_LENGTH: { stream_t *s = demuxer->stream; stream_update_size(s); - int64_t start = s->start_pos; int64_t end = s->end_pos; if (!end) return DEMUXER_CTRL_DONTKNOW; - *((double *) arg) = ((end - start) / p->frame_size) / p->frame_rate; + *((double *) arg) = (end / p->frame_size) / p->frame_rate; return DEMUXER_CTRL_OK; } default: |