demux_lavf: mark as seekable if protocol supports seeking by time

Basically, this will mark the demuxer as seekable with rtmp* and mmsh
protocols. These protocols have network-level time seeking, and whether
you can seek on the byte level does not matter.

Until now, seeking was typically only enabled because of the cache, and
a (nonsensical) warning was shown accordingly.

It still could happen that the server doesn't actually support thse
requests (or simply rejects them), so this is somewhat imperfect.
This commit is contained in:
wm4 2014-10-30 22:46:25 +01:00
parent 56b852710a
commit a77a171b7f
4 changed files with 11 additions and 0 deletions

View File

@ -729,6 +729,8 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
priv->pb->read_seek = mp_read_seek;
priv->pb->seekable = demuxer->seekable ? AVIO_SEEKABLE_NORMAL : 0;
avfc->pb = priv->pb;
if (stream_control(demuxer->stream, STREAM_CTRL_HAS_AVSEEK, NULL) > 0)
demuxer->seekable = true;
}
if (matches_avinputformat_name(priv, "rtsp")) {

View File

@ -112,6 +112,7 @@ struct priv {
int64_t stream_size;
struct mp_tags *stream_metadata;
double start_pts;
bool has_avseek;
};
enum {
@ -361,6 +362,7 @@ static void update_cached_controls(struct priv *s)
s->stream_size = -1;
if (stream_control(s->stream, STREAM_CTRL_GET_SIZE, &i64) == STREAM_OK)
s->stream_size = i64;
s->has_avseek = stream_control(s->stream, STREAM_CTRL_HAS_AVSEEK, NULL) > 0;
}
// the core might call these every frame, so cache them...
@ -391,6 +393,8 @@ static int cache_get_cached_control(stream_t *cache, int cmd, void *arg)
*(double *)arg = s->start_pts;
return STREAM_OK;
}
case STREAM_CTRL_HAS_AVSEEK:
return s->has_avseek ? STREAM_OK : STREAM_UNSUPPORTED;
case STREAM_CTRL_GET_METADATA: {
if (s->stream_metadata) {
ta_set_parent(s->stream_metadata, NULL);

View File

@ -105,6 +105,7 @@ enum stream_ctrl {
STREAM_CTRL_DVB_SET_CHANNEL,
STREAM_CTRL_DVB_STEP_CHANNEL,
STREAM_CTRL_AVSEEK,
STREAM_CTRL_HAS_AVSEEK,
};
struct stream_lang_req {

View File

@ -117,6 +117,10 @@ static int control(stream_t *s, int cmd, void *arg)
return 1;
break;
}
case STREAM_CTRL_HAS_AVSEEK:
if (avio->read_seek)
return 1;
break;
case STREAM_CTRL_GET_METADATA: {
*(struct mp_tags **)arg = read_icy(s);
if (!*(struct mp_tags **)arg)