diff options
author | wm4 <wm4@nowhere> | 2013-11-04 00:43:06 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2013-11-04 00:43:06 +0100 |
commit | f7b2d644eff7fae2d74259ae14ec2b05b00c9b9b (patch) | |
tree | ca5462391d6a8f7b8e254c51c88f30efea91b90f /demux | |
parent | 37388ebb0ef9085c841d7f94e665a5a77cfe0e92 (diff) | |
parent | 25affdcc886ce010995804553396d81d90a321d3 (diff) | |
download | mpv-f7b2d644eff7fae2d74259ae14ec2b05b00c9b9b.tar.bz2 mpv-f7b2d644eff7fae2d74259ae14ec2b05b00c9b9b.tar.xz |
Merge branch 'master' into have_configure
Conflicts:
configure
Diffstat (limited to 'demux')
-rw-r--r-- | demux/demux.c | 13 | ||||
-rw-r--r-- | demux/demux.h | 2 | ||||
-rw-r--r-- | demux/demux_lavf.c | 23 | ||||
-rw-r--r-- | demux/demux_libass.c | 2 | ||||
-rw-r--r-- | demux/demux_mf.c | 5 | ||||
-rw-r--r-- | demux/demux_mkv.c | 14 | ||||
-rw-r--r-- | demux/demux_raw.c | 8 | ||||
-rw-r--r-- | demux/demux_subreader.c | 2 |
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; } |