mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-13 09:45:27 +00:00
dvdreadsrc: take into account first sector of the current title
This fixes seeking on titles which do not start on a new file. https://bugzilla.gnome.org/show_bug.cgi?id=659252
This commit is contained in:
parent
59ed3b7bf2
commit
40274ad92f
1 changed files with 23 additions and 0 deletions
|
@ -1183,6 +1183,17 @@ gst_dvd_read_src_handle_seek_event (GstDvdReadSrc * src, GstEvent * event)
|
||||||
return GST_BASE_SRC_CLASS (parent_class)->event (GST_BASE_SRC (src), event);
|
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
|
static gboolean
|
||||||
gst_dvd_read_src_do_seek (GstBaseSrc * basesrc, GstSegment * s)
|
gst_dvd_read_src_do_seek (GstBaseSrc * basesrc, GstSegment * s)
|
||||||
{
|
{
|
||||||
|
@ -1200,9 +1211,17 @@ gst_dvd_read_src_do_seek (GstBaseSrc * basesrc, GstSegment * s)
|
||||||
old = src->cur_pack;
|
old = src->cur_pack;
|
||||||
|
|
||||||
if (s->format == sector_format) {
|
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;
|
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) {
|
} else if (s->format == GST_FORMAT_TIME) {
|
||||||
gint sector;
|
gint sector;
|
||||||
|
GST_DEBUG_OBJECT (src, "Format is time");
|
||||||
|
|
||||||
sector = gst_dvd_read_src_get_sector_from_time (src, s->last_stop);
|
sector = gst_dvd_read_src_get_sector_from_time (src, s->last_stop);
|
||||||
|
|
||||||
|
@ -1215,12 +1234,16 @@ gst_dvd_read_src_do_seek (GstBaseSrc * basesrc, GstSegment * s)
|
||||||
src->cur_pack = sector;
|
src->cur_pack = sector;
|
||||||
} else {
|
} else {
|
||||||
/* byte format */
|
/* 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;
|
src->cur_pack = s->last_stop / DVD_VIDEO_LB_LEN;
|
||||||
if (((gint64) src->cur_pack * DVD_VIDEO_LB_LEN) != s->last_stop) {
|
if (((gint64) src->cur_pack * DVD_VIDEO_LB_LEN) != s->last_stop) {
|
||||||
GST_LOG_OBJECT (src, "rounded down offset %" G_GINT64_FORMAT " => %"
|
GST_LOG_OBJECT (src, "rounded down offset %" G_GINT64_FORMAT " => %"
|
||||||
G_GINT64_FORMAT, s->last_stop,
|
G_GINT64_FORMAT, s->last_stop,
|
||||||
(gint64) src->cur_pack * DVD_VIDEO_LB_LEN);
|
(gint64) src->cur_pack * DVD_VIDEO_LB_LEN);
|
||||||
}
|
}
|
||||||
|
src->cur_pack += first;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gst_dvd_read_src_goto_sector (src, src->angle)) {
|
if (!gst_dvd_read_src_goto_sector (src, src->angle)) {
|
||||||
|
|
Loading…
Reference in a new issue