summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: f4bb2dd)
raw | patch | inline | side by side (parent: f4bb2dd)
author | Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> | |
Fri, 16 Sep 2011 14:35:06 +0000 (15:35 +0100) | ||
committer | Nikhil Devshatwar <a0132237@ti.com> | |
Fri, 17 May 2013 09:40:40 +0000 (15:10 +0530) |
This fixes seeking on titles which do not start on a new file.
https://bugzilla.gnome.org/show_bug.cgi?id=659252
https://bugzilla.gnome.org/show_bug.cgi?id=659252
ext/dvdread/dvdreadsrc.c | patch | blob | history |
index ba36bec0e250f5132988e883e990844a91797392..1096de693b628625292ed695cd9df92737c8b986 100644 (file)
--- a/ext/dvdread/dvdreadsrc.c
+++ b/ext/dvdread/dvdreadsrc.c
return GST_BASE_SRC_CLASS (parent_class)->event (GST_BASE_SRC (src), event);
}
+static void
+gst_dvd_read_src_get_sector_bounds (GstDvdReadSrc * src, gint * first,
+ gint * last)
+{
+ gint c1, c2, tmp;
+ cur_title_get_chapter_bounds (src, 0, &c1, &tmp);
+ cur_title_get_chapter_bounds (src, src->num_chapters - 1, &tmp, &c2);
+ *first = src->cur_pgc->cell_playback[c1].first_sector;
+ *last = src->cur_pgc->cell_playback[c2].last_sector;
+}
+
static gboolean
gst_dvd_read_src_do_seek (GstBaseSrc * basesrc, GstSegment * s)
{
old = src->cur_pack;
if (s->format == sector_format) {
+ gint first, last;
+ gst_dvd_read_src_get_sector_bounds (src, &first, &last);
+ GST_DEBUG_OBJECT (src, "Format is sector, seeking to %d", s->last_stop);
src->cur_pack = s->last_stop;
+ if (src->cur_pack < first)
+ src->cur_pack = first;
+ if (src->cur_pack > last)
+ src->cur_pack = last;
} else if (s->format == GST_FORMAT_TIME) {
gint sector;
+ GST_DEBUG_OBJECT (src, "Format is time");
sector = gst_dvd_read_src_get_sector_from_time (src, s->last_stop);
src->cur_pack = sector;
} else {
/* byte format */
+ gint first, last;
+ gst_dvd_read_src_get_sector_bounds (src, &first, &last);
+ GST_DEBUG_OBJECT (src, "Format is byte");
src->cur_pack = s->last_stop / DVD_VIDEO_LB_LEN;
if (((gint64) src->cur_pack * DVD_VIDEO_LB_LEN) != s->last_stop) {
GST_LOG_OBJECT (src, "rounded down offset %" G_GINT64_FORMAT " => %"
G_GINT64_FORMAT, s->last_stop,
(gint64) src->cur_pack * DVD_VIDEO_LB_LEN);
}
+ src->cur_pack += first;
}
if (!gst_dvd_read_src_goto_sector (src, src->angle)) {