diff options
author | Thiago Santos <thiago.sousa.santos@collabora.co.uk> | 2011-02-04 14:53:49 -0300 |
---|---|---|
committer | Thiago Santos <thiago.sousa.santos@collabora.co.uk> | 2011-03-10 08:42:00 -0300 |
commit | b3abf91232994f8edaa7f1e706439c1063a01950 (patch) | |
tree | 3ecfb74ea92d6b631c98d08bac03d9012996df8c /gst-libs/gst/basecamerabinsrc | |
parent | b5fdacc5c0e0110fbbb726d0f3ebd68a1c3eeb05 (diff) | |
download | gstreamer-plugins-bad-b3abf91232994f8edaa7f1e706439c1063a01950.tar.gz |
camerabin2: Moving preview image properties to basecamerasrc
Moves preview image related properties to basecamerasrc as that
should be present on all camerasrcs
Diffstat (limited to 'gst-libs/gst/basecamerabinsrc')
-rw-r--r-- | gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c | 114 | ||||
-rw-r--r-- | gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h | 9 |
2 files changed, 122 insertions, 1 deletions
diff --git a/gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c b/gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c index 892a01382..a26533fc8 100644 --- a/gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c +++ b/gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c @@ -61,7 +61,10 @@ enum PROP_0, PROP_MODE, PROP_ZOOM, - PROP_READY_FOR_CAPTURE + PROP_READY_FOR_CAPTURE, + PROP_POST_PREVIEW, + PROP_PREVIEW_CAPS, + PROP_PREVIEW_FILTER }; enum @@ -73,6 +76,8 @@ enum LAST_SIGNAL }; +#define DEFAULT_POST_PREVIEW TRUE + static guint basecamerasrc_signals[LAST_SIGNAL]; GST_DEBUG_CATEGORY (base_camera_src_debug); @@ -276,6 +281,19 @@ gst_base_camera_src_dispose (GObject * object) g_mutex_free (src->capturing_mutex); + if (src->preview_pipeline) { + gst_camerabin_destroy_preview_pipeline (src->preview_pipeline); + src->preview_pipeline = NULL; + } + + if (src->preview_caps) + gst_caps_replace (&src->preview_caps, NULL); + + if (src->preview_filter) { + gst_object_unref (src->preview_filter); + src->preview_filter = NULL; + } + G_OBJECT_CLASS (parent_class)->dispose (object); } @@ -303,6 +321,26 @@ gst_base_camera_src_set_property (GObject * object, gst_base_camera_src_setup_zoom (self); break; } + case PROP_POST_PREVIEW: + self->post_preview = g_value_get_boolean (value); + break; + case PROP_PREVIEW_CAPS: + gst_caps_replace (&self->preview_caps, + (GstCaps *) gst_value_get_caps (value)); + if (self->preview_pipeline) { + GST_DEBUG_OBJECT (self, + "Setting preview pipeline caps %" GST_PTR_FORMAT, + self->preview_caps); + gst_camerabin_preview_set_caps (self->preview_pipeline, + (GstCaps *) gst_value_get_caps (value)); + } + break; + case PROP_PREVIEW_FILTER: + if (self->preview_filter) + gst_object_unref (self->preview_filter); + self->preview_filter = g_value_dup_object (value); + self->preview_filter_changed = TRUE; + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec); break; @@ -325,6 +363,17 @@ gst_base_camera_src_get_property (GObject * object, case PROP_ZOOM: g_value_set_int (value, g_atomic_int_get (&self->zoom)); break; + case PROP_POST_PREVIEW: + g_value_set_boolean (value, self->post_preview); + break; + case PROP_PREVIEW_CAPS: + if (self->preview_caps) + gst_value_set_caps (value, self->preview_caps); + break; + case PROP_PREVIEW_FILTER: + if (self->preview_filter) + g_value_set_object (value, self->preview_filter); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec); break; @@ -370,10 +419,32 @@ gst_base_camera_src_change_state (GstElement * element, case GST_STATE_CHANGE_NULL_TO_READY: if (!construct_pipeline (self)) return GST_STATE_CHANGE_FAILURE; + + /* recreate the preview pipeline */ + if (self->preview_pipeline && self->preview_filter_changed) { + gst_camerabin_destroy_preview_pipeline (self->preview_pipeline); + } + + if (self->preview_pipeline == NULL) + self->preview_pipeline = + gst_camerabin_create_preview_pipeline (GST_ELEMENT_CAST (self), + self->preview_filter); + + g_assert (self->preview_pipeline != NULL); + self->preview_filter_changed = FALSE; + if (self->preview_caps) { + GST_DEBUG_OBJECT (self, + "Setting preview pipeline caps %" GST_PTR_FORMAT, + self->preview_caps); + gst_camerabin_preview_set_caps (self->preview_pipeline, + self->preview_caps); + } break; case GST_STATE_CHANGE_READY_TO_PAUSED: if (!setup_pipeline (self)) return GST_STATE_CHANGE_FAILURE; + gst_element_set_state (self->preview_pipeline->pipeline, + GST_STATE_PLAYING); break; default: break; @@ -381,6 +452,14 @@ gst_base_camera_src_change_state (GstElement * element, ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + gst_element_set_state (self->preview_pipeline->pipeline, GST_STATE_NULL); + break; + default: + break; + } + return ret; } @@ -427,6 +506,27 @@ gst_base_camera_src_class_init (GstBaseCameraSrcClass * klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** + * GstBaseCameraSrc:post-previews: + * + * When %TRUE, preview images should be posted to the bus when + * captures are made + */ + g_object_class_install_property (gobject_class, PROP_POST_PREVIEW, + g_param_spec_boolean ("post-previews", "Post Previews", + "If capture preview images should be posted to the bus", + DEFAULT_POST_PREVIEW, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_PREVIEW_CAPS, + g_param_spec_boxed ("preview-caps", "Preview caps", + "The caps of the preview image to be posted", + GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_PREVIEW_FILTER, + g_param_spec_object ("preview-filter", "Preview filter", + "A custom preview filter to process preview image data", + GST_TYPE_ELEMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** * GstBaseCameraSrc:ready-for-capture: * * When TRUE new capture can be prepared. If FALSE capturing is ongoing @@ -479,4 +579,16 @@ gst_base_camera_src_init (GstBaseCameraSrc * self, self->capturing = FALSE; self->capturing_mutex = g_mutex_new (); + + self->post_preview = DEFAULT_POST_PREVIEW; +} + +void +gst_base_camera_src_post_preview (GstBaseCameraSrc * self, GstBuffer * buf) +{ + if (self->post_preview) { + gst_camerabin_preview_pipeline_post (self->preview_pipeline, buf); + } else { + GST_DEBUG_OBJECT (self, "Previews not enabled, not posting"); + } } diff --git a/gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h b/gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h index 70535bccf..4ff5e8842 100644 --- a/gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h +++ b/gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h @@ -27,6 +27,7 @@ #include <gst/interfaces/photography.h> #include <gst/interfaces/colorbalance.h> #include "gstcamerabin-enum.h" +#include "gstcamerabinpreview.h" G_BEGIN_DECLS #define GST_TYPE_BASE_CAMERA_SRC \ @@ -66,6 +67,13 @@ struct _GstBaseCameraSrc gboolean capturing; GMutex *capturing_mutex; + /* Preview convert pipeline */ + GstCaps *preview_caps; + gboolean post_preview; + GstElement *preview_filter; + GstCameraBinPreviewPipelineData *preview_pipeline; + gboolean preview_filter_changed; + /* Resolution of the buffers configured to camerabin */ gint width; gint height; @@ -126,6 +134,7 @@ GstCaps * gst_base_camera_src_get_allowed_input_caps (GstBaseCameraSrc * self); void gst_base_camera_src_finish_capture (GstBaseCameraSrc *self); +void gst_base_camera_src_post_preview (GstBaseCameraSrc *self, GstBuffer * buf); // XXX add methods to get/set img capture and vid capture caps.. #endif /* __GST_BASE_CAMERA_SRC_H__ */ |