summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
Diffstat (limited to 'demux')
-rw-r--r--demux/demux.c3
-rw-r--r--demux/demux_lavf.c8
-rw-r--r--demux/demux_raw.c10
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: