summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-05-24 14:03:07 +0200
committerwm4 <wm4@nowhere>2014-05-24 16:17:50 +0200
commite3c20bf3505679641f247471603ad298d04036bd (patch)
tree72926a284ecd34a3d1be9de8db8d5af0ed45eba8 /demux
parent3316cf5f9b213dc047aa0515fbc51f12fb27cc58 (diff)
downloadmpv-e3c20bf3505679641f247471603ad298d04036bd.tar.bz2
mpv-e3c20bf3505679641f247471603ad298d04036bd.tar.xz
stream: kill start_pos, remove --sb option
stream.start_pos was needed for optical media only, and (apparently) not for very good reasons. Just get rid of it. For stream_dvd, we don't need to do anything. Byte seeking was already removed from it earlier. For stream_cdda and stream_vcd, emulate the start_pos by offsetting the stream pos as seen by the rest of mpv. The bits in discnav.c and loadfile.c were for dealing with the code seeking back to the start in demux.c. Handle this differently by assuming the demuxer is always initialized with the stream at start position, and instead seek back if initializing the demuxer fails. Remove the --sb option, which worked by modifying stream.start_pos. If someone really wants this option, it could be added back by creating a "slice" stream (actually ffmpeg already has such a thing).
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: