summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Schmidt <jan@centricular.com>2015-05-12 21:52:24 +1000
committerJan Schmidt <jan@centricular.com>2015-05-12 21:52:24 +1000
commitbc7e8282d3734949f4696bd846bd092a7c37feb6 (patch)
tree5fc17d8dbfdee9c794f2c8676d843e2bcb2ef756
parentf034f77b73d59754de5b3822e6075c14ae9338ee (diff)
dvdread: Work around basesrc initial seek
Ignore the initial seek basesrc sends, as it breaks starting from another chapter by immediately seeking back to the start of the title
-rw-r--r--ext/dvdread/dvdreadsrc.c8
-rw-r--r--ext/dvdread/dvdreadsrc.h1
2 files changed, 9 insertions, 0 deletions
diff --git a/ext/dvdread/dvdreadsrc.c b/ext/dvdread/dvdreadsrc.c
index e0584ef9..52c0d22b 100644
--- a/ext/dvdread/dvdreadsrc.c
+++ b/ext/dvdread/dvdreadsrc.c
@@ -115,6 +115,7 @@ gst_dvd_read_src_init (GstDvdReadSrc * src)
src->dvd_title = NULL;
src->location = g_strdup ("/dev/dvd");
+ src->first_seek = TRUE;
src->new_seek = TRUE;
src->new_cell = TRUE;
src->change_cell = FALSE;
@@ -1239,6 +1240,13 @@ gst_dvd_read_src_do_seek (GstBaseSrc * basesrc, GstSegment * s)
GST_DEBUG_OBJECT (src, "Seeking to %s: %12" G_GINT64_FORMAT,
gst_format_get_name (s->format), s->position);
+ /* Ignore the first seek to 0, as it breaks starting playback
+ * from another chapter by seeking back to sector 0 */
+ if (src->first_seek && s->format == GST_FORMAT_BYTES && s->start == 0) {
+ src->first_seek = FALSE;
+ return TRUE;
+ }
+
if (s->format == sector_format || s->format == GST_FORMAT_BYTES
|| s->format == GST_FORMAT_TIME) {
guint old;
diff --git a/ext/dvdread/dvdreadsrc.h b/ext/dvdread/dvdreadsrc.h
index 4fa63724..fbca0ee0 100644
--- a/ext/dvdread/dvdreadsrc.h
+++ b/ext/dvdread/dvdreadsrc.h
@@ -48,6 +48,7 @@ struct _GstDvdReadSrc {
/* location */
gchar *location;
+ gboolean first_seek;
gboolean new_seek;
gboolean change_cell;