summaryrefslogtreecommitdiff
path: root/gst-libs/gst/basecamerabinsrc
diff options
context:
space:
mode:
authorThiago Santos <thiago.sousa.santos@collabora.co.uk>2011-02-04 14:53:49 -0300
committerThiago Santos <thiago.sousa.santos@collabora.co.uk>2011-03-10 08:42:00 -0300
commitb3abf91232994f8edaa7f1e706439c1063a01950 (patch)
tree3ecfb74ea92d6b631c98d08bac03d9012996df8c /gst-libs/gst/basecamerabinsrc
parentb5fdacc5c0e0110fbbb726d0f3ebd68a1c3eeb05 (diff)
downloadgstreamer-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.c114
-rw-r--r--gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h9
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__ */