diff options
author | Julien Puydt <julien.puydt@laposte.net> | 2007-11-14 19:10:37 +0000 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.net> | 2007-11-14 19:10:37 +0000 |
commit | f691a70d69d3e816d370e82cf08de0fd7c7df0b6 (patch) | |
tree | f2fbb05d30141f4d3fc8524fb6fb556496104d0c /ext/raw1394/gst1394probe.c | |
parent | 012a21be129d95f53470eec329fdba05940074a7 (diff) |
ext/raw1394/: Implement GstPropertyProbe interface and add "device-name" property, so applications can use this to pr...
Original commit message from CVS:
Patch by: Julien Puydt <julien dot puydt at laposte net>
* ext/raw1394/Makefile.am:
* ext/raw1394/gst1394probe.c: (gst_1394_get_guid_array),
(gst_1394_property_probe_get_properties),
(gst_1394_property_probe_probe_property),
(gst_1394_property_probe_needs_probe),
(gst_1394_property_probe_get_values),
(gst_1394_property_probe_interface_init),
(gst_1394_type_add_property_probe_interface):
* ext/raw1394/gst1394probe.h: (GST_1394_PROBE_H):
* ext/raw1394/gstdv1394src.c: (_do_init), (gst_dv1394src_class_init),
(gst_dv1394src_init), (gst_dv1394src_dispose),
(gst_dv1394src_set_property), (gst_dv1394src_get_property),
(gst_dv1394src_discover_avc_node), (gst_dv1394src_query),
(gst_dv1394src_update_device_name):
* ext/raw1394/gstdv1394src.h:
Implement GstPropertyProbe interface and add "device-name" property,
so applications can use this to probe for available devices in the
same way they can already with v4lsrc and v4l2src (however horrible
this property probe interface may be). Fixes #358841.
Diffstat (limited to 'ext/raw1394/gst1394probe.c')
-rw-r--r-- | ext/raw1394/gst1394probe.c | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/ext/raw1394/gst1394probe.c b/ext/raw1394/gst1394probe.c new file mode 100644 index 00000000..ee51ba0c --- /dev/null +++ b/ext/raw1394/gst1394probe.c @@ -0,0 +1,140 @@ +/* GStreamer + * Copyright (C) 2007 Julien Puydt <jpuydt@free.fr> + * + * 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. + */ + +#include <libavc1394/avc1394.h> +#include <libavc1394/avc1394_vcr.h> +#include <libavc1394/rom1394.h> +#include <libraw1394/raw1394.h> + +#include <gst/gst.h> + +#include "gst1394probe.h" +#include "gst/interfaces/propertyprobe.h" + +static GValueArray * +gst_1394_get_guid_array (void) +{ + GValueArray *result = NULL; + raw1394handle_t handle = NULL; + int num_ports = 0; + int port = 0; + int num_nodes = 0; + int node = 0; + rom1394_directory directory; + GValue value = { 0, }; + + handle = raw1394_new_handle (); + + if (handle == NULL) + return NULL; + + num_ports = raw1394_get_port_info (handle, NULL, 0); + for (port = 0; port < num_ports; port++) { + if (raw1394_set_port (handle, port) >= 0) { + num_nodes = raw1394_get_nodecount (handle); + for (node = 0; node < num_nodes; node++) { + rom1394_get_directory (handle, node, &directory); + if (rom1394_get_node_type (&directory) == ROM1394_NODE_TYPE_AVC && + avc1394_check_subunit_type (handle, node, + AVC1394_SUBUNIT_TYPE_VCR)) { + if (result == NULL) + result = g_value_array_new (3); /* looks like a sensible default */ + g_value_init (&value, G_TYPE_UINT64); + g_value_set_uint64 (&value, rom1394_get_guid (handle, node)); + g_value_array_append (result, &value); + g_value_unset (&value); + } + } + } + } + + return result; +} + +static const GList * +gst_1394_property_probe_get_properties (GstPropertyProbe * probe) +{ + static GList *result = NULL; + GObjectClass *klass = NULL; + GParamSpec *spec = NULL; + + if (result == NULL) { + klass = G_OBJECT_GET_CLASS (probe); + spec = g_object_class_find_property (klass, "guid"); + result = g_list_append (result, spec); + } + + return result; +} + +static void +gst_1394_property_probe_probe_property (GstPropertyProbe * probe, guint prop_id, + const GParamSpec * pspec) +{ + if (!g_str_equal (pspec->name, "guid")) + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); +} + +static gboolean +gst_1394_property_probe_needs_probe (GstPropertyProbe * probe, guint prop_id, + const GParamSpec * pspec) +{ + return TRUE; +} + +static GValueArray * +gst_1394_property_probe_get_values (GstPropertyProbe * probe, guint prop_id, + const GParamSpec * pspec) +{ + GValueArray *result = NULL; + + if (!g_str_equal (pspec->name, "guid")) { + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + return NULL; + } + + result = gst_1394_get_guid_array (); + + if (result == NULL) + GST_LOG_OBJECT (probe, "No guid found"); + + return result; +} + +static void +gst_1394_property_probe_interface_init (GstPropertyProbeInterface * iface) +{ + iface->get_properties = gst_1394_property_probe_get_properties; + iface->probe_property = gst_1394_property_probe_probe_property; + iface->needs_probe = gst_1394_property_probe_needs_probe; + iface->get_values = gst_1394_property_probe_get_values; +} + +void +gst_1394_type_add_property_probe_interface (GType type) +{ + static const GInterfaceInfo probe_iface_info = { + (GInterfaceInitFunc) gst_1394_property_probe_interface_init, + NULL, + NULL, + }; + + g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, + &probe_iface_info); +} |