$OpenBSD: patch-src_cheese-webcam_c,v 1.3 2008/11/25 10:33:57 ajacoutot Exp $
--- src/cheese-webcam.c.orig	Tue Nov 25 00:03:19 2008
+++ src/cheese-webcam.c	Tue Nov 25 11:27:08 2008
@@ -32,13 +32,25 @@
 #include <gst/gst.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
 #include <X11/Xlib.h>
+#ifndef __OpenBSD__ // no HAL under OpenBSD
 #include <libhal.h>
+#else
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <unistd.h>
+#if defined(__NetBSD__) || defined(__OpenBSD__)
+#include <sys/types.h>
+#include <sys/videoio.h>
+#endif
+#endif
 
 /* for ioctl query */
 #include <fcntl.h>
 #include <unistd.h>
 #include <sys/ioctl.h>
+#ifdef __linux__
 #include <linux/videodev.h>
+#endif
 
 #include "cheese-webcam.h"
 #include "cheese-flash.h"
@@ -244,6 +256,7 @@ cheese_webcam_bus_message_cb (GstBus *bus, GstMessage 
   }
 }
 
+#ifndef __OpenBSD__ // no HAL under OpenBSD
 static void
 cheese_webcam_get_video_devices_from_hal (CheeseWebcam *webcam)
 {
@@ -434,7 +447,55 @@ fallback:
     priv->webcam_devices[0].hal_udi = g_strdup ("cheese_fake_videodevice");
   }
 }
+#else // __OpenBSD__
+static void
+cheese_webcam_get_video_devices_from_probe (CheeseWebcam *webcam)
+{
+  CheeseWebcamPrivate* priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
+  struct v4l2_capability caps;
+  gchar videodev[] = "/dev/video?";
+  guint16 cammask = 0;
+  int i, ncams = 0, fd, ret, cur = 0;
+ 
+  for (i = 0; i < 9; i++)
+  {
+    videodev[strlen(videodev) - 1] = '0' + i;
+    fd = open(videodev, O_RDONLY);
+    if (fd == -1)
+      continue;
+    ret = ioctl(fd, VIDIOC_QUERYCAP, &caps);
+    close(fd);
+    if (ret)
+    {
+      continue;
+    }
+    g_message("Found video device: %s\n", caps.card);
+    cammask |= (1 << i);
+    ++ncams;
+  }
 
+  priv->num_webcam_devices = ncams;
+  if (ncams == 0)
+    return;
+  priv->webcam_devices = g_new0 (CheeseWebcamDevice, ncams);
+  for (i = 0; i < ncams; i++)
+  {
+    priv->webcam_devices[i].num_video_formats = 0;
+    priv->webcam_devices[i].video_formats = g_array_new (FALSE, FALSE, sizeof (CheeseVideoFormat));
+  }
+
+  for (i = 0; i < 9; i++)
+  {
+    if (cammask & (1 << i))
+    {
+      videodev[strlen(videodev) - 1] = '0' + i;
+      priv->webcam_devices[i].video_device = g_strdup (videodev);
+      ++cur;
+    }
+  }
+}
+#endif /* __OpenBSD__ */
+
 static void
 cheese_webcam_get_supported_framerates (CheeseVideoFormat *video_format, GstStructure *structure)
 {
@@ -739,7 +800,11 @@ cheese_webcam_detect_webcam_devices (CheeseWebcam *web
 
   int i;
 
-  cheese_webcam_get_video_devices_from_hal (webcam);
+#ifndef __OpenBSD__ // no HAL under OpenBSD
+   cheese_webcam_get_video_devices_from_hal (webcam);
+#else
+  cheese_webcam_get_video_devices_from_probe (webcam);
+#endif
 
   g_print ("Probing supported video formats...\n");
   for (i = 0; i < priv->num_webcam_devices; i++)
