aboutsummaryrefslogtreecommitdiff
path: root/gst/camerabin/camerabinimage.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/camerabin/camerabinimage.c')
-rw-r--r--gst/camerabin/camerabinimage.c777
1 files changed, 0 insertions, 777 deletions
diff --git a/gst/camerabin/camerabinimage.c b/gst/camerabin/camerabinimage.c
deleted file mode 100644
index ab82b407..00000000
--- a/gst/camerabin/camerabinimage.c
+++ /dev/null
@@ -1,777 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2008 Nokia Corporation <multimedia@maemo.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/**
- * SECTION:camerabinimage
- * @short_description: image capturing module of #GstCameraBin
- *
- * <refsect2>
- * <para>
- *
- * The pipeline for this module is:
- *
- * <informalexample>
- * <programlisting>
- *-----------------------------------------------------------------------------
- *
- * -> [post proc] -> csp -> imageenc -> metadatamuxer -> filesink
- *
- *-----------------------------------------------------------------------------
- * </programlisting>
- * </informalexample>
- *
- * The image bin opens file for image writing in READY to PAUSED state change.
- * The image bin closes the file in PAUSED to READY state change.
- *
- * </para>
- * </refsect2>
- */
-
-/*
- * includes
- */
-
-#include <gst/gst.h>
-
-#include "camerabinimage.h"
-#include "camerabindebug.h"
-#include "camerabingeneral.h"
-#include "gstcamerabin-enum.h"
-
-#include "string.h"
-
-/* default internal element names */
-
-#define DEFAULT_SINK "filesink"
-#define DEFAULT_ENC "jpegenc"
-#define DEFAULT_FORMATTER "jifmux"
-#define DEFAULT_FLAGS GST_CAMERABIN_FLAG_IMAGE_COLOR_CONVERSION
-
-enum
-{
- PROP_0,
- PROP_FILENAME
-};
-
-static gboolean gst_camerabin_image_create_elements (GstCameraBinImage * img);
-static void gst_camerabin_image_destroy_elements (GstCameraBinImage * img);
-
-static void gst_camerabin_image_dispose (GstCameraBinImage * sink);
-static GstStateChangeReturn
-gst_camerabin_image_change_state (GstElement * element,
- GstStateChange transition);
-static gboolean gst_camerabin_image_send_event (GstElement * element,
- GstEvent * event);
-static void gst_camerabin_image_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec);
-static void gst_camerabin_image_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec);
-static gboolean metadata_write_probe (GstPad * pad, GstBuffer * buffer,
- gpointer u_data);
-static gboolean prepare_element (GList ** result,
- const gchar * default_element_name, GstElement * app_elem,
- GstElement ** res_elem);
-
-
-GST_BOILERPLATE (GstCameraBinImage, gst_camerabin_image, GstBin, GST_TYPE_BIN);
-
-static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS_ANY);
-
-static void
-gst_camerabin_image_base_init (gpointer klass)
-{
- GstElementClass *eklass = GST_ELEMENT_CLASS (klass);
-
- gst_element_class_add_pad_template (eklass,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_set_details_simple (eklass,
- "Image capture bin for camerabin", "Bin/Image",
- "Process and store image data",
- "Edgard Lima <edgard.lima@indt.org.br>, "
- "Nokia Corporation <multimedia@maemo.org>");
-}
-
-static void
-gst_camerabin_image_class_init (GstCameraBinImageClass * klass)
-{
- GObjectClass *gobject_class;
- GstElementClass *eklass = GST_ELEMENT_CLASS (klass);
-
- gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->dispose =
- (GObjectFinalizeFunc) GST_DEBUG_FUNCPTR (gst_camerabin_image_dispose);
- eklass->change_state = GST_DEBUG_FUNCPTR (gst_camerabin_image_change_state);
- eklass->send_event = GST_DEBUG_FUNCPTR (gst_camerabin_image_send_event);
-
- gobject_class->set_property =
- GST_DEBUG_FUNCPTR (gst_camerabin_image_set_property);
- gobject_class->get_property =
- GST_DEBUG_FUNCPTR (gst_camerabin_image_get_property);
-
- /**
- * GstCameraBinImage:filename
- *
- * This property can be used to specify the filename of the image.
- *
- **/
- g_object_class_install_property (gobject_class, PROP_FILENAME,
- g_param_spec_string ("filename", "Filename",
- "Filename of the image to save", NULL,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-static void
-gst_camerabin_image_init (GstCameraBinImage * img,
- GstCameraBinImageClass * g_class)
-{
- img->filename = g_string_new ("");
-
- img->post = NULL;
- img->csp = NULL;
- img->enc = NULL;
- img->app_enc = NULL;
- img->formatter = NULL;
- img->app_formatter = NULL;
- img->sink = NULL;
-
- /* Create src and sink ghost pads */
- img->sinkpad = gst_ghost_pad_new_no_target ("sink", GST_PAD_SINK);
- gst_element_add_pad (GST_ELEMENT (img), img->sinkpad);
-
- img->flags = DEFAULT_FLAGS;
-}
-
-static void
-gst_camerabin_image_dispose (GstCameraBinImage * img)
-{
- GST_DEBUG_OBJECT (img, "disposing");
-
- g_string_free (img->filename, TRUE);
- img->filename = NULL;
-
- if (img->elements) {
- g_list_free (img->elements);
- img->elements = NULL;
- }
-
- if (img->sink) {
- GST_LOG_OBJECT (img, "disposing %s with refcount %d",
- GST_ELEMENT_NAME (img->sink), GST_OBJECT_REFCOUNT_VALUE (img->sink));
- gst_object_unref (img->sink);
- img->sink = NULL;
- }
-
- if (img->formatter) {
- GST_LOG_OBJECT (img, "disposing %s with refcount %d",
- 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) {
- GST_LOG_OBJECT (img, "disposing %s with refcount %d",
- GST_ELEMENT_NAME (img->enc), GST_OBJECT_REFCOUNT_VALUE (img->enc));
- gst_object_unref (img->enc);
- img->enc = NULL;
- }
-
- if (img->csp) {
- GST_LOG_OBJECT (img, "disposing %s with refcount %d",
- GST_ELEMENT_NAME (img->csp), GST_OBJECT_REFCOUNT_VALUE (img->csp));
- gst_object_unref (img->csp);
- img->csp = NULL;
- }
-
- /* Note: if imagebin was never set to READY state the
- ownership of elements created by application were never
- taken by bin and therefore gst_object_sink is called for
- these elements (they may still be in floating state
- and not unreffed properly without sinking first)
- FIXME, something else is wrong if you have to sink here
- */
- if (img->app_enc) {
- //gst_object_ref_sink (img->app_enc);
- GST_LOG_OBJECT (img, "disposing %s with refcount %d",
- GST_ELEMENT_NAME (img->app_enc),
- GST_OBJECT_REFCOUNT_VALUE (img->app_enc));
- gst_object_unref (img->app_enc);
- img->app_enc = NULL;
- }
-
- if (img->post) {
- //gst_object_ref_sink (img->post);
- GST_LOG_OBJECT (img, "disposing %s with refcount %d",
- GST_ELEMENT_NAME (img->post), GST_OBJECT_REFCOUNT_VALUE (img->post));
- gst_object_unref (img->post);
- img->post = NULL;
- }
-
- G_OBJECT_CLASS (parent_class)->dispose ((GObject *) img);
-}
-
-static GstStateChangeReturn
-gst_camerabin_image_change_state (GstElement * element,
- GstStateChange transition)
-{
- GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
- GstCameraBinImage *img = GST_CAMERABIN_IMAGE (element);
-
- GST_DEBUG_OBJECT (element, "changing state: %s -> %s",
- gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)),
- gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition)));
-
- switch (transition) {
- case GST_STATE_CHANGE_NULL_TO_READY:
- if (!gst_camerabin_image_create_elements (img)) {
- return GST_STATE_CHANGE_FAILURE;
- }
- /* Allow setting filename when image bin in READY state */
- gst_element_set_locked_state (img->sink, TRUE);
- GST_INFO_OBJECT (img, "locking imagebin->sink state to %s",
- gst_element_state_get_name (GST_STATE (img->sink)));
- break;
- case GST_STATE_CHANGE_READY_TO_PAUSED:
- if (!g_str_equal (img->filename->str, "")) {
- GST_INFO_OBJECT (img, "preparing image with filename: %s",
- img->filename->str);
- gst_element_set_locked_state (img->sink, FALSE);
- } else {
- GST_INFO_OBJECT (img, "keep sink locked, we have no filename yet");
- }
- break;
- case GST_STATE_CHANGE_PAUSED_TO_READY:
- /* Set sink to NULL in order to write the file _now_ */
- GST_INFO_OBJECT (img, "write image with filename: %s",
- img->filename->str);
- gst_element_set_locked_state (img->sink, TRUE);
- gst_element_set_state (img->sink, GST_STATE_NULL);
- g_string_assign (img->filename, "");
- break;
- default:
- break;
- }
-
- ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
-
- switch (transition) {
- case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
- /* Write debug graph to file */
- GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (GST_ELEMENT_PARENT (img)),
- GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE |
- GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS, "imagebin.playing");
- break;
- case GST_STATE_CHANGE_READY_TO_NULL:
- gst_camerabin_image_destroy_elements (img);
- break;
- default:
- break;
- }
-
- GST_DEBUG_OBJECT (element, "changed state: %s -> %s = %s",
- gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)),
- gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition)),
- gst_element_state_change_return_get_name (ret));
-
- return ret;
-}
-
-gboolean
-gst_camerabin_image_send_event (GstElement * element, GstEvent * event)
-{
- GstCameraBinImage *bin = GST_CAMERABIN_IMAGE (element);
- gboolean ret = FALSE;
-
- GST_INFO ("got %s event", GST_EVENT_TYPE_NAME (event));
-
- if (GST_EVENT_IS_DOWNSTREAM (event)) {
- ret = gst_pad_send_event (bin->sinkpad, event);
- } else {
- if (bin->sink) {
- ret = gst_element_send_event (bin->sink, event);
- } else {
- GST_WARNING ("upstream event handling failed");
- }
- }
-
- return ret;
-}
-
-static void
-gst_camerabin_image_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec)
-{
- GstCameraBinImage *bin = GST_CAMERABIN_IMAGE (object);
-
- switch (prop_id) {
- case PROP_FILENAME:
- g_string_assign (bin->filename, g_value_get_string (value));
- GST_INFO_OBJECT (bin, "received filename: '%s'", bin->filename->str);
- if (bin->sink) {
- if (!g_str_equal (bin->filename->str, "")) {
- g_object_set (G_OBJECT (bin->sink), "location", bin->filename->str,
- NULL);
- gst_element_set_locked_state (bin->sink, FALSE);
- gst_element_sync_state_with_parent (bin->sink);
- } else {
- GST_INFO_OBJECT (bin, "empty filename");
- }
- } else {
- GST_INFO_OBJECT (bin, "no sink, not setting name yet");
- }
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gst_camerabin_image_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec)
-{
- GstCameraBinImage *bin = GST_CAMERABIN_IMAGE (object);
-
- switch (prop_id) {
- case PROP_FILENAME:
- g_value_set_string (value, bin->filename->str);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-/*
- * gst_camerabin_image_prepare_elements:
- * @imagebin: a pointer to #GstCameraBinImage object
- *
- * This function creates an ordered list of elements configured for imagebin
- * pipeline and creates the elements if necessary. It also stores pointers
- * to created elements for re-using them.
- *
- * Image bin:
- * img->sinkpad ! [ post process !] [ csp !] encoder ! metadata ! filesink
- *
- * Returns: %FALSE if there was error creating element, %TRUE otherwise
- */
-gboolean
-gst_camerabin_image_prepare_elements (GstCameraBinImage * imagebin)
-{
- gboolean ret = FALSE;
- GstPad *sinkpad = NULL;
-
- g_return_val_if_fail (imagebin != NULL, FALSE);
-
- GST_DEBUG_OBJECT (imagebin, "preparing image capture elements");
-
- if (imagebin->elements != NULL) {
- g_list_free (imagebin->elements);
- imagebin->elements = NULL;
- }
-
- /* Create file sink element */
- if (!prepare_element (&imagebin->elements, DEFAULT_SINK, NULL,
- &imagebin->sink)) {
- goto done;
- } else {
- g_object_set (G_OBJECT (imagebin->sink), "location",
- imagebin->filename->str, "async", FALSE, "buffer-mode", 2,
- /* non buffered io */ NULL);
- }
-
- /* Create metadata muxer element */
- 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->formatter, "sink");
- imagebin->metadata_probe_id =
- gst_pad_add_buffer_probe (sinkpad, G_CALLBACK (metadata_write_probe),
- imagebin);
- gst_object_unref (sinkpad);
- }
-
- /* Create image encoder element */
- if (!prepare_element (&imagebin->elements, DEFAULT_ENC, imagebin->app_enc,
- &imagebin->enc)) {
- goto done;
- }
-
- /* Create optional colorspace conversion element */
- if (imagebin->flags & GST_CAMERABIN_FLAG_IMAGE_COLOR_CONVERSION) {
- if (!prepare_element (&imagebin->elements, "ffmpegcolorspace", NULL,
- &imagebin->csp)) {
- goto done;
- }
- }
-
- /* Add optional image post processing element */
- if (!prepare_element (&imagebin->elements, NULL, imagebin->post,
- &imagebin->post)) {
- goto done;
- }
-
- ret = TRUE;
-
-done:
- GST_DEBUG_OBJECT (imagebin, "preparing finished %s", ret ? "OK" : "NOK");
- return ret;
-}
-
-
-/*
- * static helper functions implementation
- */
-
-/*
- * metadata_write_probe:
- * @pad: sink pad of metadata muxer
- * @buffer: received buffer
- * @u_data: image bin object
- *
- * Buffer probe that sets Xmp.dc.type and Xmp.dc.format tags
- * to metadata muxer based on preceding element src pad caps.
- *
- * Returns: TRUE always
- */
-static gboolean
-metadata_write_probe (GstPad * pad, GstBuffer * buffer, gpointer u_data)
-{
- /* Add XMP tags */
- GstCameraBinImage *img = NULL;
- GstTagSetter *setter = NULL;
- GstPad *srcpad = NULL;
- GstCaps *caps = NULL;
- GstStructure *st = NULL;
-
- img = GST_CAMERABIN_IMAGE (u_data);
-
- g_return_val_if_fail (img != NULL, TRUE);
-
- if (GST_IS_TAG_SETTER (img->formatter)) {
- setter = GST_TAG_SETTER (img->formatter);
- }
-
- if (!setter) {
- GST_WARNING_OBJECT (img, "setting tags failed");
- goto done;
- }
-
- /* Xmp.dc.type tag */
- gst_tag_setter_add_tags (setter, GST_TAG_MERGE_REPLACE,
- GST_TAG_CODEC, "Image", NULL);
- /* Xmp.dc.format tag */
- if (img->enc) {
- srcpad = gst_element_get_static_pad (img->enc, "src");
- }
- GST_LOG_OBJECT (img, "srcpad:%" GST_PTR_FORMAT, srcpad);
- if (srcpad) {
- caps = gst_pad_get_negotiated_caps (srcpad);
- GST_LOG_OBJECT (img, "caps:%" GST_PTR_FORMAT, caps);
- if (caps) {
- /* If there are many structures, we can't know which one to use */
- if (gst_caps_get_size (caps) != 1) {
- GST_WARNING_OBJECT (img, "can't decide structure for format tag");
- goto done;
- }
- st = gst_caps_get_structure (caps, 0);
- if (st) {
- GST_DEBUG_OBJECT (img, "Xmp.dc.format:%s", gst_structure_get_name (st));
- gst_tag_setter_add_tags (setter, GST_TAG_MERGE_REPLACE,
- GST_TAG_VIDEO_CODEC, gst_structure_get_name (st), NULL);
- }
- }
- }
-done:
- if (caps)
- gst_caps_unref (caps);
- if (srcpad)
- gst_object_unref (srcpad);
-
- return TRUE;
-}
-
-/*
- * prepare_element:
- * @result: result list address
- * @default_element_name: name of default element to be created
- * @app_elem: pointer to application set element
- * @res_elem: pointer to current element to be replaced if needed
- *
- * This function chooses given image capture element or creates a new one and
- * and prepends it to @result list.
- *
- * Returns: %FALSE if there was error creating new element, %TRUE otherwise
- */
-static gboolean
-prepare_element (GList ** result, const gchar * default_element_name,
- GstElement * app_elem, GstElement ** res_elem)
-{
- GstElement *elem = NULL;
- gboolean ret = TRUE;
-
- if (app_elem) {
- /* Prefer application set element */
- elem = app_elem;
- } else if (*res_elem) {
- /* Use existing element if any */
- elem = *res_elem;
- } else if (default_element_name) {
- /* Create new element */
- if (!(elem = gst_element_factory_make (default_element_name, NULL))) {
- GST_WARNING ("creating %s failed", default_element_name);
- ret = FALSE;
- }
- }
-
- if (*res_elem != elem) {
- /* Keep reference and store pointer to chosen element, which can be re-used
- until imagebin is disposed or new image capture element is chosen. */
- gst_object_replace ((GstObject **) res_elem, (GstObject *) elem);
- }
- if (elem) {
- *result = g_list_prepend (*result, elem);
- }
-
- return ret;
-}
-
-/*
- * gst_camerabin_image_link_first_element:
- * @img: a pointer to #GstCameraBinImage object
- * @elem: first element to be linked on imagebin
- *
- * Adds given element to imagebin and links it to imagebin's ghost sink pad.
- *
- * Returns: %TRUE if adding and linking succeeded, %FALSE otherwise
- */
-static gboolean
-gst_camerabin_image_link_first_element (GstCameraBinImage * imagebin,
- GstElement * elem)
-{
- GstPad *first_sinkpad = NULL;
- gboolean ret = FALSE;
-
- g_return_val_if_fail (imagebin != NULL, FALSE);
- /* Link given element to imagebin ghost sink pad */
- if (gst_bin_add (GST_BIN (imagebin), elem)) {
- first_sinkpad = gst_element_get_static_pad (elem, "sink");
- if (first_sinkpad) {
- if (gst_ghost_pad_set_target (GST_GHOST_PAD (imagebin->sinkpad),
- first_sinkpad)) {
- ret = TRUE;
- } else {
- GST_WARNING ("linking first element failed");
- }
- gst_object_unref (first_sinkpad);
- } else {
- GST_WARNING ("no sink pad in first element");
- }
- } else {
- GST_WARNING ("adding element failed");
- }
- return ret;
-}
-
-/*
- * gst_camerabin_image_link_elements:
- * @imagebin: a pointer to #GstCameraBinImage object
- *
- * Link elements configured to imagebin elements list.
- *
- * Returns %TRUE if linking succeeded, %FALSE otherwise.
- */
-static gboolean
-gst_camerabin_image_link_elements (GstCameraBinImage * imagebin)
-{
- GList *prev = NULL;
- GList *next = NULL;
- gboolean ret = FALSE;
-
- GST_DEBUG_OBJECT (imagebin, "linking image elements");
-
- if (!imagebin->elements) {
- GST_WARNING ("no elements to link");
- goto done;
- }
-
- /* Link the elements in list */
- prev = imagebin->elements;
- next = g_list_next (imagebin->elements);
- for (; next != NULL; next = g_list_next (next)) {
- /* Link first element in list to imagebin ghost sink pad */
- if (prev == imagebin->elements
- && !gst_camerabin_image_link_first_element (imagebin,
- GST_ELEMENT (prev->data))) {
- goto done;
- }
- if (!gst_bin_add (GST_BIN (imagebin), GST_ELEMENT (next->data))) {
- GST_WARNING_OBJECT (imagebin, "adding element failed");
- goto done;
- }
- GST_LOG_OBJECT (imagebin, "linking %s - %s",
- GST_ELEMENT_NAME (GST_ELEMENT (prev->data)),
- GST_ELEMENT_NAME (GST_ELEMENT (next->data)));
- if (!gst_element_link (GST_ELEMENT (prev->data), GST_ELEMENT (next->data))) {
- GST_WARNING_OBJECT (imagebin, "linking element failed");
- goto done;
- }
-
- prev = next;
- }
-
- ret = TRUE;
-
-done:
-
- if (!ret) {
- gst_camerabin_remove_elements_from_bin (GST_BIN (imagebin));
- }
-
- GST_DEBUG_OBJECT (imagebin, "linking finished %s", ret ? "OK" : "NOK");
-
- return ret;
-}
-
-/*
- * gst_camerabin_image_create_elements:
- * @img: a pointer to #GstCameraBinImage object
- *
- * This function creates needed elements, adds them to
- * imagebin and links them.
- *
- * Returns %TRUE if success, %FALSE otherwise.
- */
-static gboolean
-gst_camerabin_image_create_elements (GstCameraBinImage * img)
-{
- gboolean ret = FALSE;
- g_return_val_if_fail (img != NULL, FALSE);
-
- if (gst_camerabin_image_prepare_elements (img)) {
- ret = gst_camerabin_image_link_elements (img);
- }
-
- return ret;
-}
-
-/*
- * gst_camerabin_image_destroy_elements:
- * @img: a pointer to #GstCameraBinImage object
- *
- * This function releases resources allocated in
- * gst_camerabin_image_create_elements.
- *
- */
-static void
-gst_camerabin_image_destroy_elements (GstCameraBinImage * img)
-{
- GST_LOG ("destroying image elements");
-
- gst_ghost_pad_set_target (GST_GHOST_PAD (img->sinkpad), NULL);
-
- gst_camerabin_remove_elements_from_bin (GST_BIN (img));
-}
-
-void
-gst_camerabin_image_set_encoder (GstCameraBinImage * img, GstElement * encoder)
-{
- GST_DEBUG ("setting image encoder %" GST_PTR_FORMAT, encoder);
- if (img->app_enc)
- gst_object_unref (img->app_enc);
- if (encoder)
- gst_object_ref (encoder);
-
- img->app_enc = encoder;
-}
-
-void
-gst_camerabin_image_set_postproc (GstCameraBinImage * img,
- GstElement * postproc)
-{
- GST_DEBUG ("setting image postprocessing element %" GST_PTR_FORMAT, postproc);
- if (img->post)
- gst_object_unref (img->post);
- if (postproc)
- gst_object_ref (postproc);
-
- img->post = postproc;
-}
-
-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);
- img->flags = flags;
-}
-
-GstElement *
-gst_camerabin_image_get_encoder (GstCameraBinImage * img)
-{
- GstElement *enc;
-
- if (img->app_enc) {
- enc = img->app_enc;
- } else {
- enc = img->enc;
- }
-
- return enc;
-}
-
-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;
-}