summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--stream/stream_dvdnav.c20
-rw-r--r--stream/stream_dvdnav.h1
2 files changed, 21 insertions, 0 deletions
diff --git a/stream/stream_dvdnav.c b/stream/stream_dvdnav.c
index 1bb3a17210..76d5ade3df 100644
--- a/stream/stream_dvdnav.c
+++ b/stream/stream_dvdnav.c
@@ -30,6 +30,7 @@ typedef enum {
NAV_FLAG_WAIT_READ = 1 << 5, /* suspend read from stream */
NAV_FLAG_VTS_DOMAIN = 1 << 6, /* vts domain */
NAV_FLAG_SPU_SET = 1 << 7, /* spu_clut is valid */
+ NAV_FLAG_STREAM_CHANGE = 1 << 8, /* title, chapter, audio or SPU */
} dvdnav_state_t;
typedef struct {
@@ -198,6 +199,7 @@ static int dvdnav_stream_read(dvdnav_priv_t * priv, unsigned char *buf, int *len
uint32_t nextstill;
priv->state &= ~NAV_FLAG_WAIT_SKIP;
+ priv->state |= NAV_FLAG_STREAM_CHANGE;
if(ev->pgc_length)
priv->duration = ev->pgc_length/90;
@@ -233,6 +235,11 @@ static int dvdnav_stream_read(dvdnav_priv_t * priv, unsigned char *buf, int *len
}
case DVDNAV_VTS_CHANGE: {
priv->state &= ~NAV_FLAG_WAIT_SKIP;
+ priv->state |= NAV_FLAG_STREAM_CHANGE;
+ break;
+ }
+ case DVDNAV_SPU_STREAM_CHANGE: {
+ priv->state |= NAV_FLAG_STREAM_CHANGE;
break;
}
}
@@ -899,9 +906,22 @@ int mp_dvdnav_cell_has_changed (stream_t *stream, int clear) {
return 0;
if (clear)
priv->state &= ~NAV_FLAG_CELL_CHANGED;
+ if (clear) priv->state |= NAV_FLAG_STREAM_CHANGE;
return 1;
}
+/* Notify if something has changed in stream
+ * Can be related to title, chapter, audio or SPU
+ */
+int mp_dvdnav_stream_has_changed (stream_t *stream) {
+ dvdnav_priv_t *priv = stream->priv;
+
+ if (!(priv->state & NAV_FLAG_STREAM_CHANGE))
+ return 0;
+
+ priv->state &= ~NAV_FLAG_STREAM_CHANGE;
+ return 1;
+}
const stream_info_t stream_info_dvdnav = {
"DVDNAV stream",
diff --git a/stream/stream_dvdnav.h b/stream/stream_dvdnav.h
index d0536fe830..4b9d71e6d8 100644
--- a/stream/stream_dvdnav.h
+++ b/stream/stream_dvdnav.h
@@ -27,5 +27,6 @@ int mp_dvdnav_skip_still (stream_t *stream);
int mp_dvdnav_skip_wait (stream_t *stream);
void mp_dvdnav_read_wait (stream_t *stream, int mode, int automode);
int mp_dvdnav_cell_has_changed (stream_t *stream, int clear);
+int mp_dvdnav_stream_has_changed (stream_t *stream);
#endif /* MPLAYER_STREAM_DVDNAV_H */