[clutter-gst] ClutterGstCameraDevice: Add new class representing a camera device using GStreamer.
- From: Lionel Landwerlin <llandwerlin src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [clutter-gst] ClutterGstCameraDevice: Add new class representing a camera device using GStreamer.
- Date: Mon, 18 Mar 2013 23:35:44 +0000 (UTC)
commit 228b9f33dffcfebcf988fb9c61442a792eca3756
Author: Andre Moreira Magalhaes (andrunko) <andre magalhaes collabora co uk>
Date: Wed Aug 15 15:33:32 2012 -0300
ClutterGstCameraDevice: Add new class representing a camera device using GStreamer.
clutter-gst/Makefile.am | 2 +
clutter-gst/clutter-gst-camera-device.c | 514 +++++++++++++++++++++++++++++++
clutter-gst/clutter-gst-camera-device.h | 119 +++++++
clutter-gst/clutter-gst.h | 1 +
4 files changed, 636 insertions(+), 0 deletions(-)
---
diff --git a/clutter-gst/Makefile.am b/clutter-gst/Makefile.am
index ee68356..c3cd8ec 100644
--- a/clutter-gst/Makefile.am
+++ b/clutter-gst/Makefile.am
@@ -28,6 +28,7 @@ source_h = \
$(srcdir)/clutter-gst-actor.h \
$(srcdir)/clutter-gst-video-sink.h \
$(srcdir)/clutter-gst-video-actor.h \
+ $(srcdir)/clutter-gst-camera-device.h \
$(srcdir)/clutter-gst-player.h \
$(NULL)
@@ -44,6 +45,7 @@ source_c = \
$(srcdir)/clutter-gst-actor.c \
$(srcdir)/clutter-gst-video-sink.c \
$(srcdir)/clutter-gst-video-actor.c \
+ $(srcdir)/clutter-gst-camera-device.c \
$(srcdir)/clutter-gst-util.c \
$(glib_enum_c) \
$(NULL)
diff --git a/clutter-gst/clutter-gst-camera-device.c b/clutter-gst/clutter-gst-camera-device.c
new file mode 100644
index 0000000..56bfb45
--- /dev/null
+++ b/clutter-gst/clutter-gst-camera-device.c
@@ -0,0 +1,514 @@
+/*
+ * Clutter-GStreamer.
+ *
+ * GStreamer integration library for Clutter.
+ *
+ * clutter-gst-camera-device.c - GObject representing a camera device using GStreamer.
+ *
+ * Authored By Andre Moreira Magalhaes <andre magalhaes collabora co uk>
+ *
+ * Copyright (C) 2012 Collabora Ltd. <http://www.collabora.co.uk/>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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:clutter-gst-camera-device
+ * @short_description: GObject representing a camera device using GStreamer.
+ *
+ * #ClutterGstCameraDevice is a #GObject representing a camera device using GStreamer.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include <glib.h>
+#include <gst/gst.h>
+
+#include "clutter-gst-camera-device.h"
+#include "clutter-gst-debug.h"
+#include "clutter-gst-enum-types.h"
+#include "clutter-gst-marshal.h"
+#include "clutter-gst-private.h"
+#include "clutter-gst-types.h"
+
+struct _ClutterGstCameraDevicePrivate
+{
+ GstElementFactory *element_factory;
+ gchar *node;
+ gchar *name;
+
+ GPtrArray *supported_resolutions;
+ gint capture_width;
+ gint capture_height;
+};
+
+enum {
+ PROP_0,
+ PROP_ELEMENT_FACTORY,
+ PROP_NODE,
+ PROP_NAME
+};
+
+enum
+{
+ CAPTURE_RESOLUTION_CHANGED,
+ LAST_SIGNAL
+};
+
+static int camera_device_signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (ClutterGstCameraDevice,
+ clutter_gst_camera_device,
+ G_TYPE_OBJECT);
+
+static void
+free_resolution (ClutterGstVideoResolution *resolution)
+{
+ g_slice_free (ClutterGstVideoResolution, resolution);
+}
+
+static void
+add_supported_resolution (ClutterGstCameraDevice *device,
+ gint width,
+ gint height)
+{
+ ClutterGstCameraDevicePrivate *priv = device->priv;
+ ClutterGstVideoResolution *resolution;
+ guint i;
+
+ /* check if we already have this resolution set */
+ for (i = 0; i < priv->supported_resolutions->len; ++i)
+ {
+ ClutterGstVideoResolution *other_res;
+
+ other_res = g_ptr_array_index (priv->supported_resolutions, i);
+ if (other_res->width == width && other_res->height == height)
+ return;
+ }
+
+ resolution = g_slice_new0 (ClutterGstVideoResolution);
+ resolution->width = width;
+ resolution->height = height;
+ g_ptr_array_add (priv->supported_resolutions, resolution);
+}
+
+static void
+parse_device_caps (ClutterGstCameraDevice *device,
+ GstCaps *caps)
+{
+ guint size;
+ guint i;
+
+ size = gst_caps_get_size (caps);
+ for (i = 0; i < size; ++i)
+ {
+ GstStructure *structure;
+ const GValue *width, *height;
+
+ structure = gst_caps_get_structure (caps, i);
+ width = gst_structure_get_value (structure, "width");
+ height = gst_structure_get_value (structure, "height");
+
+ if (G_VALUE_HOLDS_INT (width) && G_VALUE_HOLDS_INT (height))
+ add_supported_resolution (device,
+ g_value_get_int (width),
+ g_value_get_int (height));
+ else if (GST_VALUE_HOLDS_INT_RANGE (width) &&
+ GST_VALUE_HOLDS_INT_RANGE (height))
+ {
+ gint min_width;
+ gint max_width;
+ gint min_height;
+ gint max_height;
+
+ min_width = gst_value_get_int_range_min (width);
+ max_width = gst_value_get_int_range_max (width);
+ min_height = gst_value_get_int_range_min (height);
+ max_height = gst_value_get_int_range_max (height);
+
+ /* TODO: how to improve this? */
+ add_supported_resolution (device, min_width, min_height);
+ add_supported_resolution (device, max_width, max_height);
+ }
+ }
+}
+
+static gint
+compare_resolution (ClutterGstVideoResolution **a, ClutterGstVideoResolution **b)
+{
+ return (((*b)->width * (*b)->height) - ((*a)->width * (*a)->height));
+}
+
+#if 0
+static void
+debug_resolutions (ClutterGstCameraDevice *device)
+{
+ ClutterGstCameraDevicePrivate *priv = device->priv;
+ guint i;
+
+ g_print ("Supported resolutions for device %s (node=%s):\n",
+ priv->name, priv->node);
+ for (i = 0; i < priv->supported_resolutions->len; ++i)
+ {
+ ClutterGstVideoResolution *res;
+
+ res = g_ptr_array_index (priv->supported_resolutions, i);
+ g_print ("\t%dx%d:\n", res->width, res->height);
+ }
+}
+#endif
+
+static void
+probe_supported_resolutions (ClutterGstCameraDevice *device,
+ GstElement *element)
+{
+ ClutterGstCameraDevicePrivate *priv = device->priv;
+ GstPad *pad;
+ GstCaps *caps;
+
+ priv->supported_resolutions = g_ptr_array_new_with_free_func (
+ (GDestroyNotify) free_resolution);
+
+ if (gst_element_set_state (element, GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS)
+ {
+ g_warning ("Unable to detect supported resolutions for camera device %s (node=%s)",
+ priv->name, priv->node);
+ return;
+ }
+
+ pad = gst_element_get_static_pad (element, "src");
+ caps = gst_pad_query_caps (pad, NULL);
+ parse_device_caps (device, caps);
+ gst_caps_unref (caps);
+ gst_object_unref (pad);
+
+ gst_element_set_state (element, GST_STATE_NULL);
+
+ g_ptr_array_sort (priv->supported_resolutions,
+ (GCompareFunc) compare_resolution);
+}
+
+/*
+ * GObject implementation
+ */
+
+static void
+clutter_gst_camera_device_constructed (GObject *object)
+{
+ ClutterGstCameraDevice *device = CLUTTER_GST_CAMERA_DEVICE (object);
+ ClutterGstCameraDevicePrivate *priv = device->priv;
+ GstElement *element;
+
+ if (!priv->element_factory || !priv->node || !priv->name)
+ {
+ g_critical ("Unable to setup device without element factory, "
+ "node and name set %p %p %p", priv->element_factory,
+ priv->node, priv->name);
+ return;
+ }
+
+ element = gst_element_factory_create (priv->element_factory, NULL);
+ if (!element)
+ {
+ g_warning ("Unable to create source for camera device %s (node=%s)",
+ priv->name, priv->node);
+ return;
+ }
+ g_object_set (G_OBJECT (element), "device", priv->node, NULL);
+
+ probe_supported_resolutions (device, element);
+ if (priv->supported_resolutions->len > 0)
+ {
+ ClutterGstVideoResolution *resolution;
+ gint width;
+ gint height;
+
+ resolution = g_ptr_array_index (priv->supported_resolutions, 0);
+ width = resolution->width;
+ height = resolution->height;
+ clutter_gst_camera_device_set_capture_resolution (device, width, height);
+ }
+
+ gst_object_unref (element);
+}
+
+static void
+clutter_gst_camera_device_dispose (GObject *object)
+{
+ ClutterGstCameraDevice *device = CLUTTER_GST_CAMERA_DEVICE (object);
+ ClutterGstCameraDevicePrivate *priv = device->priv;
+
+ if (priv->element_factory)
+ {
+ gst_object_unref (priv->element_factory);
+ priv->element_factory = NULL;
+ }
+
+ g_free (priv->node);
+ priv->node = NULL;
+ g_free (priv->name);
+ priv->name = NULL;
+
+ if (priv->supported_resolutions)
+ {
+ g_ptr_array_unref (priv->supported_resolutions);
+ priv->supported_resolutions = NULL;
+ }
+
+ G_OBJECT_CLASS (clutter_gst_camera_device_parent_class)->dispose (object);
+}
+
+static void
+clutter_gst_camera_device_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ ClutterGstCameraDevice *actor = CLUTTER_GST_CAMERA_DEVICE (object);
+ ClutterGstCameraDevicePrivate *priv = actor->priv;
+
+ switch (property_id)
+ {
+ case PROP_ELEMENT_FACTORY:
+ g_value_set_object (value, priv->element_factory);
+ break;
+ case PROP_NODE:
+ g_value_set_string (value, priv->node);
+ break;
+ case PROP_NAME:
+ g_value_set_string (value, priv->name);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+clutter_gst_camera_device_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ ClutterGstCameraDevice *actor = CLUTTER_GST_CAMERA_DEVICE (object);
+ ClutterGstCameraDevicePrivate *priv = actor->priv;
+
+ switch (property_id)
+ {
+ case PROP_ELEMENT_FACTORY:
+ if (priv->element_factory)
+ gst_object_unref (priv->element_factory);
+ priv->element_factory = gst_object_ref (GST_OBJECT (g_value_get_object (value)));
+ break;
+ case PROP_NODE:
+ g_free (priv->node);
+ priv->node = g_value_dup_string (value);
+ break;
+ case PROP_NAME:
+ g_free (priv->name);
+ priv->name = g_value_dup_string (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+clutter_gst_camera_device_class_init (ClutterGstCameraDeviceClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GParamSpec *pspec;
+
+ g_type_class_add_private (klass, sizeof (ClutterGstCameraDevicePrivate));
+
+ object_class->constructed = clutter_gst_camera_device_constructed;
+ object_class->dispose = clutter_gst_camera_device_dispose;
+ object_class->set_property = clutter_gst_camera_device_set_property;
+ object_class->get_property = clutter_gst_camera_device_get_property;
+
+ /**
+ * ClutterGstCameraDevice:element-factory:
+ *
+ * The GstElementFactory for this device.
+ */
+ pspec = g_param_spec_object ("element-factory",
+ "ElementFactory",
+ "The GstElementFactory for this device",
+ GST_TYPE_ELEMENT_FACTORY,
+ CLUTTER_GST_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
+ g_object_class_install_property (object_class, PROP_ELEMENT_FACTORY, pspec);
+
+ /**
+ * ClutterGstCameraDevice:node:
+ *
+ * The device node.
+ */
+ pspec = g_param_spec_string ("node",
+ "Node",
+ "The device node",
+ NULL,
+ CLUTTER_GST_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
+ g_object_class_install_property (object_class, PROP_NODE, pspec);
+
+ /**
+ * ClutterGstCameraDevice:name:
+ *
+ * The device name.
+ */
+ pspec = g_param_spec_string ("name",
+ "Name",
+ "The device name",
+ NULL,
+ CLUTTER_GST_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
+ g_object_class_install_property (object_class, PROP_NAME, pspec);
+
+ /**
+ * ClutterGstCameraDevice::capture-resolution-changed:
+ * @device: the device which received the signal
+ * @width: The new width
+ * @width: The new height
+ *
+ * The ::capture-resolution-changed signal is emitted whenever the value of
+ * clutter_gst_camera_device_get_capture_resolution changes.
+ */
+ camera_device_signals[CAPTURE_RESOLUTION_CHANGED] =
+ g_signal_new ("capture-resolution-changed",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (ClutterGstCameraDeviceClass, capture_resolution_changed),
+ NULL, NULL,
+ _clutter_gst_marshal_VOID__INT_INT,
+ G_TYPE_NONE, 2,
+ G_TYPE_INT,
+ G_TYPE_INT);
+}
+
+static void
+clutter_gst_camera_device_init (ClutterGstCameraDevice *device)
+{
+ ClutterGstCameraDevicePrivate *priv;
+
+ device->priv = priv =
+ G_TYPE_INSTANCE_GET_PRIVATE (device,
+ CLUTTER_GST_TYPE_CAMERA_DEVICE,
+ ClutterGstCameraDevicePrivate);
+}
+
+/*
+ * Public symbols
+ */
+
+/**
+ * clutter_gst_camera_device_get_node:
+ * @device: a #ClutterGstCameraDevice
+ *
+ * Retrieve the node (location) of the @device.
+ *
+ * Return value: (transfer none): the device node.
+ */
+const gchar *
+clutter_gst_camera_device_get_node (ClutterGstCameraDevice *device)
+{
+ g_return_val_if_fail (CLUTTER_GST_IS_CAMERA_DEVICE (device), NULL);
+
+ return device->priv->node;
+}
+
+/**
+ * clutter_gst_camera_device_get_name:
+ * @device: a #ClutterGstCameraDevice
+ *
+ * Retrieve the name of the @device.
+ *
+ * Return value: (transfer none): the device name.
+ */
+const gchar *
+clutter_gst_camera_device_get_name (ClutterGstCameraDevice *device)
+{
+ g_return_val_if_fail (CLUTTER_GST_IS_CAMERA_DEVICE (device), NULL);
+
+ return device->priv->name;
+}
+
+/**
+ * clutter_gst_camera_device_get_supported_resolutions:
+ * @device: a #ClutterGstCameraDevice
+ *
+ * Retrieve the supported resolutions of the @device.
+ *
+ * Return value: (transfer none): an array of #ClutterGstVideoResolution with the
+ * supported resolutions.
+ */
+const GPtrArray *
+clutter_gst_camera_device_get_supported_resolutions (ClutterGstCameraDevice *device)
+{
+ g_return_val_if_fail (CLUTTER_GST_IS_CAMERA_DEVICE (device), NULL);
+
+ return device->priv->supported_resolutions;
+}
+
+/**
+ * clutter_gst_camera_device_get_capture_resolution:
+ * @device: a #ClutterGstCameraDevice
+ * @width: Pointer to store the current capture resolution width
+ * @height: Pointer to store the current capture resolution height
+ *
+ * Retrieve the current capture resolution being used by @device.
+ */
+void
+clutter_gst_camera_device_get_capture_resolution (ClutterGstCameraDevice *device,
+ gint *width,
+ gint *height)
+{
+ ClutterGstCameraDevicePrivate *priv;
+
+ g_return_if_fail (CLUTTER_GST_IS_CAMERA_DEVICE (device));
+
+ priv = device->priv;
+
+ if (width)
+ *width = priv->capture_width;
+ if (height)
+ *height = priv->capture_height;
+}
+
+/**
+ * clutter_gst_camera_device_set_capture_resolution:
+ * @device: a #ClutterGstCameraDevice
+ * @width: The new capture resolution width to use
+ * @height: The new capture resolution height to use
+ *
+ * Set the capture resolution to be used by @device.
+ */
+void
+clutter_gst_camera_device_set_capture_resolution (ClutterGstCameraDevice *device,
+ gint width,
+ gint height)
+{
+ ClutterGstCameraDevicePrivate *priv;
+
+ g_return_if_fail (CLUTTER_GST_IS_CAMERA_DEVICE (device));
+
+ priv = device->priv;
+ priv->capture_width = width;
+ priv->capture_height = height;
+ g_signal_emit (device,
+ camera_device_signals[CAPTURE_RESOLUTION_CHANGED], 0,
+ width, height);
+}
diff --git a/clutter-gst/clutter-gst-camera-device.h b/clutter-gst/clutter-gst-camera-device.h
new file mode 100644
index 0000000..3e30a44
--- /dev/null
+++ b/clutter-gst/clutter-gst-camera-device.h
@@ -0,0 +1,119 @@
+/*
+ * Clutter-GStreamer.
+ *
+ * GStreamer integration library for Clutter.
+ *
+ * clutter-gst-camera-device.h - GObject representing a camera device using GStreamer.
+ *
+ * Authored By Andre Moreira Magalhaes <andre magalhaes collabora co uk>
+ *
+ * Copyright (C) 2012 Collabora Ltd. <http://www.collabora.co.uk/>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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.
+ */
+
+#if !defined(__CLUTTER_GST_H_INSIDE__) && !defined(CLUTTER_GST_COMPILATION)
+#error "Only <clutter-gst/clutter-gst.h> can be included directly."
+#endif
+
+#ifndef __CLUTTER_GST_CAMERA_DEVICE_H__
+#define __CLUTTER_GST_CAMERA_DEVICE_H__
+
+#include <glib-object.h>
+#include <gst/gstelement.h>
+
+G_BEGIN_DECLS
+
+#define CLUTTER_GST_TYPE_CAMERA_DEVICE clutter_gst_camera_device_get_type()
+
+#define CLUTTER_GST_CAMERA_DEVICE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ CLUTTER_GST_TYPE_CAMERA_DEVICE, ClutterGstCameraDevice))
+
+#define CLUTTER_GST_CAMERA_DEVICE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), \
+ CLUTTER_GST_TYPE_CAMERA_DEVICE, ClutterGstCameraDeviceClass))
+
+#define CLUTTER_GST_IS_CAMERA_DEVICE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ CLUTTER_GST_TYPE_CAMERA_DEVICE))
+
+#define CLUTTER_GST_IS_CAMERA_DEVICE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+ CLUTTER_GST_TYPE_CAMERA_DEVICE))
+
+#define CLUTTER_GST_CAMERA_DEVICE_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ CLUTTER_GST_TYPE_CAMERA_DEVICE, ClutterGstCameraDeviceClass))
+
+typedef struct _ClutterGstCameraDevice ClutterGstCameraDevice;
+typedef struct _ClutterGstCameraDeviceClass ClutterGstCameraDeviceClass;
+typedef struct _ClutterGstCameraDevicePrivate ClutterGstCameraDevicePrivate;
+
+/**
+ * ClutterGstCameraDevice:
+ *
+ * GObject representing a camera device using GStreamer.
+ *
+ * The #ClutterGstCameraDevice structure contains only private data and
+ * should not be accessed directly.
+ */
+struct _ClutterGstCameraDevice
+{
+ /*< private >*/
+ GObject parent;
+ ClutterGstCameraDevicePrivate *priv;
+};
+
+/**
+ * ClutterGstCameraDeviceClass:
+ *
+ * Base class for #ClutterGstCameraDevice.
+ */
+struct _ClutterGstCameraDeviceClass
+{
+ /*< private >*/
+ GObjectClass parent_class;
+
+ void (* capture_resolution_changed) (ClutterGstCameraDevice *device,
+ gint width,
+ gint height);
+
+ /* Future padding */
+ void (* _clutter_reserved1) (void);
+ void (* _clutter_reserved2) (void);
+ void (* _clutter_reserved3) (void);
+ void (* _clutter_reserved4) (void);
+ void (* _clutter_reserved5) (void);
+ void (* _clutter_reserved6) (void);
+};
+
+GType clutter_gst_camera_device_get_type (void) G_GNUC_CONST;
+
+const gchar * clutter_gst_camera_device_get_node (ClutterGstCameraDevice *device);
+const gchar * clutter_gst_camera_device_get_name (ClutterGstCameraDevice *device);
+
+const GPtrArray * clutter_gst_camera_device_get_supported_resolutions (ClutterGstCameraDevice *device);
+void clutter_gst_camera_device_get_capture_resolution (ClutterGstCameraDevice *device,
+ gint *width,
+ gint *height);
+void clutter_gst_camera_device_set_capture_resolution (ClutterGstCameraDevice *device,
+ gint width,
+ gint height);
+
+G_END_DECLS
+
+#endif /* __CLUTTER_GST_CAMERA_DEVICE_H__ */
diff --git a/clutter-gst/clutter-gst.h b/clutter-gst/clutter-gst.h
index c4233d1..1096ae6 100644
--- a/clutter-gst/clutter-gst.h
+++ b/clutter-gst/clutter-gst.h
@@ -35,6 +35,7 @@
#include "clutter-gst-actor.h"
#include "clutter-gst-video-sink.h"
#include "clutter-gst-video-actor.h"
+#include "clutter-gst-camera-device.h"
#include "clutter-gst-util.h"
#include "clutter-gst-version.h"
#include "clutter-gst-player.h"
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]