From 65ddcd6d5d5413bcf0d54af627de5939a5dd9e8f Mon Sep 17 00:00:00 2001 From: Lasse Laukkanen Date: Fri, 27 Feb 2009 17:12:38 +0200 Subject: camerabin: change img-done signal parameter from GString* to const gchar* Don't allow setting filename via img-done signal parameter but force app use filename property. Don't stop capture when setting filename property. Update check unit test based on the change. --- gst/camerabin/gstcamerabin-marshal.list | 2 +- gst/camerabin/gstcamerabin.c | 67 +++++++++++++++++++-------------- gst/camerabin/gstcamerabin.h | 5 +-- tests/check/elements/camerabin.c | 10 ++--- 4 files changed, 44 insertions(+), 40 deletions(-) diff --git a/gst/camerabin/gstcamerabin-marshal.list b/gst/camerabin/gstcamerabin-marshal.list index 4c1670eff..40829e545 100644 --- a/gst/camerabin/gstcamerabin-marshal.list +++ b/gst/camerabin/gstcamerabin-marshal.list @@ -3,4 +3,4 @@ VOID:INT,INT,INT,INT VOID:INT,INT -BOOLEAN:POINTER +BOOLEAN:STRING diff --git a/gst/camerabin/gstcamerabin.c b/gst/camerabin/gstcamerabin.c index bdc4f28b6..ddd08e3b6 100644 --- a/gst/camerabin/gstcamerabin.c +++ b/gst/camerabin/gstcamerabin.c @@ -868,22 +868,37 @@ camerabin_dispose_elements (GstCameraBin * camera) /* * gst_camerabin_image_capture_continue: * @camera: camerabin object - * @filename: new filename set by user - * @cont: TRUE to continue image capture, FALSE otherwise * - * Check if user wants to continue image capturing by using g_signal. + * Check if application wants to continue image capturing by using g_signal. + * + * Returns TRUE if another image should be captured, FALSE otherwise. */ -static void -gst_camerabin_image_capture_continue (GstCameraBin * camera, GString * filename, - gboolean * cont) +static gboolean +gst_camerabin_image_capture_continue (GstCameraBin * camera) { - GST_DEBUG_OBJECT (camera, "emitting img_done signal, filename: %s", - filename->str); + gchar *filename = NULL; + gboolean cont = FALSE; + + /* Check the filename of the written image */ + g_object_get (G_OBJECT (camera->imgbin), "filename", &filename, NULL); + + GST_DEBUG_OBJECT (camera, "emitting img_done signal, filename: %s", filename); g_signal_emit (G_OBJECT (camera), camerabin_signals[IMG_DONE_SIGNAL], 0, - filename, cont); + filename, &cont); + + g_free (filename); GST_DEBUG_OBJECT (camera, "emitted img_done, new filename: %s, continue: %d", - filename->str, *cont); + camera->filename->str, cont); + + /* If the app wants to continue make sure new filename has been set */ + if (cont && g_str_equal (camera->filename->str, "")) { + GST_ELEMENT_ERROR (camera, RESOURCE, NOT_FOUND, + ("cannot continue capture, no filename has been set"), (NULL)); + cont = FALSE; + } + + return cont; } /* @@ -920,7 +935,6 @@ gst_camerabin_change_mode (GstCameraBin * camera, gint mode) * @name: new filename for capture * * Change filename for image or video capture. - * Changing filename will stop ongoing capture. */ static void gst_camerabin_change_filename (GstCameraBin * camera, const gchar * name) @@ -928,14 +942,6 @@ gst_camerabin_change_filename (GstCameraBin * camera, const gchar * name) if (0 != strcmp (camera->filename->str, name)) { GST_DEBUG_OBJECT (camera, "changing filename from %s to %s", camera->filename->str, name); - /* Interrupt ongoing capture */ - gst_camerabin_do_stop (camera); - gst_camerabin_reset_to_view_finder (camera); - - if (camera->active_bin) { - g_object_set (G_OBJECT (camera->active_bin), "filename", name, NULL); - } - g_string_assign (camera->filename, name); } } @@ -1557,8 +1563,11 @@ gst_camerabin_have_img_buffer (GstPad * pad, GstBuffer * buffer, /* Close the file of saved image */ gst_element_set_state (camera->imgbin, GST_STATE_READY); + /* Reset filename to force application set new filename */ + g_string_assign (camera->filename, ""); + /* Check if the application wants to continue */ - gst_camerabin_image_capture_continue (camera, camera->filename, &ret); + ret = gst_camerabin_image_capture_continue (camera); if (ret && !camera->stop_requested) { GST_DEBUG_OBJECT (camera, "capturing image \"%s\"", camera->filename->str); @@ -1568,8 +1577,6 @@ gst_camerabin_have_img_buffer (GstPad * pad, GstBuffer * buffer, } else { GST_DEBUG_OBJECT (camera, "not continuing (cont:%d, stop_req:%d)", ret, camera->stop_requested); - /* Reset filename to force application set new filename */ - g_string_assign (camera->filename, ""); /* Block dataflow to the output-selector to show preview image in view finder. Continue and unblock when capture is stopped */ @@ -1715,7 +1722,7 @@ gst_camerabin_do_stop (GstCameraBin * camera) /* * gst_camerabin_default_signal_img_done: * @camera: camerabin object - * @fname: new filename + * @fname: filename of the recently saved image * * Default handler for #GstCameraBin::img-done signal, * stops always capture. @@ -1723,7 +1730,8 @@ gst_camerabin_do_stop (GstCameraBin * camera) * Returns: FALSE always */ static gboolean -gst_camerabin_default_signal_img_done (GstCameraBin * camera, GString * fname) +gst_camerabin_default_signal_img_done (GstCameraBin * camera, + const gchar * fname) { return FALSE; } @@ -2290,10 +2298,11 @@ gst_camerabin_class_init (GstCameraBinClass * klass) /** * GstCameraBin::img-done: * @camera: the camera bin element - * @filename: the name of the file just saved as a GString* + * @filename: the name of the file just saved * - * Signal emited when the file has just been saved. To continue taking - * pictures just update @filename and return TRUE, otherwise return FALSE. + * Signal emitted when the file has just been saved. To continue taking + * pictures set new filename using #GstCameraBin:filename property and return + * TRUE, otherwise return FALSE. * * Don't call any #GstCameraBin method from this signal, if you do so there * will be a deadlock. @@ -2303,8 +2312,8 @@ gst_camerabin_class_init (GstCameraBinClass * klass) g_signal_new ("img-done", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstCameraBinClass, img_done), g_signal_accumulator_true_handled, NULL, - __gst_camerabin_marshal_BOOLEAN__POINTER, G_TYPE_BOOLEAN, 1, - G_TYPE_POINTER); + __gst_camerabin_marshal_BOOLEAN__STRING, G_TYPE_BOOLEAN, 1, + G_TYPE_STRING); klass->user_start = gst_camerabin_user_start; klass->user_stop = gst_camerabin_user_stop; diff --git a/gst/camerabin/gstcamerabin.h b/gst/camerabin/gstcamerabin.h index f4eefe910..1bb3f489a 100644 --- a/gst/camerabin/gstcamerabin.h +++ b/gst/camerabin/gstcamerabin.h @@ -32,7 +32,6 @@ #include "camerabinvideo.h" G_BEGIN_DECLS - /* #defines don't like whitespacey bits */ #define GST_TYPE_CAMERABIN \ (gst_camerabin_get_type()) @@ -44,7 +43,6 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CAMERABIN)) #define GST_IS_CAMERABIN_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CAMERABIN)) - typedef struct _GstCameraBin GstCameraBin; typedef struct _GstCameraBinClass GstCameraBinClass; @@ -147,7 +145,7 @@ struct _GstCameraBinClass /* signals (callback) */ - gboolean (*img_done) (GstCameraBin * camera, GString * filename); + gboolean (*img_done) (GstCameraBin * camera, const gchar * filename); }; /** @@ -166,5 +164,4 @@ typedef enum GType gst_camerabin_get_type (void); G_END_DECLS - #endif /* #ifndef __GST_CAMERABIN_H__ */ diff --git a/tests/check/elements/camerabin.c b/tests/check/elements/camerabin.c index bd8e00ec5..7c6187d2e 100644 --- a/tests/check/elements/camerabin.c +++ b/tests/check/elements/camerabin.c @@ -76,7 +76,7 @@ make_test_seq_file_name (const gchar * base_name) /* signal handlers */ static gboolean -capture_done (GstElement * elem, GString * filename, gpointer user_data) +capture_done (GstElement * elem, const gchar * filename, gpointer user_data) { captured_images++; @@ -90,11 +90,9 @@ capture_done (GstElement * elem, GString * filename, gpointer user_data) } if (continuous) { - g_string_assign (filename, make_test_seq_file_name (BURST_IMAGE_FILENAME)); - /* on needs to modify the passed GString, the code below won't work - g_object_set (G_OBJECT (elem), "filename", - make_test_seq_file_name (BURST_IMAGE_FILENAME), NULL); - */ + /* Must set filename for new picture */ + g_object_set (G_OBJECT (elem), "filename", + make_test_seq_file_name (BURST_IMAGE_FILENAME), NULL); } return continuous; -- cgit v1.2.3