[maemo-commits] [maemo-commits] r18070 - projects/haf/trunk/hildon-welcome/src

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Wed Apr 15 13:15:58 EEST 2009
Author: schulhof
Date: 2009-04-15 13:15:57 +0300 (Wed, 15 Apr 2009)
New Revision: 18070

Modified:
   projects/haf/trunk/hildon-welcome/src/tmp.c
Log:
Working on video :/

Modified: projects/haf/trunk/hildon-welcome/src/tmp.c
===================================================================
--- projects/haf/trunk/hildon-welcome/src/tmp.c	2009-04-15 10:02:32 UTC (rev 18069)
+++ projects/haf/trunk/hildon-welcome/src/tmp.c	2009-04-15 10:15:57 UTC (rev 18070)
@@ -1,33 +1,39 @@
-/**
- * cc -g -Wall -O0 `pkg-config --cflags --libs gstreamer-0.10 gstreamer-plugins-base-0.10 gstreamer-interfaces-0.10 xcomposite` tmp.c -o play
- * ./play /usr/share/sounds/ui-wake_up_tune.wav /usr/share/sounds/call-ringtone01.wav
- * ./play /usr/share/hildon-welcome/media/Hands-v32-h264.avi /usr/share/hildon-welcome/media/Hands-v32-h264.avi
- **/
-
 #include <stdlib.h>
 #include <gst/gst.h>
+
+#define HAVE_VIDEO
+
+#define APP_STATE_STATIC_INIT { \
+  .audio_sink = NULL, \
+  .video_sink = NULL, \
+  .dst_window = 0, \
+  .overlay_window = 0, \
+  .display = NULL, \
+}
+
 #include <gst/interfaces/xoverlay.h>
 #include <X11/Xlib.h>
 #include <X11/extensions/Xcomposite.h>
 
-//#define HAVE_VIDEO
+typedef struct {
+  GstElement *audio_sink;
+  GstElement *video_sink;
+  Window dst_window;
+  Window overlay_window;
+  Display *display;
+} AppState;
 
-#ifdef HAVE_VIDEO
-#define VIDEO_SINK 0
-#endif /* HAVE_VIDEO */
-#define AUDIO_SINK 1
-
 static void
-no_more_pads(GstElement *src, GstElement *sinks[2])
+link_to_sink(GstElement *decodebin2, AppState *app_state)
 {
+  gst_element_link(decodebin2, app_state->audio_sink);
 #ifdef HAVE_VIDEO
-  gst_element_link(src, sinks[VIDEO_SINK]);
+  gst_element_link(decodebin2, app_state->video_sink);
 #endif /* HAVE_VIDEO */
-  gst_element_link(src, sinks[AUDIO_SINK]);
 }
 
 static GstElement *
-create_bin(char *fname, GstElement *sinks[2])
+create_bin(char *fname, AppState *app_state)
 {
   static int counter = 0;
   char *name = NULL;
@@ -40,52 +46,62 @@
   filesrc = gst_element_factory_make("filesrc", NULL);
   g_object_set(G_OBJECT(filesrc), "location", fname, NULL);
   decodebin2 = gst_element_factory_make("decodebin2", NULL);
-  g_signal_connect(G_OBJECT(decodebin2), "no-more-pads", (GCallback)no_more_pads, sinks);
+  g_signal_connect(G_OBJECT(decodebin2), "no-more-pads", (GCallback)link_to_sink, app_state);
   gst_bin_add_many(GST_BIN(bin), filesrc, decodebin2, NULL);
   gst_element_link(filesrc, decodebin2);
 
   return bin;
 }
 
+static gboolean
+send_seek_event(GstElement *pipeline, const char *message, gboolean seek_sent)
+{
+  if (!seek_sent) {
+
+    g_debug("%s: About to send seek\n", message);
+
+    seek_sent = gst_element_send_event(pipeline,
+      gst_event_new_seek(1.0, GST_FORMAT_TIME,
+        GST_SEEK_FLAG_SEGMENT | GST_SEEK_FLAG_FLUSH,
+        GST_SEEK_TYPE_SET,  G_GUINT64_CONSTANT(0),
+        GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE));
+
+    g_debug("%s: Sending seek %s\n", message, seek_sent ? "SUCCEEDED" : "FAILED");
+
+    return seek_sent;
+  }
+  else
+    g_debug("%s: Already sent seek\n", message);
+
+  return TRUE;
+}
+
 static void
-play_file(GstElement *pipeline, char *audio, Window dst_window, GstElement *sinks[2])
+play_file(GstElement *pipeline, char *file, AppState *app_state)
 {
   GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
 
-  g_print("play_file: Entering with \"%s\"\n", audio);
+  g_debug("play_file: === Entering with \"%s\"\n", file);
 
   if (bus) {
+    gboolean seek_sent = FALSE;
     gboolean keep_looping = TRUE;
     GstMessage *msg = NULL;
     GstElement *new_bin = NULL;
 
-    new_bin = create_bin(audio, sinks);
+    new_bin = create_bin(file, app_state);
     gst_bin_add(GST_BIN(pipeline), new_bin);
     gst_element_set_state(pipeline, GST_STATE_PAUSED);
-    gst_element_send_event(pipeline,
-      gst_event_new_seek(1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH|GST_SEEK_FLAG_SEGMENT, GST_SEEK_TYPE_SET, G_GUINT64_CONSTANT(0), GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE));
+    seek_sent = send_seek_event(pipeline, "Before loop", seek_sent);
     gst_element_set_state(pipeline, GST_STATE_PLAYING);
 
-    g_print("play_file: Entering loop\n");
+    g_debug("play_file: Entering loop\n");
 
     while (keep_looping) {
       msg = gst_bus_poll(bus, GST_MESSAGE_ANY, -1);
       if (!msg) break;
 
       switch (GST_MESSAGE_TYPE(msg)) {
-        case GST_MESSAGE_STATE_CHANGED:
-          if (GST_OBJECT(pipeline) == GST_MESSAGE_SRC(msg))
-          {
-            GstState oldstate, newstate, pending;
-            gst_message_parse_state_changed(msg, &oldstate, &newstate, &pending);
-            g_debug("wait_for_eos: %s state-changed: old = %s, new = %s, pending = %s\n",
-              gst_element_get_name(GST_ELEMENT(GST_MESSAGE_SRC(msg))),
-              gst_element_state_get_name(oldstate),
-              gst_element_state_get_name(newstate),
-              gst_element_state_get_name(pending));
-          }
-          break;
-
         case GST_MESSAGE_ERROR:
           {
             GError *err = NULL;
@@ -94,7 +110,7 @@
             gst_message_parse_error(msg, &err, &debug);
 
             if (err) {
-              g_print("play_file: error: %s, debug: %s\n", err->message ? err->message : "?", debug ? debug : "?");
+              g_debug("play_file: error: %s, debug: %s\n", err->message ? err->message : "?", debug ? debug : "?");
               g_error_free(err);
               err = NULL;
             }
@@ -104,15 +120,17 @@
           /* fall through */
         case GST_MESSAGE_EOS:
         case GST_MESSAGE_SEGMENT_DONE:
-          g_print("play_file: Exiting loop: %s\n", GST_MESSAGE_TYPE_NAME(msg));
+          g_debug("play_file: %s\n", GST_MESSAGE_TYPE_NAME(msg));
           keep_looping = FALSE;
           break;
-
+#ifdef HAVE_VIDEO
         case GST_MESSAGE_ELEMENT:
-          if (gst_structure_has_name(msg->structure, "prepare-xwindow-id"))
-            gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(GST_MESSAGE_SRC(msg)), dst_window);
+          if (gst_structure_has_name(msg->structure, "prepare-xwindow-id")) {
+            g_debug("play_file: Setting destination window\n");
+            gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(GST_MESSAGE_SRC(msg)), app_state->dst_window);
+          }
           break;
-
+#endif /* HAVE_VIDEO */
         default:
           break;
       }
@@ -120,55 +138,76 @@
       gst_message_unref(msg);
     }
 
-    GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(pipeline), GST_DEBUG_GRAPH_SHOW_ALL, "playdetails");
+    gst_element_set_state(new_bin, GST_STATE_NULL);
+    gst_bin_remove(GST_BIN(pipeline), new_bin);
 
     /* Flush the bus before unrefing */
     gst_bus_set_flushing(bus, TRUE);
     gst_bus_set_flushing(bus, FALSE);
     gst_object_unref(bus);
+  }
 
-    gst_element_set_state(new_bin, GST_STATE_NULL);
-    g_print("play_file: Removing %s from pipeline\n", gst_element_get_name(new_bin));
-    gst_bin_remove(GST_BIN(pipeline), new_bin);
-
-    g_print("play_file: === Exiting with \"%s\"\n", audio);
+  g_debug("play_file: === Exiting with \"%s\"\n", file);
+}
+#ifdef HAVE_VIDEO
+void
+grab_dst_window(AppState *app_state)
+{
+  app_state->display = XOpenDisplay(NULL);
+  if (app_state->display) {
+    app_state->dst_window = DefaultRootWindow(app_state->display);
+    if (app_state->dst_window) {
+      app_state->overlay_window = XCompositeGetOverlayWindow(app_state->display, app_state->dst_window);
+      if (app_state->overlay_window)
+        app_state->dst_window = app_state->overlay_window;
+    }
   }
 }
 
+void
+release_dst_window(AppState *app_state)
+{
+  if (app_state->overlay_window)
+    XCompositeReleaseOverlayWindow(app_state->display, app_state->overlay_window);
+  if (app_state->display)
+    XCloseDisplay(app_state->display);
+}
+#endif /* HAVE_VIDEO */
 int
 main(int argc, char **argv)
 {
   int Nix;
-  GstElement *pipeline = NULL, *sinks[2];
+  AppState app_state = APP_STATE_STATIC_INIT;
+  GstElement *pipeline = NULL;
+
   gst_init(&argc, &argv);
-  Display *display;
-  Window dst_window = 0, xcomposite_window = 0;
 
-  if (!(display = XOpenDisplay(NULL)))
-    g_error("main: Failed to open display\n");
-  if ((dst_window = DefaultRootWindow(display)) == 0)
-    g_error("main: Failed to obtain root window\n");
-  if ((xcomposite_window = XCompositeGetOverlayWindow(display, dst_window)) != 0)
-    dst_window = xcomposite_window;
+#ifdef HAVE_VIDEO
+  g_debug("HAVE VIDEO!\n");
+#else /* !HAVE_VIDEO */
+  g_debug("NO VIDEO!\n");
+#endif /* HAVE_VIDEO */
 
   if (argc > 1)
     if ((pipeline = gst_pipeline_new("sequence-player"))) {
+      app_state.audio_sink = gst_element_factory_make("autoaudiosink", NULL);
+      gst_bin_add(GST_BIN(pipeline), app_state.audio_sink);
+#ifdef HAVE_VIDEO
+      app_state.video_sink = gst_element_factory_make("autovideosink", NULL);
+      gst_bin_add(GST_BIN(pipeline), app_state.video_sink);
 
-      sinks[AUDIO_SINK] = gst_element_factory_make("autoaudiosink", NULL);
-      gst_bin_add(GST_BIN(pipeline), sinks[AUDIO_SINK]);
-#ifdef HAVE_VIDEO
-      sinks[VIDEO_SINK] = gst_element_factory_make("autovideosink", NULL);
-      gst_bin_add(GST_BIN(pipeline), sinks[VIDEO_SINK]);
+      grab_dst_window(&app_state);
 #endif /* HAVE_VIDEO */
       for (Nix = 1 ; Nix < argc ; Nix++)
-        play_file(pipeline, argv[Nix], dst_window, sinks);
+        play_file(pipeline, argv[Nix], &app_state);
       gst_element_set_state(pipeline, GST_STATE_NULL);
       gst_object_unref(pipeline);
+
+#ifdef HAVE_VIDEO
+    release_dst_window(&app_state);
+#endif /* HAVE_VIDEO */
     }
 
-  if (xcomposite_window)
-    XCompositeReleaseOverlayWindow(display, xcomposite_window);
-  XCloseDisplay(display);
   gst_deinit();
   return 0;
 }


More information about the maemo-commits mailing list