ext/resindvd/resindvdsrc.c: Fix next/prev chapter seeking at the beginning or end.
authorJan Schmidt <thaytan@mad.scientist.com>
Tue, 7 Oct 2008 21:29:26 +0000 (21:29 +0000)
committerJan Schmidt <thaytan@mad.scientist.com>
Tue, 7 Oct 2008 21:29:26 +0000 (21:29 +0000)
Original commit message from CVS:
* ext/resindvd/resindvdsrc.c:
Fix next/prev chapter seeking at the beginning or end.
Use 64-bit scaling utility functions for converting MPEG
timestamps.

ChangeLog
ext/resindvd/resindvdsrc.c

index 0d4860e..f05dd5b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-10-07  Jan Schmidt  <jan.schmidt@sun.com>
+
+       * ext/resindvd/resindvdsrc.c:
+       Fix next/prev chapter seeking at the beginning or end.
+       Use 64-bit scaling utility functions for converting MPEG
+       timestamps.
+
 2008-10-07  Wim Taymans  <wim.taymans@collabora.co.uk>
 
        Patch by: HÃ¥vard Graff <havard dot graff at tandberg dot com>
index 371624e..30b4a0d 100644 (file)
@@ -38,8 +38,10 @@ GST_DEBUG_CATEGORY_STATIC (rsndvdsrc_debug);
 #define CLOCK_BASE 9LL
 #define CLOCK_FREQ CLOCK_BASE * 10000
 
-#define MPEGTIME_TO_GSTTIME(time) (((time) * (GST_MSECOND/10)) / CLOCK_BASE)
-#define GSTTIME_TO_MPEGTIME(time) (((time) * CLOCK_BASE) / (GST_MSECOND/10))
+#define MPEGTIME_TO_GSTTIME(time) (gst_util_uint64_scale ((time), \
+            GST_MSECOND/10, CLOCK_BASE))
+#define GSTTIME_TO_MPEGTIME(time) (gst_util_uint64_scale ((time), \
+            CLOCK_BASE, GST_MSECOND/10))
 
 typedef enum
 {
@@ -1891,8 +1893,16 @@ rsn_dvdsrc_do_seek (RsnBaseSrc * bsrc, GstSegment * segment)
         gint32 title, chapters, x;
         if (dvdnav_current_title_info (src->dvdnav, &title, &x) ==
             DVDNAV_STATUS_OK) {
-          if (dvdnav_get_number_of_parts (src->dvdnav, title, &chapters) ==
-              DVDNAV_STATUS_OK) {
+          if (segment->start + 1 == x) {
+            dvdnav_prev_pg_search (src->dvdnav);
+            ret = TRUE;
+            src->discont = TRUE;
+          } else if (segment->start == x + 1) {
+            dvdnav_next_pg_search (src->dvdnav);
+            ret = TRUE;
+            src->discont = TRUE;
+          } else if (dvdnav_get_number_of_parts (src->dvdnav, title,
+                  &chapters) == DVDNAV_STATUS_OK) {
             if (segment->start > 0 && segment->start <= chapters) {
               dvdnav_part_play (src->dvdnav, title, segment->start);
               ret = TRUE;