Hi,

attached is the preliminary patch I wrote during FUDCon hackfest day
that makes Parole build with both GStreamer 0.10 and the new 1.0. It's
made similar how Pragha adds GStreamer 1.0 to its sources. Parole builds
fine with both versions, but seems to segfault with 1.0 on f18 for me.
The quite long GStreamer 1.0 porting notes are at [1]


With regards,

Dan

[1]
http://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/random/porting-to-1.0.txt
>From f903ab7baef01f170e9931db60f60e93068e1984 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <[email protected]>
Date: Wed, 17 Oct 2012 18:23:24 +0200
Subject: [PATCH] initial port to gstreamer 1.0

---
 configure.ac.in          |   32 +++++++++++++++---
 src/gst/parole-gst.c     |   81 ++++++++++++++++++++++++++++++++++++++++++++--
 src/parole-conf-dialog.c |   12 +++++++
 src/parole-vis.c         |    4 ++
 4 files changed, 121 insertions(+), 8 deletions(-)

diff --git a/configure.ac.in b/configure.ac.in
index 40bdb1e..237ad70 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -75,12 +75,32 @@ AC_CHECK_HEADERS([errno.h signal.h stddef.h sys/ioctl.h fcntl.h\
 
 XDT_I18N([@LINGUAS@])
 
+dnl gstreamer version
+AC_ARG_WITH([gstreamer],
+            [AS_HELP_STRING([--with-gstreamer=0.10|1.0],[which gstreamer version to compile against (default: 0.10)])],
+            [case "$with_gstreamer" in
+                0.10|1.0) ;;
+                *) AC_MSG_ERROR([invalid gstreamer version specified]) ;;
+             esac],
+            [with_gstreamer=0.10]
+)
+
+case "$with_gstreamer" in
+  0.10) gstreamer_api_version=0.10
+       gstreamer_minimum_version=0.10.31
+       ;;
+  1.0) gstreamer_api_version=1.0
+       gstreamer_minimum_version=0.11.90
+       ;;
+esac
+AC_DEFINE_UNQUOTED(GSTREAMER_API_VERSION, $gstreamer_api_version, [Define the GStreamer+ API version])
+
 #==================================================== #
 #          Check for required packages 		      #
 #=====================================================#
 m4_define([gtk_minimum_version], [2.20.0])
 m4_define([glib_minimum_version], [2.32.0])
-m4_define([gstreamer_minimum_version], [0.10.24])
+#m4_define([gstreamer_minimum_version], [0.10.24])
 
 m4_define([dbus_minimum_version], [0.60])
 m4_define([dbus_glib_minimum_version], [0.70])
@@ -97,10 +117,12 @@ XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [glib_minimum_version])
 XDT_CHECK_PACKAGE([GMODULE], [gmodule-2.0], [glib_minimum_version])
 XDT_CHECK_PACKAGE([GIO], [gio-2.0], [glib_minimum_version])
 
-XDT_CHECK_PACKAGE([GST], [gstreamer-0.10], [gstreamer_minimum_version])
-XDT_CHECK_PACKAGE([GST_BASE], [gstreamer-base-0.10], [gstreamer_minimum_version])
-XDT_CHECK_PACKAGE([GST_VIDEO], [gstreamer-video-0.10], [gstreamer_minimum_version])
-XDT_CHECK_PACKAGE([GST_INTERFACES], [gstreamer-interfaces-0.10], [gstreamer_minimum_version])
+XDT_CHECK_PACKAGE([GST], [gstreamer-${gstreamer_api_version}], [gstreamer_minimum_version])
+XDT_CHECK_PACKAGE([GST_BASE], [gstreamer-base-${gstreamer_api_version}], [gstreamer_minimum_version])
+XDT_CHECK_PACKAGE([GST_VIDEO], [gstreamer-video-${gstreamer_api_version}], [gstreamer_minimum_version])
+if test x"${gstreamer_api_version}" = x"0.10"; then
+    XDT_CHECK_PACKAGE([GST_INTERFACES], [gstreamer-interfaces-${gstreamer_api_version}], [gstreamer_minimum_version])
+fi
 
 XDT_CHECK_PACKAGE([DBUS], [dbus-1], [dbus_minimum_version])
 XDT_CHECK_PACKAGE([DBUS_GLIB], [dbus-glib-1], [dbus_glib_minimum_version])
diff --git a/src/gst/parole-gst.c b/src/gst/parole-gst.c
index ef1a3a8..1dcef89 100644
--- a/src/gst/parole-gst.c
+++ b/src/gst/parole-gst.c
@@ -28,8 +28,15 @@
 
 #include <glib.h>
 
+#include "parole-gst.h"
+
+#if GST_CHECK_VERSION(1, 0, 0)
+#include <gst/video/videooverlay.h>
+#include <gst/video/navigation.h>
+#else
 #include <gst/interfaces/xoverlay.h>
 #include <gst/interfaces/navigation.h>
+#endif
 
 #include <gst/video/video.h>
 
@@ -38,8 +45,6 @@
 
 #include <gdk/gdkx.h>
 
-#include "parole-gst.h"
-
 #include "common/parole-common.h"
 #include "common/parole-rc-utils.h"
 
@@ -491,8 +496,13 @@ parole_gst_set_x_overlay (ParoleGst *gst)
     g_assert (video_sink != NULL);
     
     if ( GDK_IS_WINDOW (GTK_WIDGET (gst)->window) )
+#if GST_CHECK_VERSION(1, 0, 0)
+	gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (video_sink),
+				      GDK_WINDOW_XID (GTK_WIDGET (gst)->window));
+#else
 	gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (video_sink),
 				      GDK_WINDOW_XWINDOW (GTK_WIDGET (gst)->window));
+#endif
     
     gst_object_unref (video_sink);
     
@@ -523,14 +533,22 @@ parole_gst_expose_event (GtkWidget *widget, GdkEventExpose *ev)
 	case GST_STATE_PLAYING:
 	    if ( playing_video || gst->priv->vis_loaded)
 	    {
+#if GST_CHECK_VERSION(1, 0, 0)
+		gst_video_overlay_expose (GST_VIDEO_OVERLAY (gst->priv->video_sink));
+#else
 		gst_x_overlay_expose (GST_X_OVERLAY (gst->priv->video_sink));
+#endif
 	    }
 	    else
 		parole_gst_draw_logo (gst);
 	    break;
 	case GST_STATE_PAUSED:
 	    if ( playing_video || gst->priv->vis_loaded || gst->priv->target == GST_STATE_PLAYING )
+#if GST_CHECK_VERSION(1, 0, 0)
+		gst_video_overlay_expose (GST_VIDEO_OVERLAY (gst->priv->video_sink));
+#else
 		gst_x_overlay_expose (GST_X_OVERLAY (gst->priv->video_sink));
+#endif
 	    else
 		parole_gst_draw_logo (gst);
 	    break;
@@ -538,7 +556,11 @@ parole_gst_expose_event (GtkWidget *widget, GdkEventExpose *ev)
 	    if (gst->priv->target != GST_STATE_PLAYING)
 		parole_gst_draw_logo (gst);
 	    else
+#if GST_CHECK_VERSION(1, 0, 0)
+		gst_video_overlay_expose (GST_VIDEO_OVERLAY (gst->priv->video_sink));
+#else
 		gst_x_overlay_expose (GST_X_OVERLAY (gst->priv->video_sink));
+#endif
 	    break;
 	case GST_STATE_NULL:
 	case GST_STATE_VOID_PENDING:
@@ -604,7 +626,11 @@ parole_gst_tick_timeout (gpointer data)
 		  "duration", &duration,
 		  NULL);
     
+#if GST_CHECK_VERSION(1, 0, 0)
+    gst_element_query_position (gst->priv->playbin, format, &pos);
+#else
     gst_element_query_position (gst->priv->playbin, &format, &pos);
+#endif
     
     if ( G_UNLIKELY (format != GST_FORMAT_TIME ) )
 	goto out;
@@ -664,7 +690,11 @@ parole_gst_query_duration (ParoleGst *gst)
     gst_time = GST_FORMAT_TIME;
     
     gst_element_query_duration (gst->priv->playbin, 
+#if GST_CHECK_VERSION(1, 0, 0)
+				gst_time,
+#else
 				&gst_time,
+#endif
 				&absolute_duration);
     
     if (gst_time == GST_FORMAT_TIME)
@@ -759,7 +789,11 @@ parole_gst_load_subtitle (ParoleGst *gst)
 static void
 parole_gst_get_pad_capabilities (GObject *object, GParamSpec *pspec, ParoleGst *gst)
 {
+#if GST_CHECK_VERSION(1, 0, 0)
+    GstCaps *caps;
+#else
     GstPad *pad;
+#endif
     GstStructure *st;
     gint width;
     gint height;
@@ -767,12 +801,21 @@ parole_gst_get_pad_capabilities (GObject *object, GParamSpec *pspec, ParoleGst *
     guint den;
     const GValue *value;
     
+#if GST_CHECK_VERSION(1, 0, 0)
+    caps = GST_CAPS (object);
+    
+    if ( !GST_IS_CAPS (caps) || !GST_CAPS (caps) )
+	return;
+    
+    st = gst_caps_get_structure (GST_CAPS (caps), 0);
+#else
     pad = GST_PAD (object);
     
     if ( !GST_IS_PAD (pad) || !GST_PAD_CAPS (pad) )
 	return;
     
     st = gst_caps_get_structure (GST_PAD_CAPS (pad), 0);
+#endif
     
     if ( st )
     {
@@ -825,7 +868,11 @@ parole_gst_query_info (ParoleGst *gst)
 	{
 	    GstCaps *caps;
 	    
+#if GST_CHECK_VERSION(1, 0, 0)
+	    if ((caps = gst_pad_get_current_caps (videopad)))
+#else
 	    if ((caps = gst_pad_get_negotiated_caps (videopad)))
+#endif
 	    {
 		parole_gst_get_pad_capabilities (G_OBJECT (videopad), NULL, gst);
 		gst_caps_unref (caps);
@@ -985,10 +1032,18 @@ parole_gst_evaluate_state (ParoleGst *gst, GstState old, GstState new, GstState
 static void
 parole_gst_element_message_sync (GstBus *bus, GstMessage *message, ParoleGst *gst)
 {
+#if GST_CHECK_VERSION(1, 0, 0)
+    if ( !(gst_message_get_structure(message)) )
+#else
     if ( !message->structure )
+#endif
 	goto out;
 	
+#if GST_CHECK_VERSION(1, 0, 0)
+    if ( gst_structure_has_name (gst_message_get_structure(message), "prepare-xwindow-id") )
+#else
     if ( gst_structure_has_name (message->structure, "prepare-xwindow-id") )
+#endif
 	parole_gst_set_x_overlay (gst);
 out:
     ;
@@ -1102,7 +1157,11 @@ parole_gst_application_message (ParoleGst *gst, GstMessage *msg)
 {
     const gchar *name;
 
+#if GST_CHECK_VERSION(1, 0, 0)
+    name = gst_structure_get_name (gst_message_get_structure(msg));
+#else
     name = gst_structure_get_name (msg->structure);
+#endif
     
     if ( !name )
 	return;
@@ -1429,7 +1488,11 @@ parole_gst_seek_by_format (ParoleGst *gst, GstFormat format, gint step)
 {
     gint64 val = 1;
     
+#if GST_CHECK_VERSION(1, 0, 0)
+    if ( gst_element_query_position (gst->priv->playbin, format, &val) )
+#else
     if ( gst_element_query_position (gst->priv->playbin, &format, &val) )
+#endif
     {
 	val += step;
 	if ( !gst_element_seek (gst->priv->playbin, 1.0, format, 
@@ -1711,7 +1774,11 @@ parole_gst_constructed (GObject *object)
      * Handling 'prepare-xwindow-id' message async causes XSync 
      * error in some occasions So we handle this message synchronously
      */
-    gst_bus_set_sync_handler (gst->priv->bus, gst_bus_sync_signal_handler, gst);
+    gst_bus_set_sync_handler (gst->priv->bus, gst_bus_sync_signal_handler, gst
+#if GST_CHECK_VERSION (1, 0, 0)
+				, NULL
+#endif
+				);
     gst->priv->sig2 =
 	g_signal_connect (gst->priv->bus, "sync-message::element",
 			  G_CALLBACK (parole_gst_element_message_sync), gst);
@@ -2164,7 +2231,11 @@ gint parole_gst_get_current_cdda_track (ParoleGst *gst)
     
     format = gst_format_get_by_nick ("track");
     
+#if GST_CHECK_VERSION(1, 0, 0)
+    if ( gst_element_query_position (gst->priv->playbin, format, &pos) )
+#else
     if ( gst_element_query_position (gst->priv->playbin, &format, &pos) )
+#endif
     {
 	TRACE ("Pos %" G_GINT64_FORMAT, pos);
 	ret_val = (gint) pos;
@@ -2188,7 +2259,11 @@ gint64 parole_gst_get_stream_position (ParoleGst *gst)
     GstFormat format = GST_FORMAT_TIME;
     gint64 pos;
     
+#if GST_CHECK_VERSION(1, 0, 0)
+    gst_element_query_position (gst->priv->playbin, format, &pos);
+#else
     gst_element_query_position (gst->priv->playbin, &format, &pos);
+#endif
     
     return  pos / GST_SECOND;
 }
diff --git a/src/parole-conf-dialog.c b/src/parole-conf-dialog.c
index 3158cb1..23cb1c9 100644
--- a/src/parole-conf-dialog.c
+++ b/src/parole-conf-dialog.c
@@ -243,7 +243,11 @@ void parole_conf_dialog_vis_plugin_changed_cb (GtkComboBox *widget,  ParoleConfD
     if ( f )
     {
 	g_object_set (G_OBJECT (self->priv->conf),
+#if GST_CHECK_VERSION (1, 0, 0)
+		      "vis-name", GST_OBJECT_NAME (f),
+#else
 		      "vis-name", GST_PLUGIN_FEATURE_NAME (f),
+#endif
 		      NULL);
     }
     
@@ -334,10 +338,18 @@ parole_conf_dialog_set_default_vis_plugin (GtkTreeModel *model, GtkTreePath *pat
     
     if ( !g_strcmp0 (vis_name, "none") )
     {
+#if GST_CHECK_VERSION (1, 0, 0)
+	if ( !g_strcmp0 (GST_OBJECT_NAME (f), "Goom") )
+#else
 	if ( !g_strcmp0 (GST_PLUGIN_FEATURE_NAME (f), "Goom") )
+#endif
 	    ret = TRUE;
     }
+#if GST_CHECK_VERSION (1, 0, 0)
+    else if ( !g_strcmp0 (GST_OBJECT_NAME (f), vis_name) )
+#else
     else if ( !g_strcmp0 (GST_PLUGIN_FEATURE_NAME (f), vis_name) )
+#endif
     {
 	ret = TRUE;
     }
diff --git a/src/parole-vis.c b/src/parole-vis.c
index 5f0648b..ebec66e 100644
--- a/src/parole-vis.c
+++ b/src/parole-vis.c
@@ -60,7 +60,11 @@ GHashTable *parole_vis_get_plugins (void)
     
     hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
     
+#if GST_CHECK_VERSION (1, 0, 0)
+    plugins = gst_registry_feature_filter (gst_registry_get (),
+#else
     plugins = gst_registry_feature_filter (gst_registry_get_default (),
+#endif
 					   parole_vis_filter,
 					   FALSE,
 					   NULL);
-- 
1.7.7.6

_______________________________________________
xfce mailing list
[email protected]
https://admin.fedoraproject.org/mailman/listinfo/xfce

Reply via email to