From bc7e8282d3734949f4696bd846bd092a7c37feb6 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Tue, 12 May 2015 21:52:24 +1000 Subject: [PATCH] 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 --- ext/dvdread/dvdreadsrc.c | 8 ++++++++ ext/dvdread/dvdreadsrc.h | 1 + 2 files changed, 9 insertions(+) diff --git a/ext/dvdread/dvdreadsrc.c b/ext/dvdread/dvdreadsrc.c index e0584ef9b6..52c0d22b08 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 4fa63724c7..fbca0ee02d 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;