demux_lavf: signal no seeking for RTSP streams without duration

RTSP supports seeking, but at least the libavformat implementation makes
this dependent on runtime behavior. So you have to perform a seek, and
check if it fails. But even if you do this, the stream is interrupted
and restarted, and there seem to be other issues.

Assume that RTSP with unknown duration means it's a live stream, and
disable seeking in this case, as suggested by the issue reporter.

Fixes: #7472
This commit is contained in:
wm4 2020-02-20 15:28:49 +01:00
parent bd6d8d320f
commit 6726b7a1ba
1 changed files with 5 additions and 0 deletions

View File

@ -146,6 +146,7 @@ struct format_hack {
bool is_network : 1;
bool no_seek : 1;
bool no_pcm_seek : 1;
bool no_seek_on_no_duration : 1;
};
#define BLACKLIST(fmt) {fmt, .ignore = true}
@ -174,6 +175,7 @@ static const struct format_hack format_hacks[] = {
{"matroska", .skipinfo = true, .no_pcm_seek = true, .use_stream_ids = true},
{"v4l2", .no_seek = true},
{"rtsp", .no_seek_on_no_duration = true},
// In theory, such streams might contain timestamps, but virtually none do.
{"h264", .if_flags = AVFMT_NOTIMESTAMPS },
@ -1090,6 +1092,9 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
demuxer->duration = duration;
}
if (demuxer->duration < 0 && priv->format_hack.no_seek_on_no_duration)
demuxer->seekable = false;
// In some cases, libavformat will export bogus bullshit timestamps anyway,
// such as with mjpeg.
if (priv->avif_flags & AVFMT_NOTIMESTAMPS) {