[maemo-commits] [maemo-commits] r18391 - in projects/haf/trunk/hildon-thumbnail: . thumbnailers/gst-video-thumbnailer

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Fri May 15 16:48:09 EEST 2009
Author: pvanhoof
Date: 2009-05-15 16:48:07 +0300 (Fri, 15 May 2009)
New Revision: 18391

Modified:
   projects/haf/trunk/hildon-thumbnail/ChangeLog
   projects/haf/trunk/hildon-thumbnail/thumbnailers/gst-video-thumbnailer/gst-thumb-main.c
   projects/haf/trunk/hildon-thumbnail/thumbnailers/gst-video-thumbnailer/gst-thumb-pipe.c
   projects/haf/trunk/hildon-thumbnail/thumbnailers/gst-video-thumbnailer/gst-thumb-thumber.c
Log:
2009-05-16  Ottela Mikael  <mikael.ottela at ixonos.com>

        * thumbnailers/gst-video-thumbnailer/gst-thumb-thumber.c
        * thumbnailers/gst-video-thumbnailer/gst-thumb-pipe.c
        * thumbnailers/gst-video-thumbnailer/gst-thumb-main.c: Fixes the
        gst_dbus_poll->gst_bus_timed_pop, adds error handling (and
        propagation) and defaults to only creating cropped thumbs.



Modified: projects/haf/trunk/hildon-thumbnail/ChangeLog
===================================================================
--- projects/haf/trunk/hildon-thumbnail/ChangeLog	2009-05-15 13:30:24 UTC (rev 18390)
+++ projects/haf/trunk/hildon-thumbnail/ChangeLog	2009-05-15 13:48:07 UTC (rev 18391)
@@ -1,3 +1,11 @@
+2009-05-16  Ottela Mikael  <mikael.ottela at ixonos.com>
+
+	* thumbnailers/gst-video-thumbnailer/gst-thumb-thumber.c
+	* thumbnailers/gst-video-thumbnailer/gst-thumb-pipe.c
+	* thumbnailers/gst-video-thumbnailer/gst-thumb-main.c: Fixes the
+	gst_dbus_poll->gst_bus_timed_pop, adds error handling (and
+	propagation) and defaults to only creating cropped thumbs.
+
 2009-05-14  Philip Van Hoof  <pvanhoof at codeminded.be>
 
 	* config.h.in

Modified: projects/haf/trunk/hildon-thumbnail/thumbnailers/gst-video-thumbnailer/gst-thumb-main.c
===================================================================
--- projects/haf/trunk/hildon-thumbnail/thumbnailers/gst-video-thumbnailer/gst-thumb-main.c	2009-05-15 13:30:24 UTC (rev 18390)
+++ projects/haf/trunk/hildon-thumbnail/thumbnailers/gst-video-thumbnailer/gst-thumb-main.c	2009-05-15 13:48:07 UTC (rev 18391)
@@ -37,12 +37,14 @@
 static gboolean dynamic_register = FALSE;
 static gchar   *bus_name;
 static gchar   *bus_path;
+static gboolean standard;
+static gboolean cropped;
 static gint     timeout = 600;
 
 static GOptionEntry  config_entries[] = {
 	{ "timeout", 't', 0, 
 	  G_OPTION_ARG_INT, &timeout, 
-	  "Timeout before the thumbnailer dies. ", 
+	  "Timeout before the thumbnailer shuts down. ", 
 	  NULL },
 	{ "bus-name", 'b', 0, 
 	  G_OPTION_ARG_STRING, &bus_name, 
@@ -52,6 +54,14 @@
 	  G_OPTION_ARG_STRING, &bus_path, 
 	  "Buspath to use (eg. /com/company/Thumbnailer) ", 
 	  NULL },
+	{ "cropped", 'c', 0, 
+	  G_OPTION_ARG_NONE, &cropped, 
+	  "Disable cropped thumbnails ", 
+	  NULL },
+	{ "standard", 's', 0, 
+	  G_OPTION_ARG_NONE, &standard, 
+	  "Enable standard (normal/large) thumbnails ", 
+	  NULL },
 	{ "dynamic-register", 'd', 0, 
 	  G_OPTION_ARG_NONE, &dynamic_register, 
 	  "Dynamic registration using org.freedesktop.Thumbnailer.Manager", 
@@ -112,14 +122,23 @@
 
 	thumber = thumber_new ();
 
+	thumber_dbus_register (thumber, bus_name, bus_path, &error);
+
 	g_value_init (&val, G_TYPE_INT);
 	g_value_set_int (&val, timeout);
-
-	thumber_dbus_register (thumber, bus_name, bus_path, &error);
 	g_object_set_property (G_OBJECT(thumber), "timeout", &val);
+	g_value_unset (&val);
 
+	g_value_init (&val, G_TYPE_BOOLEAN);
+	g_value_set_boolean (&val, standard);
+	g_object_set_property (G_OBJECT(thumber), "standard", &val);
 	g_value_unset (&val);
-
+	
+	g_value_init (&val, G_TYPE_BOOLEAN);
+	g_value_set_boolean (&val, !cropped);
+	g_object_set_property (G_OBJECT(thumber), "cropped", &val);
+	g_value_unset (&val);
+	
 	g_message ("Starting...");
 	thumber_start (thumber);
 

Modified: projects/haf/trunk/hildon-thumbnail/thumbnailers/gst-video-thumbnailer/gst-thumb-pipe.c
===================================================================
--- projects/haf/trunk/hildon-thumbnail/thumbnailers/gst-video-thumbnailer/gst-thumb-pipe.c	2009-05-15 13:30:24 UTC (rev 18390)
+++ projects/haf/trunk/hildon-thumbnail/thumbnailers/gst-video-thumbnailer/gst-thumb-pipe.c	2009-05-15 13:48:07 UTC (rev 18391)
@@ -42,11 +42,15 @@
 							ThumberPipe      *pipe);
 
 static gboolean       _thumber_pipe_poll_for_state_change (ThumberPipe *pipe,
-							   GstState state);
+							   GstState     state,
+							   GError     **error);
 
 
 static gboolean       create_thumbnails                (const gchar *uri,
-							guchar      *buffer);
+							guchar      *buffer,
+							gboolean     standard,
+							gboolean     cropped,
+							GError     **error);
 
 static gboolean       thumber_pipe_initialize          (ThumberPipe *pipe,
 							const gchar *mime,
@@ -69,11 +73,16 @@
 
 	gchar          *uri;
 	gboolean        success;
+	GError         *error;
 
+	gboolean        standard;
+	gboolean        cropped;
 } ThumberPipePrivate;
 
 enum {
 	PROP_0,
+	PROP_STANDARD,
+	PROP_CROPPED
 };
 
 #define THUMBER_PIPE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TYPE_THUMBER_PIPE, ThumberPipePrivate))
@@ -97,13 +106,54 @@
 	return g_object_new (TYPE_THUMBER_PIPE, NULL);
 }
 
+thumber_pipe_get_standard (ThumberPipe *pipe)
+{
+	ThumberPipePrivate *priv;
+
+	priv = THUMBER_PIPE_GET_PRIVATE (pipe);
+	return priv->standard;
+}
+
 static void
+thumber_pipe_set_standard (ThumberPipe *pipe, gboolean standard)
+{
+	ThumberPipePrivate *priv;
+
+	priv = THUMBER_PIPE_GET_PRIVATE (pipe);
+	priv->standard = standard;
+}
+
+static gboolean
+thumber_pipe_get_cropped (ThumberPipe *pipe)
+{
+	ThumberPipePrivate *priv;
+
+	priv = THUMBER_PIPE_GET_PRIVATE (pipe);
+	return priv->cropped;
+}
+
+static void
+thumber_pipe_set_cropped (ThumberPipe *pipe, gboolean cropped)
+{
+	ThumberPipePrivate *priv;
+
+	priv = THUMBER_PIPE_GET_PRIVATE (pipe);
+	priv->cropped = cropped;
+}
+
+static void
 thumber_pipe_set_property (GObject      *object,
 			   guint         prop_id,
 			   const GValue *value,
 			   GParamSpec   *pspec)
 {
 	switch (prop_id) {
+	case PROP_STANDARD:
+		thumber_pipe_set_standard (THUMBER_PIPE (object), g_value_get_boolean (value));
+		break;
+	case PROP_CROPPED:
+		thumber_pipe_set_cropped (THUMBER_PIPE (object), g_value_get_boolean (value));
+		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 	}
@@ -112,15 +162,23 @@
 
 static void
 thumber_pipe_get_property (GObject    *object,
-		      guint       prop_id,
-		      GValue     *value,
-		      GParamSpec *pspec)
+			   guint       prop_id,
+			   GValue     *value,
+			   GParamSpec *pspec)
 {
 	ThumberPipePrivate *priv;
-
+	
 	priv = THUMBER_PIPE_GET_PRIVATE (object);
 
 	switch (prop_id) {
+	case PROP_STANDARD:
+		g_value_set_boolean (value,
+				     thumber_pipe_get_standard (THUMBER_PIPE (object)));
+		break;
+	case PROP_CROPPED:
+		g_value_set_boolean (value,
+				     thumber_pipe_get_cropped (THUMBER_PIPE (object)));
+		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 	}
@@ -143,6 +201,22 @@
 	object_class->set_property = thumber_pipe_set_property;
 	object_class->get_property = thumber_pipe_get_property;
 
+	g_object_class_install_property (object_class,
+					 PROP_STANDARD,
+					 g_param_spec_boolean ("standard",
+							       "Standard",
+							       "Whether we create the standard normal/large thumbnails",
+							       FALSE,
+							       G_PARAM_READWRITE));
+	
+	g_object_class_install_property (object_class,
+					 PROP_CROPPED,
+					 g_param_spec_boolean ("cropped",
+							       "Cropped",
+							       "Whether we create the cropped thumbnail",
+							       FALSE,
+							       G_PARAM_READWRITE));
+	
 	g_type_class_add_private (object_class, sizeof (ThumberPipePrivate));
 }
 
@@ -172,19 +246,19 @@
 				      "dummy",
 				      256,
 				      &lerror)) {
-		g_set_error (error,
-			     thumber_pipe_error_quark (),
-			     INITIALIZATION_ERROR,
-			     "Failed to initialize pipeline: %s",
-			     lerror->message);
-		g_error_free (lerror);
+		g_propagate_error (error, lerror);
 		g_free (priv->uri);
 		return FALSE;
 	}
 
 	gst_element_set_state (priv->pipeline, GST_STATE_READY);
-	_thumber_pipe_poll_for_state_change (pipe, GST_STATE_READY);
 
+	if (!_thumber_pipe_poll_for_state_change (pipe, GST_STATE_READY, &lerror)) {
+		g_propagate_error (error, lerror);
+		g_free (priv->uri);
+		return FALSE;
+	}
+
 	filename = g_filename_from_uri (uri, NULL, NULL);
 
 	g_object_set (priv->source, "location",
@@ -198,10 +272,27 @@
 			  GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
 
 	gst_element_set_state (priv->pipeline, GST_STATE_PAUSED);
-	_thumber_pipe_poll_for_state_change (pipe, GST_STATE_PAUSED);
+	if (!_thumber_pipe_poll_for_state_change (pipe, GST_STATE_PAUSED, &lerror)) {
+		g_propagate_error (error, lerror);
+		g_free (priv->uri);
+		return FALSE;
+	}
 
 	success = priv->success;
 
+	if (!success) {
+		if (priv->error != NULL) {
+			g_propagate_error (error, priv->error);
+		} else {
+			g_set_error (error,
+				     thumber_pipe_error_quark (),
+				     THUMBNAIL_ERROR,
+				     "Thumbnail creation failed.");
+		}
+		g_free (priv->uri);
+		return FALSE;
+	}
+
 	thumber_pipe_deinitialize (pipe);
 
 	g_free (priv->uri);
@@ -410,7 +501,11 @@
 
 	priv = THUMBER_PIPE_GET_PRIVATE (pipe);
 
-	if (!create_thumbnails (priv->uri, GST_BUFFER_DATA (buffer))) {
+	if (!create_thumbnails (priv->uri,
+				GST_BUFFER_DATA (buffer),
+				priv->standard,
+				priv->cropped,
+				&(priv->error))) {
 		priv->success = FALSE;
 	} else {
 		priv->success = TRUE;
@@ -421,17 +516,14 @@
 
 static gboolean
 _thumber_pipe_poll_for_state_change (ThumberPipe *pipe,
-				     GstState state)
+				     GstState     state,
+				     GError     **error)
 {
 	ThumberPipePrivate *priv;
 	GstBus             *bus;
 	gchar              *error_message;
-	GstMessageType      events;
 	gint64              timeout = 5 * GST_SECOND;
-	GError             *error = NULL;
 	
-	events = GST_MESSAGE_STATE_CHANGED | GST_MESSAGE_ERROR | GST_MESSAGE_EOS;
-
 	priv = THUMBER_PIPE_GET_PRIVATE (pipe);
 	
 	bus = gst_element_get_bus (priv->pipeline);
@@ -440,10 +532,14 @@
 		GstMessage *message;
 		GstElement *src;
 		
-		message = gst_bus_poll (bus, events, timeout);
+		message = gst_bus_timed_pop (bus, timeout);
 		
 		if (!message) {
-			goto timed_out;
+			g_set_error (error,
+				     thumber_pipe_error_quark (),
+				     RUNNING_ERROR,
+				     "Pipeline timed out");
+			return FALSE;
 		}
 		
 		src = (GstElement*)GST_MESSAGE_SRC (message);
@@ -456,28 +552,41 @@
 				gst_message_parse_state_changed (message, &old, &new, &pending);
 				if (new == state) {
 					gst_message_unref (message);
-					goto success;
+					return TRUE;
 				}
 			}
 			break;
 		}
 		case GST_MESSAGE_ERROR: {
+			GError *lerror = NULL;
+			gst_message_parse_error (message, &lerror, &error_message);
+			gst_message_unref (message);
+			g_free (error_message);
 
-			gst_message_parse_error (message, &error, &error_message);
-			gst_message_unref (message);
-			g_error_free (error);
-			goto error;
+			if (lerror != NULL) {
+				g_propagate_error (error, lerror);
+			} else {
+				g_set_error (error,
+					     thumber_pipe_error_quark (),
+					     RUNNING_ERROR,
+					     "Undefined error running the pipeline");
+			}
+
+			return FALSE;
 			break;
 		}
 		case GST_MESSAGE_EOS: {
-			GError *e = NULL;
-			error_message = g_strdup ("EOF");
 			gst_message_unref (message);
-			goto error;
+
+			g_set_error (error,
+				     thumber_pipe_error_quark (),
+				     RUNNING_ERROR,
+				     "Reached end-of-file without proper content");
+			return FALSE;
 			break;
 		}
 		default:
-			g_assert_not_reached ();
+			/* Nothing to do here */
 			break;
 		}
 		
@@ -486,18 +595,7 @@
 	
 	g_assert_not_reached ();
 	
- success:
-	/* state change succeeded */
-	return TRUE;
-	
- timed_out:
-	g_warning ("Thumbnailing pipeline timed out");
 	return FALSE;
-	
- error:
-	g_warning ("An error in thumbnailing pipeline: %s", error_message); 
-	g_free (error_message);
-	return FALSE;
 }
 
 
@@ -590,15 +688,15 @@
 }
 
 static gboolean
-create_thumbnails (const gchar *uri, guchar *buffer)
+create_thumbnails (const gchar *uri, guchar *buffer, gboolean standard, gboolean cropped, GError **error)
 {
 	GdkPixbuf *pixbuf;
 	GdkPixbuf *pic;
 	gchar *png_name;
 	gchar *jpg_name;
 	gchar *filename;
-	GError *error = NULL;
 	gchar *checksum;
+	GError *lerror = NULL;
 
 	pixbuf = gdk_pixbuf_new_from_data ((gchar *)buffer,
 					   GDK_COLORSPACE_RGB,
@@ -607,7 +705,10 @@
 					   NULL, NULL);
 
 	if(!pixbuf) {
-		/* FIXME Proper handling */
+		g_set_error (error,
+			     thumber_pipe_error_quark (),
+			     THUMBNAIL_ERROR,
+			     "Failed to create thumbnail from buffer");
 		return FALSE;
 	}
 
@@ -617,46 +718,70 @@
 
 	g_free (checksum);
 
-	filename = g_build_filename (g_get_home_dir (), ".thumbnails", "large", png_name, NULL);
-	if (!gdk_pixbuf_save (pixbuf,
-			      filename,
-			      "jpeg",
-			      &error,
-			      NULL)) {
-		/* FIXME Proper handling */
-	}	
-	g_free (filename);
+	if (standard) {
+		filename = g_build_filename (g_get_home_dir (), ".thumbnails", "large", png_name, NULL);
+		if (!gdk_pixbuf_save (pixbuf,
+				      filename,
+				      "jpeg",
+				      &lerror,
+				      NULL)) {
+			g_propagate_error (error, lerror);
+			g_object_unref (pixbuf);
+			
+			g_free (png_name);
+			g_free (jpg_name);
+			return FALSE;
+		}	
+		g_free (filename);
 
-	pic = gdk_pixbuf_scale_simple (pixbuf,
-				       128,
-				       128,
-				       GDK_INTERP_BILINEAR);
-	
-	filename = g_build_filename (g_get_home_dir (), ".thumbnails", "normal", png_name, NULL);
-	if (!gdk_pixbuf_save (pic,
-			      filename,
-			      "jpeg",
-			      &error,
-			      NULL)) {
-		/* FIXME Proper handling */
-		return FALSE;
+		pic = gdk_pixbuf_scale_simple (pixbuf,
+					       128,
+					       128,
+					       GDK_INTERP_BILINEAR);
+		
+		filename = g_build_filename (g_get_home_dir (), ".thumbnails", "normal", png_name, NULL);
+		if (!gdk_pixbuf_save (pic,
+				      filename,
+				      "jpeg",
+				      &lerror,
+				      NULL)) {
+			g_propagate_error (error, lerror);
+			g_object_unref (pixbuf);
+			
+			g_free (png_name);
+			g_free (jpg_name);
+
+			g_object_unref (pic);
+
+			return FALSE;
+		}
+		g_object_unref (pic);
 	}
-	g_object_unref (pic);
 
-	pic = crop_resize (pixbuf, 124, 124);
-	
-	filename = g_build_filename (g_get_home_dir (), ".thumbnails", "cropped", jpg_name, NULL);
-	if (!gdk_pixbuf_save (pic,
-			      filename,
-			      "jpeg",
-			      &error,
-			      NULL)) {
-		/* FIXME Proper handling */
-		return FALSE;
+	if (cropped) {
+		pic = crop_resize (pixbuf, 124, 124);
+		
+		filename = g_build_filename (g_get_home_dir (), ".thumbnails", "cropped", jpg_name, NULL);
+		if (!gdk_pixbuf_save (pic,
+				      filename,
+				      "jpeg",
+				      &lerror,
+				      NULL)) {
+			g_propagate_error (error, lerror);
+			g_object_unref (pixbuf);
+			
+			g_free (png_name);
+			g_free (jpg_name);
+
+			g_object_unref (pic);
+
+			return FALSE;
+		}
+		g_object_unref (pic);
+		
+		g_free (filename);
 	}
-	g_object_unref (pic);
 
-	g_free (filename);
 	g_object_unref (pixbuf);
 	
 	g_free (png_name);

Modified: projects/haf/trunk/hildon-thumbnail/thumbnailers/gst-video-thumbnailer/gst-thumb-thumber.c
===================================================================
--- projects/haf/trunk/hildon-thumbnail/thumbnailers/gst-video-thumbnailer/gst-thumb-thumber.c	2009-05-15 13:30:24 UTC (rev 18390)
+++ projects/haf/trunk/hildon-thumbnail/thumbnailers/gst-video-thumbnailer/gst-thumb-thumber.c	2009-05-15 13:48:07 UTC (rev 18391)
@@ -75,7 +75,8 @@
 
 typedef struct {
 	/* Properties */
-	gboolean         cropping;
+	gboolean         standard;
+	gboolean         cropped;
 
 	guint            idle_id;
 	guint            quit_timeout_id;
@@ -187,7 +188,8 @@
 
 enum {
 	PROP_0,
-	PROP_CROPPING,
+	PROP_STANDARD,
+	PROP_CROPPED,
 	PROP_TIMEOUT
 };
 
@@ -200,23 +202,41 @@
 }
 
 static gboolean
-thumber_get_cropping (Thumber *thumber)
+thumber_get_standard (Thumber *thumber)
 {
 	ThumberPrivate *priv;
 
 	priv = THUMBER_GET_PRIVATE (thumber);
-	return priv->cropping;
+	return priv->standard;
 }
 
 static void
-thumber_set_cropping (Thumber *thumber, gboolean cropping)
+thumber_set_standard (Thumber *thumber, gboolean standard)
 {
 	ThumberPrivate *priv;
 
 	priv = THUMBER_GET_PRIVATE (thumber);
-	priv->cropping = cropping;
+	priv->standard = standard;
 }
 
+static gboolean
+thumber_get_cropped (Thumber *thumber)
+{
+	ThumberPrivate *priv;
+
+	priv = THUMBER_GET_PRIVATE (thumber);
+	return priv->cropped;
+}
+
+static void
+thumber_set_cropped (Thumber *thumber, gboolean cropped)
+{
+	ThumberPrivate *priv;
+
+	priv = THUMBER_GET_PRIVATE (thumber);
+	priv->cropped = cropped;
+}
+
 static gint
 thumber_get_timeout (Thumber *thumber)
 {
@@ -242,9 +262,12 @@
 		      GParamSpec   *pspec)
 {
 	switch (prop_id) {
-	case PROP_CROPPING:
-		thumber_set_cropping (THUMBER (object), g_value_get_boolean (value));
+	case PROP_STANDARD:
+		thumber_set_standard (THUMBER (object), g_value_get_boolean (value));
 		break;
+	case PROP_CROPPED:
+		thumber_set_cropped (THUMBER (object), g_value_get_boolean (value));
+		break;
 	case PROP_TIMEOUT:
 		thumber_set_timeout (THUMBER (object), g_value_get_int (value));
 		break;		
@@ -265,10 +288,14 @@
 	priv = THUMBER_GET_PRIVATE (object);
 
 	switch (prop_id) {
-	case PROP_CROPPING:
+	case PROP_STANDARD:
 		g_value_set_boolean (value,
-				     thumber_get_cropping (THUMBER (object)));
+				     thumber_get_standard (THUMBER (object)));
 		break;
+	case PROP_CROPPED:
+		g_value_set_boolean (value,
+				     thumber_get_cropped (THUMBER (object)));
+		break;
 	case PROP_TIMEOUT:
 		g_value_set_int (value,
 				 thumber_get_timeout (THUMBER (object)));
@@ -317,8 +344,16 @@
 	object_class->set_property = thumber_set_property;
 	object_class->get_property = thumber_get_property;
 
+      g_object_class_install_property (object_class,
+					PROP_STANDARD,
+					g_param_spec_boolean ("standard",
+							      "Standard",
+							      "Whether we create the standard normal/large thumbnails",
+							      FALSE,
+							      G_PARAM_READWRITE));
+
        g_object_class_install_property (object_class,
-					PROP_CROPPING,
+					PROP_CROPPED,
 					g_param_spec_boolean ("cropped",
 							      "Cropped",
 							      "Whether we create the cropped thumbnail",
@@ -807,14 +842,26 @@
 		}
 
 		if ((task = g_queue_pop_head (priv->task_queue)) != NULL) {
+			GValue val = {0, };
 
+
 			if (priv->pipe) {
 				g_object_unref (priv->pipe);
 				priv->pipe = NULL;
 			}
 			
-			priv->pipe = thumber_pipe_new ();		       
+			priv->pipe = thumber_pipe_new ();		       			
+
+			g_value_init (&val, G_TYPE_BOOLEAN);
+			g_value_set_boolean (&val, priv->standard);
+			g_object_set_property (G_OBJECT(priv->pipe), "standard", &val);
+			g_value_unset (&val);
 			
+			g_value_init (&val, G_TYPE_BOOLEAN);
+			g_value_set_boolean (&val, priv->cropped);
+			g_object_set_property (G_OBJECT(priv->pipe), "cropped", &val);
+			g_value_unset (&val);
+
 			thumber_populate_file_queue (thumber, task);
 			
 			priv->current_task = task;


More information about the maemo-commits mailing list