summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xine/BluRay/input_bluray.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/xine/BluRay/input_bluray.c b/xine/BluRay/input_bluray.c
index 504a5a5c..962235d7 100644
--- a/xine/BluRay/input_bluray.c
+++ b/xine/BluRay/input_bluray.c
@@ -125,6 +125,7 @@ typedef struct {
int current_clip;
int error;
int menu_open;
+ int stream_flushed;
int pg_enable;
int pg_stream;
@@ -287,8 +288,31 @@ static int open_title (bluray_input_plugin_t *this, int title)
return 1;
}
+#ifndef DEMUX_OPTIONAL_DATA_FLUSH
+# define DEMUX_OPTIONAL_DATA_FLUSH 0x10000
+#endif
+
+static void stream_flush(bluray_input_plugin_t *this)
+{
+ if (this->stream_flushed)
+ return;
+
+ lprintf("Stream flush\n");
+
+ this->stream_flushed = 1;
+
+ int tmp = 0;
+ if (DEMUX_OPTIONAL_SUCCESS !=
+ this->stream->demux_plugin->get_optional_data(this->stream->demux_plugin, &tmp, DEMUX_OPTIONAL_DATA_FLUSH)) {
+ LOGMSG("stream flush not supported by the demuxer !\n");
+ return;
+ }
+}
+
static void stream_reset(bluray_input_plugin_t *this)
{
+ lprintf("Stream reset\n");
+
this->cap_seekable = 0;
xine_set_param(this->stream, XINE_PARAM_FINE_SPEED, XINE_FINE_SPEED_NORMAL);
@@ -320,6 +344,11 @@ static void handle_libbluray_event(bluray_input_plugin_t *this, BD_EVENT ev)
_x_stream_info_set(this->stream, XINE_STREAM_INFO_DVD_ANGLE_NUMBER, ev.param);
break;
+ case BD_EVENT_END_OF_TITLE:
+ LOGMSG("BD_EVENT_END_OF_TITLE\n");
+ stream_flush(this);
+ break;
+
case BD_EVENT_TITLE:
LOGMSG("BD_EVENT_TITLE %d\n", ev.param);
this->current_title = ev.param;
@@ -583,6 +612,8 @@ static off_t bluray_plugin_read (input_plugin_t *this_gen, char *buf, off_t len)
if (result < 0)
LOGMSG("bd_read() failed: %s (%d of %d)\n", strerror(errno), (int)result, (int)len);
+ this->stream_flushed = 0;
+
#if 0
if (buf[4] != 0x47) {
LOGMSG("bd_read(): invalid data ? [%02x %02x %02x %02x %02x ...]\n",