Convert setpwc to use V4L2 API instead of deprecated V4L1. diff -NurP setpwc-1.2.orig/setpwc.c setpwc-1.2/setpwc.c --- setpwc-1.2.orig/setpwc.c 2006-11-27 10:14:03.000000000 +0100 +++ setpwc-1.2/setpwc.c 2011-05-21 16:23:38.127198157 +0200 @@ -23,7 +23,7 @@ #include #include #define _LINUX_TIME_H 1 /* to get things compile on kernel 2.6.x */ -#include +#include #include "pwc-ioctl.h" @@ -61,11 +61,120 @@ printf("of your webcam and the driver.\n"); } +void dump_current_settings_ctrl(int fd, const char *prefix, int id) +{ + struct v4l2_control vctrl; + struct v4l2_queryctrl qctrl; + struct v4l2_querymenu qmenu; + const char *flags[10]; + int flags_cnt = 0; + memset(&vctrl, 0, sizeof(vctrl)); + memset(&qctrl, 0, sizeof(qctrl)); + vctrl.id = id; + qctrl.id = id; + if (ioctl(fd, VIDIOC_G_CTRL, &vctrl) == -1) { + printf("%s: VIDIOC_G_CTRL failed: %s\n", prefix, strerror(errno)); + return; + } + if (ioctl(fd, VIDIOC_QUERYCTRL, &qctrl) == -1) { + printf("%s: VIDIOC_QUERYCTRL failed: %s\n", prefix, strerror(errno)); + return; + } + if (qctrl.flags & V4L2_CTRL_FLAG_DISABLED) + flags[flags_cnt++] = "disabled"; + if (qctrl.flags & V4L2_CTRL_FLAG_GRABBED) + flags[flags_cnt++] = "grabbed"; + if (qctrl.flags & V4L2_CTRL_FLAG_READ_ONLY) + flags[flags_cnt++] = "read-only"; + if (qctrl.flags & V4L2_CTRL_FLAG_UPDATE) + flags[flags_cnt++] = "update"; + if (qctrl.flags & V4L2_CTRL_FLAG_INACTIVE) + flags[flags_cnt++] = "inactive"; + if (qctrl.flags & V4L2_CTRL_FLAG_SLIDER) + flags[flags_cnt++] = "slider"; + flags[flags_cnt] = NULL; + switch (qctrl.type) { + case V4L2_CTRL_TYPE_INTEGER: + printf("%s: %s\n", prefix, qctrl.name); + printf(" Value: %d\n", vctrl.value); + printf(" Minimum: %d\n", qctrl.minimum); + printf(" Maximum: %d\n", qctrl.maximum); + printf(" Step: %d\n", qctrl.step); + printf(" Default: %d\n", qctrl.default_value); + printf(" Flags: "); + for (flags_cnt = 0; flags[flags_cnt]; flags_cnt++) + printf("%s%s", flags_cnt ? "," : "", flags[flags_cnt]); + printf("\n"); + break; + case V4L2_CTRL_TYPE_BOOLEAN: + printf("%s: %s\n", prefix, qctrl.name); + printf(" Value: %s\n", vctrl.value ? "enabled" : "disabled"); + printf(" Default: %s\n", qctrl.default_value ? "enabled" : "disabled"); + printf(" Flags: "); + for (flags_cnt = 0; flags[flags_cnt]; flags_cnt++) + printf("%s%s", flags_cnt ? "," : "", flags[flags_cnt]); + printf("\n"); + break; + case V4L2_CTRL_TYPE_MENU: + printf("%s: %s\n", prefix, qctrl.name); + memset(&qmenu, 0, sizeof(qmenu)); + qmenu.id = id; + qmenu.index = vctrl.value; + if (ioctl(fd, VIDIOC_QUERYMENU, &qmenu) == -1) + printf(" Value: ??? (%d)\n", vctrl.value); + else + printf(" Value: %s (%d)\n", qmenu.name, vctrl.value); + memset(&qmenu, 0, sizeof(qmenu)); + qmenu.id = id; + qmenu.index = qctrl.default_value; + if (ioctl(fd, VIDIOC_QUERYMENU, &qmenu) == -1) + printf(" Default: ??? (%d)\n", qctrl.default_value); + else + printf(" Default: %s (%d)\n", qmenu.name, qctrl.default_value); + printf(" Flags: "); + for (flags_cnt = 0; flags[flags_cnt]; flags_cnt++) + printf("%s%s", flags_cnt ? "," : "", flags[flags_cnt]); + printf("\n"); + break; + case V4L2_CTRL_TYPE_BUTTON: + printf("%s: %s\n", prefix, qctrl.name); + printf(" Unsupport type: button\n"); + printf(" Flags: "); + for (flags_cnt = 0; flags[flags_cnt]; flags_cnt++) + printf("%s%s", flags_cnt ? "," : "", flags[flags_cnt]); + printf("\n"); + break; + case V4L2_CTRL_TYPE_INTEGER64: + printf("%s: %s\n", prefix, qctrl.name); + printf(" Unsupport type: integer64\n"); + printf(" Flags: "); + for (flags_cnt = 0; flags[flags_cnt]; flags_cnt++) + printf("%s%s", flags_cnt ? "," : "", flags[flags_cnt]); + printf("\n"); + break; + case V4L2_CTRL_TYPE_CTRL_CLASS: + printf("%s: %s\n", prefix, qctrl.name); + printf(" Unsupport type: class\n"); + printf(" Flags: "); + for (flags_cnt = 0; flags[flags_cnt]; flags_cnt++) + printf("%s%s", flags_cnt ? "," : "", flags[flags_cnt]); + printf("\n"); + break; + case V4L2_CTRL_TYPE_STRING: + printf("%s: %s\n", prefix, qctrl.name); + printf(" Unsupport type: string\n"); + printf(" Flags: "); + for (flags_cnt = 0; flags[flags_cnt]; flags_cnt++) + printf("%s%s", flags_cnt ? "," : "", flags[flags_cnt]); + printf("\n"); + break; + } +} + void dump_current_settings(int fd) { - struct video_capability vcap; - struct video_window vwin; - struct video_picture vpic; + struct v4l2_capability vcap; + struct v4l2_format pixfmt; struct pwc_probe pwcp; int dummy; struct pwc_whitebalance pwcwb; @@ -75,14 +184,14 @@ struct pwc_serial ps; /* get name */ - if (ioctl(fd, VIDIOCGCAP, &vcap) == -1) - error_exit("VIDIOCGCAP"); - printf("Current device: %s\n", vcap.name); + if (ioctl(fd, VIDIOC_QUERYCAP, &vcap) == -1) + error_exit("VIDIOC_QUERYCAP"); + printf("Current device: %s (%s @ %s)\n", (const char *)vcap.card, (const char *)vcap.driver, (const char *)vcap.bus_info); /* verify that it IS a Philips Webcam */ if (ioctl(fd, VIDIOCPWCPROBE, &pwcp) == -1) error_exit("VIDIOCPWCPROBE"); - if (strcmp(vcap.name, pwcp.name) != 0) + if (strcmp((const char *)vcap.card, pwcp.name) != 0) printf("Warning: this might not be a Philips compatible webcam!\n"); printf("VIDIOCPWCPROBE returns: %s - %d\n", pwcp.name, pwcp.type); @@ -91,73 +200,63 @@ printf("Serial number: %s\n", ps.serial); /* get resolution/framerate */ - if (ioctl(fd, VIDIOCGWIN, &vwin) == -1) - error_exit("VIDIOCGWIN"); - printf("Resolution (x, y): %d, %d\n", vwin.width, vwin.height); - printf("Offset: %d, %d\n", vwin.x, vwin.y); - if (vwin.flags & PWC_FPS_FRMASK) - printf("Framerate: %d\n", (vwin.flags & PWC_FPS_FRMASK) >> PWC_FPS_SHIFT); + memset(&pixfmt, 0, sizeof(pixfmt)); + pixfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + if (ioctl(fd, VIDIOC_G_FMT, &pixfmt) == -1) + error_exit("VIDIOC_G_FMT"); + printf("Resolution (x, y): %d, %d\n", pixfmt.fmt.pix.width, pixfmt.fmt.pix.height); + if (pixfmt.fmt.pix.priv & PWC_FPS_FRMASK) + printf("Framerate: %d\n", (pixfmt.fmt.pix.priv & PWC_FPS_FRMASK) >> PWC_FPS_SHIFT); /* color (etc.) settings */ - if (ioctl(fd, VIDIOCGPICT, &vpic) == -1) - error_exit("VIDIOCGPICT"); - printf("Brightness: %d\n", vpic.brightness); - printf("Hue: %d\n", vpic.hue); - printf("Colour: %d\n", vpic.colour); - printf("Contrast: %d\n", vpic.contrast); - printf("Whiteness: %d\n", vpic.whiteness); + dump_current_settings_ctrl(fd, "Brightness", V4L2_CID_BRIGHTNESS); + dump_current_settings_ctrl(fd, "Hue", V4L2_CID_HUE); + dump_current_settings_ctrl(fd, "Colour", V4L2_CID_SATURATION); + dump_current_settings_ctrl(fd, "Contrast", V4L2_CID_CONTRAST); + dump_current_settings_ctrl(fd, "Whiteness", V4L2_CID_WHITENESS); printf("Palette: "); - switch(vpic.palette) { - case VIDEO_PALETTE_GREY: + switch(pixfmt.fmt.pix.pixelformat) { + case V4L2_PIX_FMT_GREY: printf("Linear intensity grey scale (255 is brightest).\n"); break; - case VIDEO_PALETTE_HI240: + case V4L2_PIX_FMT_HI240: printf("The BT848 8bit colour cube.\n"); break; - case VIDEO_PALETTE_RGB565: + case V4L2_PIX_FMT_RGB565: printf("RGB565 packed into 16 bit words.\n"); break; - case VIDEO_PALETTE_RGB555: + case V4L2_PIX_FMT_RGB555: printf("RGV555 packed into 16 bit words, top bit undefined.\n"); break; - case VIDEO_PALETTE_RGB24: + case V4L2_PIX_FMT_BGR24: printf("RGB888 packed into 24bit words.\n"); break; - case VIDEO_PALETTE_RGB32: + case V4L2_PIX_FMT_BGR32: printf("RGB888 packed into the low 3 bytes of 32bit words. The top 8bits are undefined.\n"); break; - case VIDEO_PALETTE_YUV422: + case V4L2_PIX_FMT_YUYV: printf("Video style YUV422 - 8bits packed 4bits Y 2bits U 2bits V\n"); break; - case VIDEO_PALETTE_YUYV: - printf("Describe me\n"); - break; - case VIDEO_PALETTE_UYVY: + case V4L2_PIX_FMT_UYVY: printf("Describe me\n"); break; - case VIDEO_PALETTE_YUV420: - printf("YUV420 capture\n"); - break; - case VIDEO_PALETTE_YUV411: + case V4L2_PIX_FMT_Y41P: printf("YUV411 capture\n"); break; - case VIDEO_PALETTE_RAW: - printf("RAW capture (BT848)\n"); - break; - case VIDEO_PALETTE_YUV422P: + case V4L2_PIX_FMT_YUV422P: printf("YUV 4:2:2 Planar\n"); break; - case VIDEO_PALETTE_YUV411P: + case V4L2_PIX_FMT_YUV411P: printf("YUV 4:1:1 Planar\n"); break; - case VIDEO_PALETTE_YUV420P: + case V4L2_PIX_FMT_YVU420: printf("YUV 4:2:0 Planar\n"); break; - case VIDEO_PALETTE_YUV410P: + case V4L2_PIX_FMT_YVU410: printf("YUV 4:1:0 Planar\n"); break; default: - printf("Unknown! (%d)\n", vpic.palette); + printf("Unknown! (%d - %c%c%c%c)\n", pixfmt.fmt.pix.pixelformat, pixfmt.fmt.pix.pixelformat & 0xff, (pixfmt.fmt.pix.pixelformat >> 8) & 0xff, (pixfmt.fmt.pix.pixelformat >> 16) & 0xff, (pixfmt.fmt.pix.pixelformat >> 24) & 0xff); } if (ioctl(fd, VIDIOCPWCGCQUAL, &dummy) == -1) @@ -285,26 +384,26 @@ void set_dimensions_and_framerate(int fd, int w, int h, int framerate) { - struct video_window vwin; + struct v4l2_format pixfmt; /* get resolution/framerate */ - if (ioctl(fd, VIDIOCGWIN, &vwin) == -1) - error_exit("VIDIOCGWIN"); + if (ioctl(fd, VIDIOC_G_FMT, &pixfmt) == -1) + error_exit("VIDIOC_G_FMT"); if (w > 0 && h > 0) { - vwin.width = w; - vwin.height = h; + pixfmt.fmt.pix.width = w; + pixfmt.fmt.pix.height = h; } - if (vwin.flags & PWC_FPS_FRMASK) + if (pixfmt.fmt.pix.priv & PWC_FPS_FRMASK) { /* set new framerate */ - vwin.flags &= ~PWC_FPS_FRMASK; - vwin.flags |= (framerate << PWC_FPS_SHIFT); + pixfmt.fmt.pix.priv &= ~PWC_FPS_FRMASK; + pixfmt.fmt.pix.priv |= (framerate << PWC_FPS_SHIFT); - if (ioctl(fd, VIDIOCSWIN, &vwin) == -1) - error_exit("VIDIOCSWIN"); + if (ioctl(fd, VIDIOC_S_FMT, &pixfmt) == -1) + error_exit("VIDIOC_S_FMT"); } else {