gst-plugins-base: seek: Make the seek-bar insensitive for DVD menus

Sebastian Dröge slomo at kemper.freedesktop.org
Mon Feb 20 07:44:52 PST 2012


Module: gst-plugins-base
Branch: master
Commit: a24c72cccaa8d9e84ff15285b5af403d168ed3c9
URL:    http://cgit.freedesktop.org/gstreamer/gst-plugins-base/commit/?id=a24c72cccaa8d9e84ff15285b5af403d168ed3c9

Author: Sebastian Dröge <sebastian.droege at collabora.co.uk>
Date:   Mon Feb 20 15:29:49 2012 +0100

seek: Make the seek-bar insensitive for DVD menus

---

 tests/examples/seek/seek.c |   49 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 49 insertions(+), 0 deletions(-)

diff --git a/tests/examples/seek/seek.c b/tests/examples/seek/seek.c
index 70aa0e5..e9eb17f 100644
--- a/tests/examples/seek/seek.c
+++ b/tests/examples/seek/seek.c
@@ -1606,6 +1606,7 @@ stop_cb (GtkButton * button, gpointer data)
       connect_bus_signals (pipeline);
     }
 #endif
+    gtk_widget_set_sensitive (GTK_WIDGET (hscale), TRUE);
   }
   return;
 
@@ -2649,6 +2650,53 @@ msg_step_done (GstBus * bus, GstMessage * message, GstPipeline * data)
 }
 
 static void
+msg (GstBus * bus, GstMessage * message, GstPipeline * data)
+{
+  GstNavigationMessageType nav_type;
+
+  nav_type = gst_navigation_message_get_type (message);
+  switch (nav_type) {
+    case GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED:{
+      GstQuery *query;
+      gboolean res;
+
+      /* Heuristic to detect if we're dealing with a DVD menu */
+      query = gst_navigation_query_new_commands ();
+      res = gst_element_query (GST_ELEMENT (GST_MESSAGE_SRC (message)), query);
+
+      if (res) {
+        gboolean is_menu = FALSE;
+        guint i, n;
+
+        if (gst_navigation_query_parse_commands_length (query, &n)) {
+          for (i = 0; i < n; i++) {
+            GstNavigationCommand cmd;
+
+            if (!gst_navigation_query_parse_commands_nth (query, i, &cmd))
+              break;
+
+            is_menu |= (cmd == GST_NAVIGATION_COMMAND_ACTIVATE);
+            is_menu |= (cmd == GST_NAVIGATION_COMMAND_LEFT);
+            is_menu |= (cmd == GST_NAVIGATION_COMMAND_RIGHT);
+            is_menu |= (cmd == GST_NAVIGATION_COMMAND_UP);
+            is_menu |= (cmd == GST_NAVIGATION_COMMAND_DOWN);
+          }
+        }
+
+        gtk_widget_set_sensitive (GTK_WIDGET (hscale), !is_menu);
+      } else {
+        g_assert_not_reached ();
+      }
+
+      gst_query_unref (query);
+      break;
+    }
+    default:
+      break;
+  }
+}
+
+static void
 connect_bus_signals (GstElement * pipeline)
 {
   GstBus *bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
@@ -2692,6 +2740,7 @@ connect_bus_signals (GstElement * pipeline)
       pipeline);
   g_signal_connect (bus, "sync-message::step-done",
       (GCallback) msg_sync_step_done, pipeline);
+  g_signal_connect (bus, "message", (GCallback) msg, pipeline);
 
   gst_object_unref (bus);
 }



More information about the gstreamer-commits mailing list