mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-22 16:26:39 +00:00
f691a70d69
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.
140 lines
3.9 KiB
C
140 lines
3.9 KiB
C
/* 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);
|
|
}
|