From acad31c2d382043f1c43c74a678de659a54a3788 Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 3 May 2013 19:52:28 +0200 Subject: core: don't report byte-based playback position with dvd DVD playback uses a demuxer that signals to the frontend that timestamp resets are possible. This made the frontend calculate the OSD playback position based on the byte position and the total size of the stream. This actually broke DVD playback position display. Since DVD reports a a linear playback position, we don't have to rely on the demuxer reported position, so disable this functionality in case of DVD playback. This reverts the OSD behavior with DVD to the old behavior. --- stream/cache2.c | 6 ++++++ stream/stream.c | 5 +++++ stream/stream.h | 4 ++++ stream/stream_dvd.c | 2 ++ 4 files changed, 17 insertions(+) (limited to 'stream') diff --git a/stream/cache2.c b/stream/cache2.c index 7744f2cba9..6c11ec9812 100644 --- a/stream/cache2.c +++ b/stream/cache2.c @@ -323,6 +323,9 @@ static int cache_execute_control(cache_vars_t *s) { case STREAM_CTRL_GET_LANG: s->control_res = s->stream->control(s->stream, s->control, (void *)&s->control_lang_arg); break; + case STREAM_CTRL_MANAGES_TIMELINE: + s->control_res = s->stream->control(s->stream, s->control, NULL); + break; default: s->control_res = STREAM_UNSUPPORTED; break; @@ -659,6 +662,7 @@ int cache_do_control(stream_t *stream, int cmd, void *arg) { case STREAM_CTRL_GET_NUM_ANGLES: case STREAM_CTRL_GET_ANGLE: case STREAM_CTRL_GET_SIZE: + case STREAM_CTRL_MANAGES_TIMELINE: case -2: s->control = cmd; break; @@ -707,6 +711,8 @@ int cache_do_control(stream_t *stream, int cmd, void *arg) { case STREAM_CTRL_GET_LANG: *(struct stream_lang_req *)arg = s->control_lang_arg; break; + case STREAM_CTRL_MANAGES_TIMELINE: + break; } return s->control_res; } diff --git a/stream/stream.c b/stream/stream.c index 8e38d1983e..36594d8556 100644 --- a/stream/stream.c +++ b/stream/stream.c @@ -769,3 +769,8 @@ struct bstr stream_read_complete(struct stream *s, void *talloc_ctx, buf, total_read }; } + +bool stream_manages_timeline(struct stream *s) +{ + return stream_control(s, STREAM_CTRL_MANAGES_TIMELINE, NULL) == STREAM_OK; +} diff --git a/stream/stream.h b/stream/stream.h index c47452aeb9..b6fe40b56a 100644 --- a/stream/stream.h +++ b/stream/stream.h @@ -101,6 +101,8 @@ #define STREAM_CTRL_GET_CACHE_FILL 16 #define STREAM_CTRL_GET_CACHE_IDLE 17 #define STREAM_CTRL_RECONNECT 18 +// DVD/Bluray, signal general support for GET_CURRENT_TIME etc. +#define STREAM_CTRL_MANAGES_TIMELINE 19 struct stream_lang_req { int type; // STREAM_AUDIO, STREAM_SUB @@ -406,6 +408,8 @@ int stream_read_internal(stream_t *s, void *buf, int len); /// Internal seek function bypassing the stream buffer int stream_seek_internal(stream_t *s, int64_t newpos); +bool stream_manages_timeline(stream_t *s); + extern int dvd_title; extern int dvd_angle; diff --git a/stream/stream_dvd.c b/stream/stream_dvd.c index 0207ae3969..0b85e320ba 100644 --- a/stream/stream_dvd.c +++ b/stream/stream_dvd.c @@ -712,6 +712,8 @@ static int control(stream_t *stream,int cmd,void* arg) snprintf(req->name, sizeof(req->name), "%c%c", lang >> 8, lang); return STREAM_OK; } + case STREAM_CTRL_MANAGES_TIMELINE: + return STREAM_OK; } return STREAM_UNSUPPORTED; } -- cgit v1.2.3