summaryrefslogtreecommitdiffstats
path: root/multimedia/cheese3/files/patch-libcheese_cheese-camera-device-monitor.c
diff options
context:
space:
mode:
Diffstat (limited to 'multimedia/cheese3/files/patch-libcheese_cheese-camera-device-monitor.c')
-rw-r--r--multimedia/cheese3/files/patch-libcheese_cheese-camera-device-monitor.c290
1 files changed, 0 insertions, 290 deletions
diff --git a/multimedia/cheese3/files/patch-libcheese_cheese-camera-device-monitor.c b/multimedia/cheese3/files/patch-libcheese_cheese-camera-device-monitor.c
deleted file mode 100644
index 995cb5d50..000000000
--- a/multimedia/cheese3/files/patch-libcheese_cheese-camera-device-monitor.c
+++ /dev/null
@@ -1,290 +0,0 @@
---- libcheese/cheese-camera-device-monitor.c.orig 2012-08-22 21:04:40.000000000 +0200
-+++ libcheese/cheese-camera-device-monitor.c 2013-09-22 23:12:35.072353163 +0200
-@@ -33,6 +33,14 @@
- #include <fcntl.h>
- #include <unistd.h>
- #include <sys/ioctl.h>
-+ #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
-+ #include <errno.h>
-+ #include <sys/param.h>
-+ #include <sys/types.h>
-+ #include <sys/socket.h>
-+ #include <sys/un.h>
-+ #include <linux/videodev.h>
-+ #endif
- #if USE_SYS_VIDEOIO_H > 0
- #include <sys/types.h>
- #include <sys/videoio.h>
-@@ -302,6 +310,220 @@
- g_list_free (devices);
- }
-
-+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
-+static void cheese_camera_device_monitor_init_event (CheeseCameraDeviceMonitor *monitor);
-+static gboolean cheese_camera_device_monitor_is_camera (const char *devname);
-+
-+static gboolean cheese_camera_device_monitor_event_inited = FALSE;
-+
-+static gboolean
-+cheese_camera_device_monitor_is_camera (const char *devname){
-+ gboolean is_camera = FALSE;
-+ int fd;
-+ struct v4l2_capability v2cap;
-+ g_return_val_if_fail (devname != NULL, FALSE);
-+
-+ fd = open (devname, O_RDONLY);
-+ if (fd < 0)
-+ {
-+ GST_WARNING("Failed to query: %s", devname);
-+ return FALSE;
-+ }
-+ else{
-+ if (ioctl (fd, VIDIOC_QUERYCAP, &v2cap) == 0)
-+ {
-+ is_camera = ((v2cap.capabilities & 0x00000001)==1);
-+ }
-+ else{
-+ GST_WARNING("Failed to get product name for %s: %s", devname,
-+ g_strerror (errno));
-+ }
-+ }
-+
-+ close (fd);
-+
-+ return is_camera;
-+}
-+
-+static char *
-+cheese_camera_device_monitor_get_product (const char *devname)
-+{
-+ int fd;
-+ struct v4l2_capability v2cap;
-+ char *product = NULL;
-+
-+ g_return_val_if_fail (devname != NULL, NULL);
-+
-+ fd = open (devname, O_RDONLY);
-+ if (fd < 0)
-+ {
-+ GST_WARNING("Failed to get product name for %s: %s", devname,
-+ g_strerror (errno));
-+ return NULL;
-+ }
-+
-+ if (ioctl (fd, VIDIOC_QUERYCAP, &v2cap) == 0)
-+ {
-+ product = g_strdup ((const char *) v2cap.card);
-+ }
-+ else
-+ {
-+ GST_WARNING("Failed to get product name for %s: %s", devname,
-+ g_strerror (errno));
-+ }
-+
-+ close (fd);
-+
-+ return product;
-+}
-+
-+static void
-+cheese_camera_device_monitor_process_event (const char *event,
-+ CheeseCameraDeviceMonitor *monitor)
-+{
-+ g_return_if_fail (event != NULL);
-+
-+ GST_INFO ("Received devd event: %s", event);
-+
-+ switch (event[0])
-+ {
-+ case '!':
-+ {
-+ GRegex *rex;
-+ GMatchInfo *info;
-+
-+ rex = g_regex_new ("subsystem=CDEV type=(CREATE|DESTROY) cdev=(video[0-9]+)", 0, 0, NULL);
-+ if (g_regex_match (rex, event, 0, &info))
-+ {
-+ char *devname, *type, *vdev, *product = NULL;
-+ CheeseCameraDevice *device;
-+ GError *error = NULL;
-+
-+ type = g_match_info_fetch (info, 1);
-+ vdev = g_match_info_fetch (info, 2);
-+
-+ devname = g_strdup_printf ("/dev/%s", vdev);
-+
-+ if (g_strcmp0 (type, "DESTROY") == 0)
-+ {
-+ g_signal_emit (monitor, monitor_signals[REMOVED], 0,
-+ devname);
-+ }
-+ else
-+ {
-+ if(cheese_camera_device_monitor_is_camera (devname))
-+ {
-+ product = cheese_camera_device_monitor_get_product (devname);
-+ if (product == NULL)
-+ product = g_strdup ("WebCamd Device");
-+ device = cheese_camera_device_new (devname, devname,
-+ product,
-+ 2,
-+ &error);
-+ if (device == NULL)
-+ GST_WARNING ("Device initialization for %s failed: %s",
-+ devname,
-+ (error != NULL) ? error->message : "Unknown reason");
-+ g_signal_emit (monitor, monitor_signals[ADDED], 0, device);
-+ }
-+
-+ g_free (product);
-+ }
-+ g_free (devname);
-+ g_free (vdev);
-+ g_free (type);
-+ }
-+ g_match_info_free (info);
-+ g_regex_unref (rex);
-+ break;
-+ }
-+ default:
-+ break;
-+ }
-+}
-+
-+static gboolean
-+cheese_camera_device_monitor_event_cb (GIOChannel *source,
-+ GIOCondition condition,
-+ gpointer user_data)
-+{
-+ char *event;
-+ gsize terminator;
-+ GIOStatus status;
-+ CheeseCameraDeviceMonitor *monitor;
-+
-+ monitor = (CheeseCameraDeviceMonitor *) user_data;
-+
-+ status = g_io_channel_read_line (source, &event, NULL, &terminator, NULL);
-+ if (status == G_IO_STATUS_NORMAL)
-+ {
-+ event[terminator] = 0;
-+ cheese_camera_device_monitor_process_event (event, monitor);
-+ g_free (event);
-+ }
-+ else
-+ {
-+ if (cheese_camera_device_monitor_event_inited)
-+ {
-+ int fd;
-+
-+ cheese_camera_device_monitor_init_event (monitor);
-+ fd = g_io_channel_unix_get_fd (source);
-+ g_io_channel_shutdown (source, FALSE, NULL);
-+ close (fd);
-+
-+ return FALSE;
-+ }
-+ }
-+
-+ return TRUE;
-+}
-+
-+void
-+cheese_camera_device_monitor_coldplug (CheeseCameraDeviceMonitor *monitor)
-+{
-+ GDir *dir;
-+ GError *error = NULL;
-+ const char *fname;
-+
-+ dir = g_dir_open ("/dev", 0, &error);
-+ if (dir == NULL)
-+ {
-+ GST_WARNING ("Failed to open /dev for reading: %s",
-+ (error != NULL) ? error->message : "Unknown error");
-+ return;
-+ }
-+
-+ while ((fname = g_dir_read_name (dir)) != NULL)
-+ {
-+ if ( strncmp (fname, "video", strlen ("video")) == 0)
-+ {
-+ char *devname, *product;
-+
-+ devname = g_strdup_printf ("/dev/%s", fname);
-+ if (cheese_camera_device_monitor_is_camera (devname))
-+ {
-+ CheeseCameraDevice *device;
-+ GError *derr = NULL;
-+
-+ product = cheese_camera_device_monitor_get_product (devname);
-+ if (product == NULL)
-+ product = g_strdup ("WebCamd Device");
-+
-+ device = cheese_camera_device_new (devname, devname, product, 2, &derr);
-+ if (device == NULL)
-+ GST_WARNING ("Device initialization for %s failed: %s", devname,
-+ (derr != NULL) ? derr->message : "Unknown reason");
-+
-+ g_signal_emit (monitor, monitor_signals[ADDED], 0, device);
-+
-+ g_free (product);
-+ }
-+ g_free (devname);
-+ }
-+ }
-+ g_dir_close (dir);
-+}
- #else /* HAVE_UDEV */
- void
- cheese_camera_device_monitor_coldplug (CheeseCameraDeviceMonitor *monitor)
-@@ -430,6 +652,42 @@
- g_type_class_add_private (klass, sizeof (CheeseCameraDeviceMonitorPrivate));
- }
-
-+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
-+static void
-+cheese_camera_device_monitor_init_event (CheeseCameraDeviceMonitor *monitor)
-+{
-+ int event_fd;
-+ struct sockaddr_un addr;
-+
-+ event_fd = socket (PF_UNIX, SOCK_STREAM, 0);
-+ if (event_fd < 0)
-+ {
-+ GST_WARNING ("Failed to create devd socket: %s", g_strerror (errno));
-+ cheese_camera_device_monitor_event_inited = FALSE;
-+ return;
-+ }
-+
-+ addr.sun_family = AF_UNIX;
-+ strncpy (addr.sun_path, "/var/run/devd.pipe", sizeof (addr.sun_path));
-+ if (connect (event_fd, (struct sockaddr *) &addr, sizeof (addr)) == 0)
-+ {
-+ GIOChannel *channel;
-+
-+ channel = g_io_channel_unix_new (event_fd);
-+ g_io_add_watch (channel, G_IO_IN, cheese_camera_device_monitor_event_cb, monitor);
-+ g_io_channel_unref (channel);
-+ cheese_camera_device_monitor_event_inited = TRUE;
-+ }
-+ else
-+ {
-+ GST_WARNING("Failed to connect to /var/run/devd.pipe: %s",
-+ g_strerror (errno));
-+ close (event_fd);
-+ cheese_camera_device_monitor_event_inited = FALSE;
-+ }
-+}
-+#endif
-+
- static void
- cheese_camera_device_monitor_init (CheeseCameraDeviceMonitor *monitor)
- {
-@@ -440,6 +698,8 @@
- priv->client = g_udev_client_new (subsystems);
- g_signal_connect (G_OBJECT (priv->client), "uevent",
- G_CALLBACK (cheese_camera_device_monitor_uevent_cb), monitor);
-+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
-+ cheese_camera_device_monitor_init_event (monitor);
- #endif /* HAVE_UDEV */
- }
-