From 700f70e7a5a6ae6eed5ea6026ab5901a4c05aff1 Mon Sep 17 00:00:00 2001 From: Andres Colubri Date: Mon, 31 Aug 2009 19:28:50 +0200 Subject: [PATCH] winks: add property probing support --- sys/winks/gstksvideosrc.c | 109 ++++++++++++++++++++++++++++++++++++-- sys/winks/gstksvideosrc.h | 1 + 2 files changed, 105 insertions(+), 5 deletions(-) diff --git a/sys/winks/gstksvideosrc.c b/sys/winks/gstksvideosrc.c index 3c58d74bdd..74a3fab4b3 100644 --- a/sys/winks/gstksvideosrc.c +++ b/sys/winks/gstksvideosrc.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2008 Ole André Vadla Ravnås + * 2009 Andres Colubri * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -123,12 +124,22 @@ typedef struct (G_TYPE_INSTANCE_GET_PRIVATE ((o), GST_TYPE_KS_VIDEO_SRC, \ GstKsVideoSrcPrivate)) +static void gst_ks_video_src_init_interfaces (GType type); + static void gst_ks_video_src_finalize (GObject * object); static void gst_ks_video_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_ks_video_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_ks_video_src_probe_interface_init (GstPropertyProbeInterface * + iface); +static const GList *gst_ks_video_src_probe_get_properties (GstPropertyProbe * + probe); +static GValueArray *gst_ks_video_src_probe_get_values (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec); +static GValueArray *gst_ks_video_src_get_device_name_values (GstKsVideoSrc * + self); static void gst_ks_video_src_reset (GstKsVideoSrc * self); static GstStateChangeReturn gst_ks_video_src_change_state (GstElement * element, @@ -147,8 +158,8 @@ static gboolean gst_ks_video_src_unlock_stop (GstBaseSrc * basesrc); static GstFlowReturn gst_ks_video_src_create (GstPushSrc * pushsrc, GstBuffer ** buffer); -GST_BOILERPLATE (GstKsVideoSrc, gst_ks_video_src, GstPushSrc, - GST_TYPE_PUSH_SRC); +GST_BOILERPLATE_FULL (GstKsVideoSrc, gst_ks_video_src, GstPushSrc, + GST_TYPE_PUSH_SRC, gst_ks_video_src_init_interfaces); static void gst_ks_video_src_base_init (gpointer gclass) @@ -158,8 +169,9 @@ gst_ks_video_src_base_init (gpointer gclass) gst_element_class_set_details_simple (element_class, "KsVideoSrc", "Source/Video", "Stream data from a video capture device through Windows kernel streaming", - "Ole André Vadla Ravnås , " - "Haakon Sporsheim "); + "Ole André Vadla Ravnås \n" + "Haakon Sporsheim \n" + "Andres Colubri "); gst_element_class_add_pad_template (element_class, gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, @@ -302,8 +314,13 @@ gst_ks_video_src_set_property (GObject * object, guint prop_id, priv->device_path = g_value_dup_string (value); break; case PROP_DEVICE_NAME: + { + const gchar *device_name = g_value_get_string (value); g_free (priv->device_name); - priv->device_name = g_value_dup_string (value); + priv->device_name = NULL; + if (device_name && strlen (device_name) != 0) + priv->device_name = g_strdup (device_name); + } break; case PROP_DEVICE_INDEX: priv->device_index = g_value_get_int (value); @@ -375,6 +392,88 @@ gst_ks_video_src_apply_driver_quirks (GstKsVideoSrc * self) } } +static void +gst_ks_video_src_init_interfaces (GType type) +{ + static const GInterfaceInfo ksvideosrc_info = { + (GInterfaceInitFunc) gst_ks_video_src_probe_interface_init, + NULL, + NULL, + }; + + g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, &ksvideosrc_info); +} + +static void +gst_ks_video_src_probe_interface_init (GstPropertyProbeInterface * iface) +{ + iface->get_properties = gst_ks_video_src_probe_get_properties; + iface->get_values = gst_ks_video_src_probe_get_values; +} + +static const GList * +gst_ks_video_src_probe_get_properties (GstPropertyProbe * probe) +{ + GObjectClass *klass = G_OBJECT_GET_CLASS (probe); + static GList *props = NULL; + + if (!props) { + GParamSpec *pspec; + + pspec = g_object_class_find_property (klass, "device-name"); + props = g_list_append (props, pspec); + } + + return props; +} + +static GValueArray * +gst_ks_video_src_probe_get_values (GstPropertyProbe * probe, guint prop_id, + const GParamSpec * pspec) +{ + GstKsVideoSrc *src = GST_KS_VIDEO_SRC (probe); + GValueArray *array = NULL; + + switch (prop_id) { + case PROP_DEVICE_NAME: + array = gst_ks_video_src_get_device_name_values (src); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } + + return array; +} + +static GValueArray * +gst_ks_video_src_get_device_name_values (GstKsVideoSrc * self) +{ + GList *devices, *cur; + GValueArray *array = g_value_array_new (0); + + devices = ks_enumerate_devices (&KSCATEGORY_VIDEO); + if (devices == NULL) + return array; + + devices = ks_video_device_list_sort_cameras_first (devices); + + for (cur = devices; cur != NULL; cur = cur->next) { + GValue value = { 0, }; + KsDeviceEntry *entry = cur->data; + + g_value_init (&value, G_TYPE_STRING); + g_value_set_string (&value, entry->name); + g_value_array_append (array, &value); + g_value_unset (&value); + + ks_device_entry_free (entry); + } + + g_list_free (devices); + return array; +} + static gboolean gst_ks_video_src_open_device (GstKsVideoSrc * self) { diff --git a/sys/winks/gstksvideosrc.h b/sys/winks/gstksvideosrc.h index a236c3acd6..d41023da62 100644 --- a/sys/winks/gstksvideosrc.h +++ b/sys/winks/gstksvideosrc.h @@ -21,6 +21,7 @@ #define __GST_KS_VIDEO_SRC_H__ #include +#include G_BEGIN_DECLS