camerabin: Add image-formatter property
authorLasse Laukkanen <lasse.laukkanen@digia.com>
Fri, 20 May 2011 14:06:49 +0000 (17:06 +0300)
committerThiago Santos <thiago.sousa.santos@collabora.co.uk>
Mon, 23 May 2011 15:08:37 +0000 (12:08 -0300)
Add image-formatter property in order to let application configure
the formatter element for metadata.

gst/camerabin/camerabinimage.c
gst/camerabin/camerabinimage.h
gst/camerabin/gstcamerabin-enum.h
gst/camerabin/gstcamerabin.c
tests/check/elements/camerabin.c

index 6325205..542a227 100644 (file)
@@ -61,7 +61,7 @@
 
 #define DEFAULT_SINK "filesink"
 #define DEFAULT_ENC "jpegenc"
-#define DEFAULT_META_MUX "jifmux"
+#define DEFAULT_FORMATTER "jifmux"
 #define DEFAULT_FLAGS GST_CAMERABIN_FLAG_IMAGE_COLOR_CONVERSION
 
 enum
@@ -150,7 +150,8 @@ gst_camerabin_image_init (GstCameraBinImage * img,
   img->csp = NULL;
   img->enc = NULL;
   img->app_enc = NULL;
-  img->meta_mux = NULL;
+  img->formatter = NULL;
+  img->app_formatter = NULL;
   img->sink = NULL;
 
   /* Create src and sink ghost pads */
@@ -180,12 +181,21 @@ gst_camerabin_image_dispose (GstCameraBinImage * img)
     img->sink = NULL;
   }
 
-  if (img->meta_mux) {
+  if (img->formatter) {
     GST_LOG_OBJECT (img, "disposing %s with refcount %d",
-        GST_ELEMENT_NAME (img->meta_mux),
-        GST_OBJECT_REFCOUNT_VALUE (img->meta_mux));
-    gst_object_unref (img->meta_mux);
-    img->meta_mux = NULL;
+        GST_ELEMENT_NAME (img->formatter),
+        GST_OBJECT_REFCOUNT_VALUE (img->formatter));
+    gst_object_unref (img->formatter);
+    img->formatter = NULL;
+  }
+
+  if (img->app_formatter) {
+    gst_object_sink (img->app_formatter);
+    GST_LOG_OBJECT (img, "disposing %s with refcount %d",
+        GST_ELEMENT_NAME (img->app_formatter),
+        GST_OBJECT_REFCOUNT_VALUE (img->app_formatter));
+    gst_object_unref (img->app_formatter);
+    img->app_formatter = NULL;
   }
 
   if (img->enc) {
@@ -399,12 +409,12 @@ gst_camerabin_image_prepare_elements (GstCameraBinImage * imagebin)
   }
 
   /* Create metadata muxer element */
-  if (!prepare_element (&imagebin->elements, DEFAULT_META_MUX, NULL,
-          &imagebin->meta_mux)) {
+  if (!prepare_element (&imagebin->elements, DEFAULT_FORMATTER,
+          imagebin->app_formatter, &imagebin->formatter)) {
     goto done;
   } else if (!imagebin->metadata_probe_id) {
     /* Add probe for default XMP metadata writing */
-    sinkpad = gst_element_get_static_pad (imagebin->meta_mux, "sink");
+    sinkpad = gst_element_get_static_pad (imagebin->formatter, "sink");
     imagebin->metadata_probe_id =
         gst_pad_add_buffer_probe (sinkpad, G_CALLBACK (metadata_write_probe),
         imagebin);
@@ -468,7 +478,9 @@ metadata_write_probe (GstPad * pad, GstBuffer * buffer, gpointer u_data)
 
   g_return_val_if_fail (img != NULL, TRUE);
 
-  setter = GST_TAG_SETTER (img->meta_mux);
+  if (GST_IS_TAG_SETTER (img->formatter)) {
+    setter = GST_TAG_SETTER (img->formatter);
+  }
 
   if (!setter) {
     GST_WARNING_OBJECT (img, "setting tags failed");
@@ -717,6 +729,19 @@ gst_camerabin_image_set_postproc (GstCameraBinImage * img,
 }
 
 void
+gst_camerabin_image_set_formatter (GstCameraBinImage * img,
+    GstElement * formatter)
+{
+  GstElement **app_formatter;
+  GST_DEBUG ("setting image formatter %" GST_PTR_FORMAT, formatter);
+
+  app_formatter = &img->app_formatter;
+  GST_OBJECT_LOCK (img);
+  gst_object_replace ((GstObject **) app_formatter, GST_OBJECT (formatter));
+  GST_OBJECT_UNLOCK (img);
+}
+
+void
 gst_camerabin_image_set_flags (GstCameraBinImage * img, GstCameraBinFlags flags)
 {
   GST_DEBUG_OBJECT (img, "setting image flags: %d", flags);
@@ -738,6 +763,13 @@ gst_camerabin_image_get_encoder (GstCameraBinImage * img)
 }
 
 GstElement *
+gst_camerabin_image_get_formatter (GstCameraBinImage * img)
+{
+  /* Prefer formatter that is currently in use */
+  return img->formatter ? img->formatter : img->app_formatter;
+}
+
+GstElement *
 gst_camerabin_image_get_postproc (GstCameraBinImage * img)
 {
   return img->post;
index b116d09..754c4bb 100644 (file)
@@ -55,7 +55,8 @@ struct _GstCameraBinImage
   GstElement *csp;
   GstElement *enc;
   GstElement *app_enc;
-  GstElement *meta_mux;
+  GstElement *formatter;
+  GstElement *app_formatter;
   GstElement *sink;
 
   GstCameraBinFlags flags;
@@ -77,6 +78,9 @@ gst_camerabin_image_set_postproc (GstCameraBinImage * img,
     GstElement * postproc);
 
 void
+gst_camerabin_image_set_formatter (GstCameraBinImage * img, GstElement * formatter);
+
+void
 gst_camerabin_image_set_flags (GstCameraBinImage * img,
     GstCameraBinFlags flags);
 
@@ -84,6 +88,8 @@ GstElement *gst_camerabin_image_get_encoder (GstCameraBinImage * img);
 
 GstElement *gst_camerabin_image_get_postproc (GstCameraBinImage * img);
 
+GstElement *gst_camerabin_image_get_formatter (GstCameraBinImage * img);
+
 gboolean gst_camerabin_image_prepare_elements (GstCameraBinImage * imagebin);
 
 G_END_DECLS
index 69d7ba2..b848047 100644 (file)
@@ -35,6 +35,7 @@ enum
   ARG_ZOOM,
   ARG_IMAGE_POST,
   ARG_IMAGE_ENC,
+  ARG_IMAGE_FORMATTER,
   ARG_VIDEO_POST,
   ARG_VIDEO_ENC,
   ARG_AUDIO_ENC,
index 99b1b54..d0cdceb 100644 (file)
@@ -2851,6 +2851,19 @@ gst_camerabin_class_init (GstCameraBinClass * klass)
           GST_TYPE_ELEMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   /**
+   *  GstCameraBin:image-formatter:
+   *
+   * Set up an image formatter (for example, jifmux) element.
+   * This property can only be set while #GstCameraBin is in NULL state.
+   * The ownership of the element will be taken by #GstCameraBin.
+   */
+
+  g_object_class_install_property (gobject_class, ARG_IMAGE_FORMATTER,
+      g_param_spec_object ("image-formatter", "Image formatter",
+          "Image formatter GStreamer element (default is jifmux)",
+          GST_TYPE_ELEMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  /**
    *  GstCameraBin:video-post-processing:
    *
    * Set up an element to do video post processing.
@@ -3482,6 +3495,14 @@ gst_camerabin_set_property (GObject * object, guint prop_id,
       gst_camerabin_image_set_encoder (GST_CAMERABIN_IMAGE (camera->imgbin),
           g_value_get_object (value));
       break;
+    case ARG_IMAGE_FORMATTER:
+      if (GST_STATE (camera->imgbin) != GST_STATE_NULL) {
+        GST_WARNING_OBJECT (camera,
+            "can't use set element until next image bin NULL to READY state change");
+      }
+      gst_camerabin_image_set_formatter (GST_CAMERABIN_IMAGE (camera->imgbin),
+          g_value_get_object (value));
+      break;
     case ARG_VF_SINK:
       if (GST_STATE (camera) != GST_STATE_NULL) {
         GST_ELEMENT_ERROR (camera, CORE, FAILED,
@@ -3724,6 +3745,11 @@ gst_camerabin_get_property (GObject * object, guint prop_id,
           gst_camerabin_image_get_encoder (GST_CAMERABIN_IMAGE
               (camera->imgbin)));
       break;
+    case ARG_IMAGE_FORMATTER:
+      g_value_set_object (value,
+          gst_camerabin_image_get_formatter (GST_CAMERABIN_IMAGE
+              (camera->imgbin)));
+      break;
     case ARG_VIDEO_POST:
       g_value_set_object (value,
           gst_camerabin_video_get_post (GST_CAMERABIN_VIDEO (camera->vidbin)));
index 124cb7c..53a82e9 100644 (file)
@@ -157,7 +157,7 @@ static void
 setup_camerabin_elements (GstElement * camera)
 {
   GstElement *vfsink, *audiosrc, *videosrc, *audioenc, *videoenc, *imageenc,
-      *videomux, *viewfinder_filter, *imagepp, *videopp;
+      *videomux, *viewfinder_filter, *imagepp, *videopp, *formatter;
   GstCaps *audiocaps, *videocaps;
 
   /* Use fakesink for view finder */
@@ -181,6 +181,7 @@ setup_camerabin_elements (GstElement * camera)
   viewfinder_filter = gst_element_factory_make ("identity", NULL);
   imagepp = gst_element_factory_make ("identity", NULL);
   videopp = gst_element_factory_make ("identity", NULL);
+  formatter = gst_element_factory_make ("jifmux", NULL);
 
   if (set_and_check_camerabin_element (camera, "viewfinder-sink", vfsink)
       && set_and_check_camerabin_element (camera, "audio-source", audiosrc)
@@ -194,7 +195,8 @@ setup_camerabin_elements (GstElement * camera)
       && set_and_check_camerabin_element (camera, "image-post-processing",
           imagepp)
       && set_and_check_camerabin_element (camera, "video-post-processing",
-          videopp)) {
+          videopp)
+      && set_and_check_camerabin_element (camera, "image-formatter", formatter)) {
     GST_INFO ("element properties set and checked");
   } else {
     GST_WARNING ("error setting up test plugins");