summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-11-04 00:43:06 +0100
committerwm4 <wm4@nowhere>2013-11-04 00:43:06 +0100
commitf7b2d644eff7fae2d74259ae14ec2b05b00c9b9b (patch)
treeca5462391d6a8f7b8e254c51c88f30efea91b90f /demux
parent37388ebb0ef9085c841d7f94e665a5a77cfe0e92 (diff)
parent25affdcc886ce010995804553396d81d90a321d3 (diff)
downloadmpv-f7b2d644eff7fae2d74259ae14ec2b05b00c9b9b.tar.bz2
mpv-f7b2d644eff7fae2d74259ae14ec2b05b00c9b9b.tar.xz
Merge branch 'master' into have_configure
Conflicts: configure
Diffstat (limited to 'demux')
-rw-r--r--demux/demux.c13
-rw-r--r--demux/demux.h2
-rw-r--r--demux/demux_lavf.c23
-rw-r--r--demux/demux_libass.c2
-rw-r--r--demux/demux_mf.c5
-rw-r--r--demux/demux_mkv.c14
-rw-r--r--demux/demux_raw.c8
-rw-r--r--demux/demux_subreader.c2
8 files changed, 30 insertions, 39 deletions
diff --git a/demux/demux.c b/demux/demux.c
index eeb979be9d..a0164d529a 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -533,9 +533,8 @@ static struct demuxer *open_given_type(struct MPOpts *opts,
.type = desc->type,
.stream = stream,
.stream_pts = MP_NOPTS_VALUE,
- .movi_start = stream->start_pos,
- .movi_end = stream->end_pos,
- .seekable = 1,
+ .seekable = (stream->flags & MP_STREAM_SEEK) == MP_STREAM_SEEK &&
+ stream->end_pos > 0,
.accurate_seek = true,
.filepos = -1,
.opts = opts,
@@ -566,6 +565,12 @@ static struct demuxer *open_given_type(struct MPOpts *opts,
add_stream_chapters(demuxer);
demuxer_sort_chapters(demuxer);
demux_info_update(demuxer);
+ // Pretend we can seek if we can't seek, but there's a cache.
+ if (!demuxer->seekable && stream->uncached_stream) {
+ mp_msg(MSGT_DEMUXER, MSGL_WARN,
+ "File is not seekable, but there's a cache: enabling seeking.\n");
+ demuxer->seekable = true;
+ }
return demuxer;
}
@@ -634,7 +639,7 @@ void demux_flush(demuxer_t *demuxer)
int demux_seek(demuxer_t *demuxer, float rel_seek_secs, int flags)
{
if (!demuxer->seekable) {
- mp_tmsg(MSGT_SEEK, MSGL_WARN, "Cannot seek in this file.\n");
+ mp_tmsg(MSGT_DEMUXER, MSGL_WARN, "Cannot seek in this file.\n");
return 0;
}
diff --git a/demux/demux.h b/demux/demux.h
index 0c8f9cb3f8..1c8562eb63 100644
--- a/demux/demux.h
+++ b/demux/demux.h
@@ -166,8 +166,6 @@ typedef struct demuxer {
const demuxer_desc_t *desc; ///< Demuxer description structure
const char *filetype; // format name when not identified by demuxer (libavformat)
int64_t filepos; // input stream current pos.
- int64_t movi_start;
- int64_t movi_end;
struct stream *stream;
double stream_pts; // current stream pts, if applicable (e.g. dvd)
char *filename; // same as stream->url
diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c
index e80db5aed4..b2dfcb2193 100644
--- a/demux/demux_lavf.c
+++ b/demux/demux_lavf.c
@@ -584,9 +584,12 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
}
}
- if (!(priv->avif->flags & AVFMT_NOFILE) &&
- demuxer->stream->type != STREAMTYPE_AVDEVICE)
+ if ((priv->avif->flags & AVFMT_NOFILE) ||
+ demuxer->stream->type == STREAMTYPE_AVDEVICE)
{
+ // This might be incorrect.
+ demuxer->seekable = true;
+ } else {
void *buffer = av_malloc(lavfdopts->buffersize);
if (!buffer)
return -1;
@@ -597,9 +600,7 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
return -1;
}
priv->pb->read_seek = mp_read_seek;
- priv->pb->seekable = demuxer->stream->end_pos
- && (demuxer->stream->flags & MP_STREAM_SEEK) == MP_STREAM_SEEK
- ? AVIO_SEEKABLE_NORMAL : 0;
+ priv->pb->seekable = demuxer->seekable ? AVIO_SEEKABLE_NORMAL : 0;
avfc->pb = priv->pb;
}
@@ -857,12 +858,12 @@ static void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs, int flags)
avsflags = AVSEEK_FLAG_BACKWARD;
if (flags & SEEK_FACTOR) {
- if (demuxer->movi_end > 0 && demuxer->ts_resets_possible &&
+ struct stream *s = demuxer->stream;
+ if (s->end_pos > 0 && demuxer->ts_resets_possible &&
!(priv->avif->flags & AVFMT_NO_BYTE_SEEK))
{
avsflags |= AVSEEK_FLAG_BYTE;
- priv->last_pts = (demuxer->movi_end - demuxer->movi_start) *
- rel_seek_secs;
+ priv->last_pts = (s->end_pos - s->start_pos) * rel_seek_secs;
} else if (priv->avfc->duration != 0 &&
priv->avfc->duration != AV_NOPTS_VALUE)
{
@@ -923,12 +924,12 @@ static int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg)
switch (cmd) {
case DEMUXER_CTRL_GET_TIME_LENGTH:
if (priv->seek_by_bytes) {
+ struct stream *s = demuxer->stream;
/* Our bitrate estimate may be better than would be used in
* otherwise similar fallback code at higher level */
- if (demuxer->movi_end <= 0)
+ if (s->end_pos <= 0)
return DEMUXER_CTRL_DONTKNOW;
- *(double *)arg = (demuxer->movi_end - demuxer->movi_start) * 8 /
- priv->bitrate;
+ *(double *)arg = (s->end_pos - s->start_pos) * 8 / priv->bitrate;
return DEMUXER_CTRL_GUESS;
}
if (priv->avfc->duration == 0 || priv->avfc->duration == AV_NOPTS_VALUE)
diff --git a/demux/demux_libass.c b/demux/demux_libass.c
index d98cdbb5a4..73c8b3a5c8 100644
--- a/demux/demux_libass.c
+++ b/demux/demux_libass.c
@@ -100,6 +100,8 @@ static int d_check_file(struct demuxer *demuxer, enum demux_check check)
sh->sub->track = track;
sh->codec = "ass";
+ demuxer->seekable = true;
+
return 0;
}
diff --git a/demux/demux_mf.c b/demux/demux_mf.c
index 0d7b2ece8a..50888f59ad 100644
--- a/demux/demux_mf.c
+++ b/demux/demux_mf.c
@@ -85,7 +85,6 @@ static int demux_mf_fill_buffer(demuxer_t *demuxer)
demux_packet_t *dp = new_demux_packet(data.len);
memcpy(dp->buffer, data.start, data.len);
dp->pts = mf->curr_frame / mf->sh->fps;
- dp->pos = mf->curr_frame;
dp->keyframe = true;
demuxer_add_packet(demuxer, demuxer->streams[0], dp);
}
@@ -200,9 +199,6 @@ static int demux_open_mf(demuxer_t* demuxer, enum demux_check check)
mf->curr_frame = 0;
- demuxer->movi_start = 0;
- demuxer->movi_end = mf->nr_of_files - 1;
-
// create a new video stream header
struct sh_stream *sh = new_sh_stream(demuxer, STREAM_VIDEO);
sh_video = sh->video;
@@ -214,6 +210,7 @@ static int demux_open_mf(demuxer_t* demuxer, enum demux_check check)
mf->sh = sh_video;
demuxer->priv=(void*)mf;
+ demuxer->seekable = true;
return 0;
diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c
index eb352e0f64..6110d25930 100644
--- a/demux/demux_mkv.c
+++ b/demux/demux_mkv.c
@@ -1029,7 +1029,7 @@ static int demux_mkv_read_seekhead(demuxer_t *demuxer)
continue;
}
uint64_t pos = seek->seek_position + mkv_d->segment_start;
- if (pos >= demuxer->movi_end) {
+ if (pos >= s->end_pos) {
mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] SeekHead position beyond "
"end of file - incomplete file?\n");
continue;
@@ -1844,14 +1844,6 @@ static int demux_mkv_open(demuxer_t *demuxer, enum demux_check check)
display_create_tracks(demuxer);
- if (s->end_pos == 0) {
- demuxer->seekable = 0;
- } else {
- demuxer->movi_start = s->start_pos;
- demuxer->movi_end = s->end_pos;
- demuxer->seekable = 1;
- }
-
return 0;
}
@@ -2713,7 +2705,7 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs, int flags)
}
demux_mkv_fill_buffer(demuxer);
- } else if ((demuxer->movi_end <= 0) || !(flags & SEEK_ABSOLUTE))
+ } else if (!(flags & SEEK_ABSOLUTE))
mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n");
else {
stream_t *s = demuxer->stream;
@@ -2729,7 +2721,7 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs, int flags)
return;
}
- target_filepos = (uint64_t) (demuxer->movi_end * rel_seek_secs);
+ target_filepos = (uint64_t) (s->end_pos * 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 4d6e171ad4..01cf3574a0 100644
--- a/demux/demux_raw.c
+++ b/demux/demux_raw.c
@@ -100,9 +100,6 @@ static int demux_rawaudio_open(demuxer_t *demuxer, enum demux_check check)
w->wBitsPerSample = 8 * samplesize;
w->cbSize = 0;
- demuxer->movi_start = demuxer->stream->start_pos;
- demuxer->movi_end = demuxer->stream->end_pos;
-
struct priv *p = talloc_ptrtype(demuxer, p);
demuxer->priv = p;
*p = (struct priv) {
@@ -185,9 +182,6 @@ static int demux_rawvideo_open(demuxer_t *demuxer, enum demux_check check)
sh_video->disp_h = height;
sh_video->i_bps = fps * imgsize;
- demuxer->movi_start = demuxer->stream->start_pos;
- demuxer->movi_end = demuxer->stream->end_pos;
-
struct priv *p = talloc_ptrtype(demuxer, p);
demuxer->priv = p;
*p = (struct priv) {
@@ -207,7 +201,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->movi_start;
+ dp->pos = stream_tell(demuxer->stream) - demuxer->stream->start_pos;
dp->pts = (dp->pos / p->frame_size) / p->frame_rate;
int len = stream_read(demuxer->stream, dp->buffer, dp->len);
diff --git a/demux/demux_subreader.c b/demux/demux_subreader.c
index cc02e61595..21bcf21614 100644
--- a/demux/demux_subreader.c
+++ b/demux/demux_subreader.c
@@ -1358,6 +1358,8 @@ static int d_open_file(struct demuxer *demuxer, enum demux_check check)
add_sub_data(demuxer, sd);
subdata_free(sd);
+ demuxer->seekable = true;
+
return 0;
}