summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKoop Mast <kwm@FreeBSD.org>2010-01-16 20:49:04 +0000
committerKoop Mast <kwm@FreeBSD.org>2010-01-16 20:49:04 +0000
commite64511508d2549769f9b9e0fbe31cbf4e64cf877 (patch)
treed51fe6ebf0ed0b2d0883ba2104bc7de418854d09
parentvideo4bsd is a kernel module which provides the /dev/video_daemonX interface (diff)
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>
Notes
Notes: svn path=/head/; revision=247993
-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