pkgsrc/graphics/cheese/patches/patch-ab
2009-05-21 16:11:25 +00:00

200 lines
5.8 KiB
Text

$NetBSD: patch-ab,v 1.9 2009/05/21 16:11:25 wiz Exp $
http://bugzilla.gnome.org/show_bug.cgi?id=583469
--- src/cheese-webcam.c.orig 2009-05-18 20:46:03.000000000 +0000
+++ src/cheese-webcam.c
@@ -31,13 +31,26 @@
#include <gst/gst.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <X11/Xlib.h>
+
+#if HAVE_HAL
#include <libhal.h>
+#endif
-/* for ioctl query */
+#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
-#include <sys/ioctl.h>
+
+#if USE_SYS_VIDEOIO_H > 0
+#include <sys/types.h>
+#include <sys/videoio.h>
+#elif defined(__sun)
+#include <sys/types.h>
+#include <sys/videodev2.h>
+#elif defined(__linux__)
#include <linux/videodev.h>
+#else
+#define NO_VIDEO_SUPPORT
+#endif
#include "cheese-webcam.h"
@@ -241,6 +254,7 @@ cheese_webcam_bus_message_cb (GstBus *bu
}
}
+#if HAVE_HAL
static void
cheese_webcam_get_video_devices_from_hal (CheeseWebcam *webcam)
{
@@ -302,8 +316,12 @@ cheese_webcam_get_video_devices_from_hal
char *parent_udi = NULL;
char *subsystem = NULL;
char *gstreamer_src, *product_name;
+#ifndef NO_VIDEO_SUPPORT
struct v4l2_capability v2cap;
+#endif
+#ifdef VIDIOCGCAP
struct video_capability v1cap;
+#endif
gint vendor_id = 0;
gint product_id = 0;
gchar *property_name = NULL;
@@ -317,15 +335,17 @@ cheese_webcam_get_video_devices_from_hal
if (parent_udi != NULL) {
subsystem = libhal_device_get_property_string (hal_ctx, parent_udi, "info.subsystem", NULL);
- if (subsystem == NULL) continue;
- property_name = g_strjoin (".", subsystem, "vendor_id", NULL);
- vendor_id = libhal_device_get_property_int (hal_ctx, parent_udi, property_name , &error);
- if (dbus_error_is_set (&error)) {
- g_warning ("error getting vendor id: %s: %s", error.name, error.message);
- dbus_error_free (&error);
+ if (subsystem == NULL) {
+ vendor_id = g_strdup("{No vendor ID}");
+ } else {
+ property_name = g_strjoin (".", subsystem, "vendor_id", NULL);
+ vendor_id = libhal_device_get_property_int (hal_ctx, parent_udi, property_name , &error);
+ if (dbus_error_is_set (&error)) {
+ g_warning ("error getting vendor id: %s: %s", error.name, error.message);
+ dbus_error_free (&error);
+ }
+ g_free (property_name);
}
- g_free (property_name);
-
property_name = g_strjoin (".", subsystem, "product_id", NULL);
product_id = libhal_device_get_property_int (hal_ctx, parent_udi, property_name, &error);
if (dbus_error_is_set (&error)) {
@@ -362,9 +382,14 @@ cheese_webcam_get_video_devices_from_hal
libhal_free_string (device);
continue;
}
+#ifdef VIDIOC_QUERYCAP
ok = ioctl (fd, VIDIOC_QUERYCAP, &v2cap);
+#else
+ ok = -1;
+#endif
if (ok < 0)
{
+#ifdef VIDIOCGCAP
ok = ioctl (fd, VIDIOCGCAP, &v1cap);
if (ok < 0)
{
@@ -378,14 +403,22 @@ cheese_webcam_get_video_devices_from_hal
g_print ("Device type: %d\n", v1cap.type);
gstreamer_src = "v4lsrc";
product_name = v1cap.name;
+#else
+ g_error ("Error while probing v4l2 capabilities for %s: %s\n",
+ device, strerror (errno));
+ libhal_free_string (device);
+ close (fd);
+ continue;
+#endif
}
else
{
+#ifndef NO_VIDEO_SUPPORT
guint cap = v2cap.capabilities;
g_print ("Detected v4l2 device: %s\n", v2cap.card);
g_print ("Driver: %s, version: %d\n", v2cap.driver, v2cap.version);
/* g_print ("Bus info: %s\n", v2cap.bus_info); */ /* Doesn't seem anything useful */
- g_print ("Capabilities: 0x%08X\n", v2cap.capabilities);
+ g_print ("Capabilities: 0x%08X\n", v2cap.capabilities);
if (!(cap & V4L2_CAP_VIDEO_CAPTURE))
{
g_print ("Device %s seems to not have the capture capability, (radio tuner?)\n"
@@ -396,6 +429,10 @@ cheese_webcam_get_video_devices_from_hal
}
gstreamer_src = "v4l2src";
product_name = (char *) v2cap.card;
+#else /* NO_VIDEO_SUPPORT */
+ gstreamer_src = "v4l2src";
+ product_name = "Webcam";
+#endif
}
g_print ("\n");
@@ -431,6 +468,55 @@ fallback:
priv->webcam_devices[0].hal_udi = g_strdup ("cheese_fake_videodevice");
}
}
+#else
+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 /* !HAVE_HAL */
+
static void
cheese_webcam_get_supported_framerates (CheeseVideoFormat *video_format, GstStructure *structure)
@@ -736,7 +822,11 @@ cheese_webcam_detect_webcam_devices (Che
int i;
+#if HAVE_HAL
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++)