[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.orgDate: Fri May 15 16:48:09 EEST 2009
- Previous message: [maemo-commits] r18390 - projects/haf/trunk/gvfs-1.0.3/debian
- Next message: [maemo-commits] r18392 - projects/haf/trunk/hildon-welcome/debian
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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;
- Previous message: [maemo-commits] r18390 - projects/haf/trunk/gvfs-1.0.3/debian
- Next message: [maemo-commits] r18392 - projects/haf/trunk/hildon-welcome/debian
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]