resindvd: Avoid a deadlock. Improve chapter seek.
authorJan Schmidt <thaytan@noraisin.net>
Mon, 26 Oct 2009 20:55:15 +0000 (20:55 +0000)
committerJan Schmidt <thaytan@noraisin.net>
Tue, 27 Oct 2009 12:23:26 +0000 (12:23 +0000)
Avoid a potential deadlock that happens when a call to
gst_clock_id_wait_async() immediately calls the callback.
Improve previous chapter seeking slightly by avoiding 'segment
start != -1' assertions when there is no previous chapter and
the seek therefore fails.

ext/resindvd/resindvdsrc.c

index a4ac9dc420075369189b05d2172211052ada4ef2..485535dfb9c3e0e8f535ac64e0b461c501e48bdf 100644 (file)
@@ -1562,15 +1562,11 @@ rsn_dvdsrc_handle_navigation_event (resinDvdSrc * src, GstEvent * event)
         gint title = 0;
         gint part = 0;
 
-        if (dvdnav_current_title_info (src->dvdnav, &title, &part) && title > 0
-            && part > 1) {
-          if (dvdnav_part_play (src->dvdnav, title, part - 1) ==
-              DVDNAV_STATUS_ERR)
+        if (dvdnav_current_title_info (src->dvdnav, &title, &part)) {
+          if (title > 0 && part > 1) {
             dvdnav_prev_pg_search (src->dvdnav);
-          nav_res = RSN_NAV_RESULT_BRANCH;
-        } else {
-          dvdnav_prev_pg_search (src->dvdnav);
-          nav_res = RSN_NAV_RESULT_BRANCH;
+            nav_res = RSN_NAV_RESULT_BRANCH;
+          }
         }
       } else if (g_str_equal (key, "period")) {
         dvdnav_next_pg_search (src->dvdnav);
@@ -2250,7 +2246,7 @@ rsn_dvdsrc_nav_clock_cb (GstClock * clock, GstClockTime time, GstClockID id,
   return TRUE;
 }
 
-/* Called with dvd_lock held */
+/* Called with dvd_lock held. NOTE: Releases dvd_lock briefly */
 static void
 rsn_dvdsrc_schedule_nav_cb (resinDvdSrc * src, RsnDvdPendingNav * next_nav)
 {
@@ -2281,8 +2277,10 @@ rsn_dvdsrc_schedule_nav_cb (resinDvdSrc * src, RsnDvdPendingNav * next_nav)
   GST_LOG_OBJECT (src, "Schedule nav pack for running TS %" GST_TIME_FORMAT,
       GST_TIME_ARGS (next_nav->running_ts));
 
+  g_mutex_unlock (src->dvd_lock);
   gst_clock_id_wait_async (src->nav_clock_id, rsn_dvdsrc_nav_clock_cb, src);
   gst_object_unref (clock);
+  g_mutex_lock (src->dvd_lock);
 }
 
 /* Called with dvd_lock held */
@@ -2649,10 +2647,10 @@ rsn_dvdsrc_do_seek (RsnBaseSrc * bsrc, GstSegment * segment)
      * everything up and flushing, we just need to step to the next
      * data block (below) so we know our new position */
     ret = TRUE;
+    /* HACK to make initial seek work: */
     src->first_seek = FALSE;
   } else {
-    /* FIXME: Handle other formats: Time, title, chapter, angle */
-    /* HACK to make initial seek work: */
+    /* Handle other formats: Time, title, chapter, angle */
     if (segment->format == GST_FORMAT_TIME) {
       g_mutex_lock (src->dvd_lock);
       src->discont = TRUE;
@@ -2733,8 +2731,12 @@ rsn_dvdsrc_do_seek (RsnBaseSrc * bsrc, GstSegment * segment)
 
     GST_LOG_OBJECT (src, "Entering prepare_next_block after seek."
         " Flushing = %d", src->flushing_seek);
-    if (rsn_dvdsrc_prepare_next_block (src, FALSE) != GST_FLOW_OK)
-      goto fail;
+    while (src->cur_start_ts == GST_CLOCK_TIME_NONE) {
+      if (rsn_dvdsrc_prepare_next_block (src, FALSE) != GST_FLOW_OK)
+        goto fail;
+      if (src->cur_start_ts == GST_CLOCK_TIME_NONE)
+        gst_buffer_replace (&src->next_buf, NULL);
+    }
     GST_LOG_OBJECT (src, "prepare_next_block after seek done");
 
     segment->format = GST_FORMAT_TIME;