68 lines
1.3 KiB
C++
68 lines
1.3 KiB
C++
#include "quickcam.h"
|
|
|
|
//linux specific
|
|
#include <sys/ioctl.h>
|
|
#include <linux/videodev.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
|
|
#define WIDTH 640
|
|
#define HEIGHT 480
|
|
|
|
Quickcam::Quickcam( char *device )
|
|
: Camera(WIDTH, HEIGHT),
|
|
bytes(WIDTH*HEIGHT*4)
|
|
{
|
|
fd = open(device, O_RDWR);
|
|
if (fd == -1) {
|
|
fprintf(stderr, "failed to open video device %s: %s\n", device, strerror(errno));
|
|
exit(1);
|
|
}
|
|
|
|
/*
|
|
struct video_capability cap;
|
|
if (ioctl(fd, VIDIOCGCAP, &cap) == -1) {
|
|
fprintf(stderr, "(querycap) %s\n", strerror(errno));
|
|
return EXIT_FAILURE;
|
|
}
|
|
*/
|
|
|
|
struct video_picture pict;
|
|
doOrDie(ioctl(fd, VIDIOCGPICT, &pict), "getpict");
|
|
|
|
pict.palette = VIDEO_PALETTE_RGB32;
|
|
doOrDie(ioctl(fd, VIDIOCSPICT, &pict), "setpict");
|
|
|
|
struct video_window win;
|
|
|
|
//get window info
|
|
doOrDie(ioctl(fd, VIDIOCGWIN, &win), "getwin");
|
|
|
|
win.width = WIDTH;
|
|
win.height = HEIGHT;
|
|
|
|
//set window info
|
|
doOrDie(ioctl(fd, VIDIOCSWIN, &win), "error setting window size");
|
|
|
|
}
|
|
|
|
Quickcam::~Quickcam( void )
|
|
{
|
|
close(fd);
|
|
}
|
|
|
|
void Quickcam::doOrDie(int retval, char *message)
|
|
{
|
|
if (retval == -1) {
|
|
fprintf(stderr, "%s: %s\n", message, strerror(errno));
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
void Quickcam::update( void )
|
|
{
|
|
int read_sz = read(fd, pixels->pixels, bytes);
|
|
doOrDie(read_sz, "read failure");
|
|
}
|