summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--demux/demux.c6
-rw-r--r--stream/cache2.c6
-rw-r--r--stream/stream.c5
-rw-r--r--stream/stream.h4
-rw-r--r--stream/stream_dvd.c2
5 files changed, 22 insertions, 1 deletions
diff --git a/demux/demux.c b/demux/demux.c
index e1bb960e78..937c881639 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -922,6 +922,10 @@ static struct demuxer *open_given_type(struct MPOpts *opts,
opts->correct_pts =
demux_control(demuxer, DEMUXER_CTRL_CORRECT_PTS,
NULL) == DEMUXER_CTRL_OK;
+ if (stream_manages_timeline(demuxer->stream)) {
+ // Incorrect, but fixes some behavior with DVD/BD
+ demuxer->ts_resets_possible = false;
+ }
demuxer_sort_chapters(demuxer);
return demuxer;
} else {
@@ -1071,7 +1075,7 @@ int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay,
* (nothing actually implements DEMUXER_CTRL_RESYNC now).
*/
struct stream *stream = demuxer->stream;
- if (stream->type == STREAMTYPE_DVD) {
+ if (stream_manages_timeline(stream)) {
double pts;
if (flags & SEEK_ABSOLUTE)
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;
}