aboutsummaryrefslogtreecommitdiffstats
path: root/multimedia
diff options
context:
space:
mode:
authorkwm <kwm@FreeBSD.org>2010-01-17 04:49:04 +0800
committerkwm <kwm@FreeBSD.org>2010-01-17 04:49:04 +0800
commitbbea9c5bda0e248b07fb7bf87265312c46e6dca7 (patch)
tree5a5b7cc1947f7b000bdf46610911dbbba7e05ecc /multimedia
parente0b660a14b9a17d95514a243bf91dbb46ab3958a (diff)
downloadfreebsd-ports-gnome-bbea9c5bda0e248b07fb7bf87265312c46e6dca7.tar.gz
freebsd-ports-gnome-bbea9c5bda0e248b07fb7bf87265312c46e6dca7.tar.zst
freebsd-ports-gnome-bbea9c5bda0e248b07fb7bf87265312c46e6dca7.zip
An application that you can use to view the video stream of your webcam, alter
various settings of your webcam, take jpeg snapshots or output raw YUV420P data to stdout when motion is detected. Submitted by: Andrew Thompson <thompsa AT FreeBSD.org> Hans Petter Selasky <hselasky AT FreeBSD.org>
Diffstat (limited to 'multimedia')
-rw-r--r--multimedia/pwcview/Makefile41
-rw-r--r--multimedia/pwcview/distinfo3
-rw-r--r--multimedia/pwcview/files/patch-pwcview.c442
-rw-r--r--multimedia/pwcview/pkg-descr5
-rw-r--r--multimedia/pwcview/pkg-plist2
5 files changed, 493 insertions, 0 deletions
diff --git a/multimedia/pwcview/Makefile b/multimedia/pwcview/Makefile
new file mode 100644
index 000000000000..870158b2a344
--- /dev/null
+++ b/multimedia/pwcview/Makefile
@@ -0,0 +1,41 @@
+# New ports collection makefile for: pwcview
+# Date created: 13 January 2010
+# Whom: Andrew Thompson <thompsa@FreeBSD.org>
+#
+# $FreeBSD$
+#
+
+PORTNAME= pwcview
+PORTVERSION= 1.4.1
+CATEGORIES= multimedia
+MASTER_SITES= http://raaf.atspace.org/ \
+ http://www.bsd-geek.de/FreeBSD/distfiles/ \
+ ${MASTER_SITE_LOCAL}
+MASTER_SITE_SUBDIR= miwi
+
+MAINTAINER= hselasky@FreeBSD.org
+COMMENT= The Video4Linux PWC webcam viewer
+
+BUILD_DEPENDS= ${LOCALBASE}/include/linux/videodev.h:${PORTSDIR}/multimedia/v4l_compat
+LIB_DEPENDS= jpeg.10:${PORTSDIR}/graphics/jpeg \
+ v4l1.0:${PORTSDIR}/multimedia/libv4l
+
+CONFLICTS= pwcbsd-[0-9]*
+
+USE_SDL= sdl
+MAN1= pwcview.1
+
+WRKSRC= ${WRKDIR}/${PORTNAME}
+
+.include <bsd.port.pre.mk>
+
+post-patch:
+ @${REINPLACE_CMD} -e 's|-ljpeg|-ljpeg -lv4l1|g' \
+ -e 's|sdl-config|${SDL_CONFIG}|g' ${WRKSRC}/Makefile
+
+do-install:
+ ${INSTALL_PROGRAM} ${WRKSRC}/pwcview ${PREFIX}/bin
+ ${INSTALL_PROGRAM} ${WRKSRC}/pwcsnap ${PREFIX}/bin
+ ${INSTALL_MAN} ${WRKSRC}/${MAN1} ${PREFIX}/man/man1
+
+.include <bsd.port.post.mk>
diff --git a/multimedia/pwcview/distinfo b/multimedia/pwcview/distinfo
new file mode 100644
index 000000000000..52d72fa19e4e
--- /dev/null
+++ b/multimedia/pwcview/distinfo
@@ -0,0 +1,3 @@
+MD5 (pwcview-1.4.1.tar.gz) = a858da696f1d6ad70e16073310c8dfb8
+SHA256 (pwcview-1.4.1.tar.gz) = 91d05dd4f9fdfab315ea31e640f60081ae59069aaca221a2965dd3243a695802
+SIZE (pwcview-1.4.1.tar.gz) = 21263
diff --git a/multimedia/pwcview/files/patch-pwcview.c b/multimedia/pwcview/files/patch-pwcview.c
new file mode 100644
index 000000000000..19691c8f2e19
--- /dev/null
+++ b/multimedia/pwcview/files/patch-pwcview.c
@@ -0,0 +1,442 @@
+--- pwcview.c.orig 2010-01-14 18:40:49.000000000 +0100
++++ pwcview.c 2010-01-14 18:57:19.000000000 +0100
+@@ -37,11 +37,8 @@
+ #ifndef NOGUI
+ #include <SDL.h>
+ #endif
+-#ifdef __FreeBSD__
+-#include "videodev.h"
+-#else
++#include <libv4l1.h>
+ #include <linux/videodev.h>
+-#endif
+ #include "pwc-ioctl.h"
+ #include "pixels.h"
+
+@@ -80,7 +77,7 @@
+ int fps;
+ struct video_window vw;
+
+- if(ioctl(fd,VIDIOCGWIN,&vw) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCGWIN,&vw) == -1) {
+ perror("Failed to get current framerate");
+ return -1;
+ }
+@@ -90,9 +87,9 @@
+ if((dir == -1 && fps >= 9) ||(dir == 1 && fps <= 25)) {
+ fps += dir == -1 ? -5 : 5;
+ vw.flags = fps << PWC_FPS_SHIFT;
+- if(ioctl(fd,VIDIOCSWIN,&vw) == -1)
++ if(v4l1_ioctl(fd,VIDIOCSWIN,&vw) == -1)
+ fprintf(stderr,"Failed to set framerate to %d fps: %s\n",fps,strerror(errno));
+- if(ioctl(fd,VIDIOCGWIN,&vw) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCGWIN,&vw) == -1) {
+ perror("Failed to get new framerate");
+ return -1;
+ }
+@@ -106,16 +103,16 @@
+ {
+ int qual;
+
+- if(ioctl(fd,VIDIOCPWCGCQUAL,&qual) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGCQUAL,&qual) == -1) {
+ perror("Failed to get current compression");
+ return -1;
+ }
+
+ if((dir == -1 && qual > 0) || (dir == 1 && qual < 3)) {
+ qual += dir == -1 ? -1 : 1;
+- if(ioctl(fd,VIDIOCPWCSCQUAL,&qual) == -1)
++ if(v4l1_ioctl(fd,VIDIOCPWCSCQUAL,&qual) == -1)
+ perror("Failed to set compression");
+- if(ioctl(fd,VIDIOCPWCGCQUAL,&qual) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGCQUAL,&qual) == -1) {
+ perror("Failed to get new compression");
+ return -1;
+ }
+@@ -128,16 +125,16 @@
+ {
+ struct video_picture pict;
+
+- if(ioctl(fd,VIDIOCGPICT,&pict) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCGPICT,&pict) == -1) {
+ perror("Failed to get current brightness");
+ return -1;
+ }
+
+ if((dir == -1) || (dir == 1)) {
+ pict.brightness += dir == -1 ? -512 : 512;
+- if(ioctl(fd,VIDIOCSPICT,&pict) == -1)
++ if(v4l1_ioctl(fd,VIDIOCSPICT,&pict) == -1)
+ perror("Failed to set brightness");
+- if(ioctl(fd,VIDIOCGPICT,&pict) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCGPICT,&pict) == -1) {
+ perror("Failed to get new brightness");
+ return -1;
+ }
+@@ -150,16 +147,16 @@
+ {
+ struct video_picture pict;
+
+- if(ioctl(fd,VIDIOCGPICT,&pict) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCGPICT,&pict) == -1) {
+ perror("Failed to get current contrast");
+ return -1;
+ }
+
+ if((dir == -1) || (dir == 1)) {
+ pict.contrast += dir == -1 ? -1024 : 1024;
+- if(ioctl(fd,VIDIOCSPICT,&pict) == -1)
++ if(v4l1_ioctl(fd,VIDIOCSPICT,&pict) == -1)
+ perror("Failed to set contrast");
+- if(ioctl(fd,VIDIOCGPICT,&pict) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCGPICT,&pict) == -1) {
+ perror("Failed to get new contrast");
+ return -1;
+ }
+@@ -172,16 +169,16 @@
+ {
+ struct video_picture pict;
+
+- if(ioctl(fd,VIDIOCGPICT,&pict) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCGPICT,&pict) == -1) {
+ perror("Failed to get current saturation");
+ return -1;
+ }
+
+ if((dir == -1) || (dir == 1)) {
+ pict.colour += dir == -1 ? -327 : 327;
+- if(ioctl(fd,VIDIOCSPICT,&pict) == -1)
++ if(v4l1_ioctl(fd,VIDIOCSPICT,&pict) == -1)
+ perror("Failed to set saturation");
+- if(ioctl(fd,VIDIOCGPICT,&pict) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCGPICT,&pict) == -1) {
+ perror("Failed to get new saturation");
+ return -1;
+ }
+@@ -194,16 +191,16 @@
+ {
+ struct video_picture pict;
+
+- if(ioctl(fd,VIDIOCGPICT,&pict) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCGPICT,&pict) == -1) {
+ perror("Failed to get current gamma");
+ return -1;
+ }
+
+ if((dir == -1) ||(dir == 1)) {
+ pict.whiteness += dir == -1 ? -2048 : 2048;
+- if(ioctl(fd,VIDIOCSPICT,&pict) == -1)
++ if(v4l1_ioctl(fd,VIDIOCSPICT,&pict) == -1)
+ perror("Failed to set gamma");
+- if(ioctl(fd,VIDIOCGPICT,&pict) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCGPICT,&pict) == -1) {
+ perror("Failed to get new gamma");
+ return -1;
+ }
+@@ -236,7 +233,7 @@
+ snprintf(buf,80,"gain control: %d",agc >> 10);
+ }
+
+- ioctl(fd,VIDIOCPWCSAGC,&val);
++ v4l1_ioctl(fd,VIDIOCPWCSAGC,&val);
+ return 0;
+ }
+
+@@ -263,7 +260,7 @@
+ val = shutter;
+ snprintf(buf,80,"shutter speed: %d",shutter >> 8);
+ }
+- ioctl(fd,VIDIOCPWCSSHUTTER,&val);
++ v4l1_ioctl(fd,VIDIOCPWCSSHUTTER,&val);
+ return 0;
+ }
+
+@@ -274,7 +271,7 @@
+ char *names[] = { "indoor", "outdoor", "fluorescent","manual","auto" };
+ int *val = NULL;
+
+- if(ioctl(fd,VIDIOCPWCGAWB,&wb) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGAWB,&wb) == -1) {
+ perror("Failed to get white balance");
+ return -1;
+ }
+@@ -298,10 +295,10 @@
+ *val += 256;
+ }
+
+- if(ioctl(fd,VIDIOCPWCSAWB,&wb) == -1)
++ if(v4l1_ioctl(fd,VIDIOCPWCSAWB,&wb) == -1)
+ perror("Failed to set white balance");
+
+- if(ioctl(fd,VIDIOCPWCGAWB,&wb) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGAWB,&wb) == -1) {
+ perror("Failed to get white balance");
+ return -1;
+ }
+@@ -317,16 +314,16 @@
+ {
+ struct pwc_wb_speed speed;
+
+- if(ioctl(fd,VIDIOCPWCGAWBSPEED,&speed) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGAWBSPEED,&speed) == -1) {
+ perror("Failed to get current awb speed");
+ return -1;
+ }
+
+ if((dir == -1) || (dir == 1)) {
+ speed.control_speed += dir == -1 ? -2032 : 2032;
+- if(ioctl(fd,VIDIOCPWCSAWBSPEED,&speed) == -1)
++ if(v4l1_ioctl(fd,VIDIOCPWCSAWBSPEED,&speed) == -1)
+ perror("Failed to set awb speed");
+- if(ioctl(fd,VIDIOCPWCGAWBSPEED,&speed) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGAWBSPEED,&speed) == -1) {
+ perror("Failed to get new awb speed");
+ return -1;
+ }
+@@ -339,16 +336,16 @@
+ {
+ struct pwc_wb_speed speed;
+
+- if(ioctl(fd,VIDIOCPWCGAWBSPEED,&speed) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGAWBSPEED,&speed) == -1) {
+ perror("Failed to get current awb delay");
+ return -1;
+ }
+
+ if((dir == -1) || (dir == 1)) {
+ speed.control_delay += dir == -1 ? -1024 : 1024;
+- if(ioctl(fd,VIDIOCPWCSAWBSPEED,&speed) == -1)
++ if(v4l1_ioctl(fd,VIDIOCPWCSAWBSPEED,&speed) == -1)
+ perror("Failed to set awb delay");
+- if(ioctl(fd,VIDIOCPWCGAWBSPEED,&speed) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGAWBSPEED,&speed) == -1) {
+ perror("Failed to get new awb delay");
+ return -1;
+ }
+@@ -377,13 +374,13 @@
+ else
+ val = contour;
+
+- if(ioctl(fd,VIDIOCPWCSCONTOUR,&val) == -1)
++ if(v4l1_ioctl(fd,VIDIOCPWCSCONTOUR,&val) == -1)
+ perror("Failed to set contour");
+
+ if(contourmode == 1)
+ snprintf(buf,80,"contour: auto");
+ else {
+- if(ioctl(fd,VIDIOCPWCGCONTOUR,&contour) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGCONTOUR,&contour) == -1) {
+ perror("Failed to get contour");
+ return -1;
+ }
+@@ -396,17 +393,17 @@
+ {
+ int dynnoise;
+
+- if(ioctl(fd,VIDIOCPWCGDYNNOISE,&dynnoise) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGDYNNOISE,&dynnoise) == -1) {
+ perror("Failed to get current dynamic noise reduction mode");
+ return -1;
+ }
+ if(dir == 2) {
+ if(++dynnoise == 4)
+ dynnoise = 0;
+- if(ioctl(fd,VIDIOCPWCSDYNNOISE,&dynnoise) == -1)
++ if(v4l1_ioctl(fd,VIDIOCPWCSDYNNOISE,&dynnoise) == -1)
+ perror("Failed to set dynamic noise reduction mode");
+
+- if(ioctl(fd,VIDIOCPWCGDYNNOISE,&dynnoise) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGDYNNOISE,&dynnoise) == -1) {
+ perror("Failed to get new dynamic noise reduction mode");
+ return -1;
+ }
+@@ -419,16 +416,16 @@
+ {
+ int backlight;
+
+- if(ioctl(fd,VIDIOCPWCGBACKLIGHT,&backlight) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGBACKLIGHT,&backlight) == -1) {
+ perror("Failed to get backlight mode");
+ return -1;
+ }
+ if(dir == 2) {
+ backlight = !backlight;
+- if(ioctl(fd,VIDIOCPWCSBACKLIGHT,&backlight) == -1)
++ if(v4l1_ioctl(fd,VIDIOCPWCSBACKLIGHT,&backlight) == -1)
+ perror("Failed to set backlight mode");
+
+- if(ioctl(fd,VIDIOCPWCGBACKLIGHT,&backlight) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGBACKLIGHT,&backlight) == -1) {
+ perror("Failed to get new backlight mode");
+ return -1;
+ }
+@@ -441,16 +438,16 @@
+ {
+ int flicker;
+
+- if(ioctl(fd,VIDIOCPWCGFLICKER,&flicker) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGFLICKER,&flicker) == -1) {
+ perror("Failed to get flicker mode");
+ return -1;
+ }
+ if(dir == 2) {
+ flicker = !flicker;
+- if(ioctl(fd,VIDIOCPWCSFLICKER,&flicker) == -1)
++ if(v4l1_ioctl(fd,VIDIOCPWCSFLICKER,&flicker) == -1)
+ perror("Failed to set flicker mode");
+
+- if(ioctl(fd,VIDIOCPWCGFLICKER,&flicker) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGFLICKER,&flicker) == -1) {
+ perror("Failed to get new flicker mode");
+ return -1;
+ }
+@@ -463,16 +460,16 @@
+ {
+ int colour;
+
+- if(ioctl(fd,VIDIOCPWCGCOLOUR,&colour) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGCOLOUR,&colour) == -1) {
+ perror("Failed to get colour mode");
+ return -1;
+ }
+ if(dir == 2) {
+ colour = !colour;
+- if(ioctl(fd,VIDIOCPWCSCOLOUR,&colour) == -1)
++ if(v4l1_ioctl(fd,VIDIOCPWCSCOLOUR,&colour) == -1)
+ perror("Failed to set colour mode");
+
+- if(ioctl(fd,VIDIOCPWCGCOLOUR,&colour) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCPWCGCOLOUR,&colour) == -1) {
+ perror("Failed to get new colour mode");
+ return -1;
+ }
+@@ -487,7 +484,7 @@
+ snprintf(buf,80,"save user settings");
+ }
+ else if(dir == 2) {
+- if(ioctl(fd,VIDIOCPWCSUSER) == -1)
++ if(v4l1_ioctl(fd,VIDIOCPWCSUSER) == -1)
+ snprintf(buf,80,"Error: %s",strerror(errno));
+ else
+ snprintf(buf,80,"User settings saved");
+@@ -506,7 +503,7 @@
+ snprintf(buf,80,"restore user settings");
+ }
+ else if(dir == 2) {
+- if(ioctl(fd,VIDIOCPWCRUSER) == -1)
++ if(v4l1_ioctl(fd,VIDIOCPWCRUSER) == -1)
+ snprintf(buf,80,"Error: %s",strerror(errno));
+ else
+ snprintf(buf,80,"User settings restored");
+@@ -523,7 +520,7 @@
+ snprintf(buf,80,"restore factory settings");
+ }
+ else if(dir == 2) {
+- if(ioctl(fd,VIDIOCPWCFACTORY) == -1)
++ if(v4l1_ioctl(fd,VIDIOCPWCFACTORY) == -1)
+ snprintf(buf,80,"Error: %s",strerror(errno));
+ else
+ snprintf(buf,80,"Factory settings restored");
+@@ -537,12 +534,12 @@
+ struct pwc_leds led;
+ int ledon_handler(int fd, int dir, char *buf)
+ {
+- ioctl(fd,VIDIOCPWCGLED,&led);
++ v4l1_ioctl(fd,VIDIOCPWCGLED,&led);
+ if((dir == -1) || (dir == 1)) {
+ led.led_on += (dir == -1) ? -100 : 100;
+ if(led.led_on < 0)
+ led.led_on = 0;
+- if(ioctl(fd,VIDIOCPWCSLED,&led) == -1)
++ if(v4l1_ioctl(fd,VIDIOCPWCSLED,&led) == -1)
+ perror("Failed to set leds");
+ }
+ snprintf(buf,80,"led on: %d", led.led_on);
+@@ -551,12 +548,12 @@
+
+ int ledoff_handler(int fd, int dir, char *buf)
+ {
+- ioctl(fd,VIDIOCPWCGLED,&led);
++ v4l1_ioctl(fd,VIDIOCPWCGLED,&led);
+ if((dir == -1) || (dir == 1)) {
+ led.led_off += (dir == -1) ? -100 : 100;
+ if(led.led_off < 0)
+ led.led_off = 0;
+- if(ioctl(fd,VIDIOCPWCSLED,&led) == -1)
++ if(v4l1_ioctl(fd,VIDIOCPWCSLED,&led) == -1)
+ perror("Failed to set leds");
+ }
+ snprintf(buf,80,"led off: %d", led.led_off);
+@@ -837,6 +834,8 @@
+ jdata[1] = jimage[1];
+ jdata[2] = jimage[2];
+
++ cinfo->raw_data_in = TRUE;
++ cinfo->do_fancy_downsampling = FALSE;
+ jpeg_stdio_dest(cinfo, outfile);
+ jpeg_start_compress(cinfo, TRUE);
+
+@@ -1218,7 +1217,7 @@
+ vw.flags = fps << PWC_FPS_SHIFT;
+ imgsize = (vw.width * vw.height * 3)/2;
+
+- if((fd = open(device, O_RDONLY)) < 0) {
++ if((fd = v4l1_open(device, O_RDONLY)) < 0) {
+ if(errno == EBUSY)
+ fprintf(stderr,"Failed to access webcam: Device in use\n");
+ else {
+@@ -1236,17 +1235,17 @@
+ }
+ fcntl(fd,F_SETFD,FD_CLOEXEC);
+
+- if(ioctl(fd,VIDIOCGPICT,&vp) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCGPICT,&vp) == -1) {
+ perror("Failed to get current picture info");
+ exit(1);
+ }
+ vp.palette = VIDEO_PALETTE_YUV420P;
+- if(ioctl(fd,VIDIOCSPICT,&vp) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCSPICT,&vp) == -1) {
+ perror("Failed to set palette to YUV420P");
+ exit(1);
+ }
+
+- if(ioctl(fd,VIDIOCSWIN,&vw) == -1) {
++ if(v4l1_ioctl(fd,VIDIOCSWIN,&vw) == -1) {
+ fprintf(stderr,"Failed to set webcam to: %dx%d (%s) at %d fps (%s)\n",
+ vw.width,vw.height,sizes[i].name,fps,strerror(errno));
+ exit(1);
+@@ -1254,12 +1253,12 @@
+ fprintf(stderr,"Webcam set to: %dx%d (%s) at %d fps\n",vw.width,vw.height,sizes[i].name,fps);
+
+ if(headless && snapcnt == 0 && motionrecord == 0) { /* Done */
+- close(fd);
++ v4l1_close(fd);
+ exit(0);
+ }
+ if(snapbtn) {
+ snapbtn = 0;
+- if(ioctl(fd,VIDIOCPWCPROBE,&probe) != -1 &&
++ if(v4l1_ioctl(fd,VIDIOCPWCPROBE,&probe) != -1 &&
+ probe.type >= 720 && probe.type <= 740)
+ snapbtn = 1;
+ }
+@@ -1327,7 +1326,7 @@
+ timerid = SDL_AddTimer(interval,cbtimer,NULL);
+ }
+ #endif
+- while (frozen || ((size = read(fd,y,imgsize)) > 0) || (size == -1 && errno == EINTR)) {
++ while (frozen || ((size = v4l1_read(fd,y,imgsize)) > 0) || (size == -1 && errno == EINTR)) {
+ int snap = y[0] & 0x01;
+ if(!frozen && size != imgsize) {
+ if(size != -1) {
+@@ -1498,7 +1497,7 @@
+ if(size != 0)
+ perror("Error reading from webcam");
+
+- close(fd);
++ v4l1_close(fd);
+ jpeg_destroy_compress(&cinfo);
+ return 0;
+ }
diff --git a/multimedia/pwcview/pkg-descr b/multimedia/pwcview/pkg-descr
new file mode 100644
index 000000000000..fdc99c4aaf77
--- /dev/null
+++ b/multimedia/pwcview/pkg-descr
@@ -0,0 +1,5 @@
+An application that you can use to view the video stream of your webcam, alter
+various settings of your webcam, take jpeg snapshots or output raw YUV420P data
+to stdout when motion is detected.
+
+WWW: http://raaf.atspace.org/
diff --git a/multimedia/pwcview/pkg-plist b/multimedia/pwcview/pkg-plist
new file mode 100644
index 000000000000..b89edf6318f9
--- /dev/null
+++ b/multimedia/pwcview/pkg-plist
@@ -0,0 +1,2 @@
+bin/pwcview
+bin/pwcsnap