Permalink
Browse files

Changed to more convenient formatting.

  • Loading branch information...
1 parent a8d7450 commit dc6b9cd679d3b420fd0dfc9e1ebbb93931834e98 @csete committed Sep 18, 2010
Showing with 813 additions and 833 deletions.
  1. +334 −339 uvccapture.c
  2. +456 −470 v4l2uvc.c
  3. +23 −24 v4l2uvc.h
View
673 uvccapture.c
@@ -38,368 +38,363 @@
static const char version[] = VERSION;
int run = 1;
-void
-sigcatch (int sig)
+void sigcatch (int sig)
{
- fprintf (stderr, "Exiting...\n");
- run = 0;
+ fprintf (stderr, "Exiting...\n");
+ run = 0;
}
-void
-usage (void)
+void usage (void)
{
- fprintf (stderr, "uvccapture version %s\n", version);
- fprintf (stderr, "Usage is: uvccapture [options]\n");
- fprintf (stderr, "Options:\n");
- fprintf (stderr, "-v\t\tVerbose\n");
- fprintf (stderr, "-o<filename>\tOutput filename(default: snap.jpg)\n");
- fprintf (stderr, "-d<device>\tV4L2 Device(default: /dev/video0)\n");
- fprintf (stderr,
- "-x<width>\tImage Width(must be supported by device)(>960 activates YUYV capture)\n");
- fprintf (stderr,
- "-y<height>\tImage Height(must be supported by device)(>720 activates YUYV capture)\n");
- fprintf (stderr,
- "-c<command>\tCommand to run after each image capture(executed as <command> <output_filename>)\n");
- fprintf (stderr,
- "-t<integer>\tTake continuous shots with <integer> seconds between them (0 for single shot)\n");
- fprintf (stderr,
- "-q<percentage>\tJPEG Quality Compression Level (activates YUYV capture)\n");
- fprintf (stderr, "-r\t\tUse read instead of mmap for image capture\n");
- fprintf (stderr,
- "-w\t\tWait for capture command to finish before starting next capture\n");
- fprintf (stderr, "-m\t\tToggles capture mode to YUYV capture\n");
- fprintf (stderr, "Camera Settings:\n");
- fprintf (stderr, "-B<integer>\tBrightness\n");
- fprintf (stderr, "-C<integer>\tContrast\n");
- fprintf (stderr, "-S<integer>\tSaturation\n");
- fprintf (stderr, "-G<integer>\tGain\n");
- exit (8);
+ fprintf (stderr, "uvccapture version %s\n", version);
+ fprintf (stderr, "Usage is: uvccapture [options]\n");
+ fprintf (stderr, "Options:\n");
+ fprintf (stderr, "-v\t\tVerbose\n");
+ fprintf (stderr, "-o<filename>\tOutput filename(default: snap.jpg)\n");
+ fprintf (stderr, "-d<device>\tV4L2 Device(default: /dev/video0)\n");
+ fprintf (stderr,
+ "-x<width>\tImage Width(must be supported by device)(>960 activates YUYV capture)\n");
+ fprintf (stderr,
+ "-y<height>\tImage Height(must be supported by device)(>720 activates YUYV capture)\n");
+ fprintf (stderr,
+ "-c<command>\tCommand to run after each image capture(executed as <command> <output_filename>)\n");
+ fprintf (stderr,
+ "-t<integer>\tTake continuous shots with <integer> seconds between them (0 for single shot)\n");
+ fprintf (stderr,
+ "-q<percentage>\tJPEG Quality Compression Level (activates YUYV capture)\n");
+ fprintf (stderr, "-r\t\tUse read instead of mmap for image capture\n");
+ fprintf (stderr,
+ "-w\t\tWait for capture command to finish before starting next capture\n");
+ fprintf (stderr, "-m\t\tToggles capture mode to YUYV capture\n");
+ fprintf (stderr, "Camera Settings:\n");
+ fprintf (stderr, "-B<integer>\tBrightness\n");
+ fprintf (stderr, "-C<integer>\tContrast\n");
+ fprintf (stderr, "-S<integer>\tSaturation\n");
+ fprintf (stderr, "-G<integer>\tGain\n");
+ exit (8);
}
-int
-spawn (char *argv[], int wait, int verbose)
+int spawn (char *argv[], int wait, int verbose)
{
- pid_t pid;
- int rv;
-
- switch (pid = fork ()) {
- case -1:
- return -1;
- case 0:
- // CHILD
- execvp (argv[0], argv);
- fprintf (stderr, "Error executing command '%s'\n", argv[0]);
- exit (1);
- default:
- // PARENT
- if (wait == 1) {
- if (verbose >= 1)
- fprintf (stderr, "Waiting for command to finish...");
- waitpid (pid, &rv, 0);
- if (verbose >= 1)
- fprintf (stderr, "\n");
- } else {
- // Clean zombies
- waitpid (-1, &rv, WNOHANG);
- rv = 0;
+ pid_t pid;
+ int rv;
+
+ switch (pid = fork ()) {
+ case -1:
+ return -1;
+ case 0:
+ // CHILD
+ execvp (argv[0], argv);
+ fprintf (stderr, "Error executing command '%s'\n", argv[0]);
+ exit (1);
+ default:
+ // PARENT
+ if (wait == 1) {
+ if (verbose >= 1)
+ fprintf (stderr, "Waiting for command to finish...");
+ waitpid (pid, &rv, 0);
+ if (verbose >= 1)
+ fprintf (stderr, "\n");
+ } else {
+ // Clean zombies
+ waitpid (-1, &rv, WNOHANG);
+ rv = 0;
+ }
+ break;
}
- break;
- }
- return rv;
+ return rv;
}
-int
-compress_yuyv_to_jpeg (struct vdIn *vd, FILE * file, int quality)
+int compress_yuyv_to_jpeg (struct vdIn *vd, FILE * file, int quality)
{
- struct jpeg_compress_struct cinfo;
- struct jpeg_error_mgr jerr;
- JSAMPROW row_pointer[1];
- unsigned char *line_buffer, *yuyv;
- int z;
-
- printf (stderr, "Compressing YUYV frame to JPEG image.\n");
-
- line_buffer = calloc (vd->width * 3, 1);
- yuyv = vd->framebuffer;
-
- cinfo.err = jpeg_std_error (&jerr);
- jpeg_create_compress (&cinfo);
- jpeg_stdio_dest (&cinfo, file);
-
- cinfo.image_width = vd->width;
- cinfo.image_height = vd->height;
- cinfo.input_components = 3;
- cinfo.in_color_space = JCS_RGB;
-
- jpeg_set_defaults (&cinfo);
- jpeg_set_quality (&cinfo, quality, TRUE);
-
- jpeg_start_compress (&cinfo, TRUE);
-
- z = 0;
- while (cinfo.next_scanline < cinfo.image_height) {
- int x;
- unsigned char *ptr = line_buffer;
-
- for (x = 0; x < vd->width; x++) {
- int r, g, b;
- int y, u, v;
-
- if (!z)
- y = yuyv[0] << 8;
- else
- y = yuyv[2] << 8;
- u = yuyv[1] - 128;
- v = yuyv[3] - 128;
-
- r = (y + (359 * v)) >> 8;
- g = (y - (88 * u) - (183 * v)) >> 8;
- b = (y + (454 * u)) >> 8;
-
- *(ptr++) = (r > 255) ? 255 : ((r < 0) ? 0 : r);
- *(ptr++) = (g > 255) ? 255 : ((g < 0) ? 0 : g);
- *(ptr++) = (b > 255) ? 255 : ((b < 0) ? 0 : b);
-
- if (z++) {
- z = 0;
- yuyv += 4;
- }
+ struct jpeg_compress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+ JSAMPROW row_pointer[1];
+ unsigned char *line_buffer, *yuyv;
+ int z;
+
+ printf (stderr, "Compressing YUYV frame to JPEG image.\n");
+
+ line_buffer = calloc (vd->width * 3, 1);
+ yuyv = vd->framebuffer;
+
+ cinfo.err = jpeg_std_error (&jerr);
+ jpeg_create_compress (&cinfo);
+ jpeg_stdio_dest (&cinfo, file);
+
+ cinfo.image_width = vd->width;
+ cinfo.image_height = vd->height;
+ cinfo.input_components = 3;
+ cinfo.in_color_space = JCS_RGB;
+
+ jpeg_set_defaults (&cinfo);
+ jpeg_set_quality (&cinfo, quality, TRUE);
+
+ jpeg_start_compress (&cinfo, TRUE);
+
+ z = 0;
+ while (cinfo.next_scanline < cinfo.image_height) {
+ int x;
+ unsigned char *ptr = line_buffer;
+
+ for (x = 0; x < vd->width; x++) {
+ int r, g, b;
+ int y, u, v;
+
+ if (!z)
+ y = yuyv[0] << 8;
+ else
+ y = yuyv[2] << 8;
+ u = yuyv[1] - 128;
+ v = yuyv[3] - 128;
+
+ r = (y + (359 * v)) >> 8;
+ g = (y - (88 * u) - (183 * v)) >> 8;
+ b = (y + (454 * u)) >> 8;
+
+ *(ptr++) = (r > 255) ? 255 : ((r < 0) ? 0 : r);
+ *(ptr++) = (g > 255) ? 255 : ((g < 0) ? 0 : g);
+ *(ptr++) = (b > 255) ? 255 : ((b < 0) ? 0 : b);
+
+ if (z++) {
+ z = 0;
+ yuyv += 4;
+ }
+ }
+
+ row_pointer[0] = line_buffer;
+ jpeg_write_scanlines (&cinfo, row_pointer, 1);
}
- row_pointer[0] = line_buffer;
- jpeg_write_scanlines (&cinfo, row_pointer, 1);
- }
-
- jpeg_finish_compress (&cinfo);
- jpeg_destroy_compress (&cinfo);
+ jpeg_finish_compress (&cinfo);
+ jpeg_destroy_compress (&cinfo);
- free (line_buffer);
+ free (line_buffer);
- return (0);
+ return (0);
}
-int
-main (int argc, char *argv[])
+int main (int argc, char *argv[])
{
- char *videodevice = "/dev/video0";
- char *outputfile = "snap.jpg";
- char *post_capture_command[3];
- int format = V4L2_PIX_FMT_MJPEG;
- int grabmethod = 1;
- int width = 320;
- int height = 240;
- int brightness = 0, contrast = 0, saturation = 0, gain = 0;
- int verbose = 0;
- int delay = 0;
- int quality = 95;
- int post_capture_command_wait = 0;
- time_t ref_time;
- struct vdIn *videoIn;
- FILE *file;
-
- (void) signal (SIGINT, sigcatch);
- (void) signal (SIGQUIT, sigcatch);
- (void) signal (SIGKILL, sigcatch);
- (void) signal (SIGTERM, sigcatch);
- (void) signal (SIGABRT, sigcatch);
- (void) signal (SIGTRAP, sigcatch);
-
- // set post_capture_command to default values
- post_capture_command[0] = NULL;
- post_capture_command[1] = NULL;
- post_capture_command[2] = NULL;
-
- //Options Parsing (FIXME)
- while ((argc > 1) && (argv[1][0] == '-')) {
- switch (argv[1][1]) {
- case 'v':
- verbose++;
- break;
-
- case 'o':
- outputfile = &argv[1][2];
- break;
-
- case 'd':
- videodevice = &argv[1][2];
- break;
-
- case 'x':
- width = atoi (&argv[1][2]);
- break;
-
- case 'y':
- height = atoi (&argv[1][2]);
- break;
-
- case 'r':
- grabmethod = 0;
- break;
-
- case 'm':
- format = V4L2_PIX_FMT_YUYV;
- break;
-
- case 't':
- delay = atoi (&argv[1][2]);
- break;
-
- case 'c':
- post_capture_command[0] = &argv[1][2];
- break;
-
- case 'w':
- post_capture_command_wait = 1;
- break;
-
- case 'B':
- brightness = atoi (&argv[1][2]);
- break;
-
- case 'C':
- contrast = atoi (&argv[1][2]);
- break;
-
- case 'S':
- saturation = atoi (&argv[1][2]);
- break;
-
- case 'G':
- gain = atoi (&argv[1][2]);
- break;
-
- case 'q':
- quality = atoi (&argv[1][2]);
- break;
-
- case 'h':
- usage ();
- break;
-
- default:
- fprintf (stderr, "Unknown option %s \n", argv[1]);
- usage ();
+ char *videodevice = "/dev/video0";
+ char *outputfile = "snap.jpg";
+ char *post_capture_command[3];
+ int format = V4L2_PIX_FMT_MJPEG;
+ int grabmethod = 1;
+ int width = 320;
+ int height = 240;
+ int brightness = 0, contrast = 0, saturation = 0, gain = 0;
+ int verbose = 0;
+ int delay = 0;
+ int quality = 95;
+ int post_capture_command_wait = 0;
+ time_t ref_time;
+ struct vdIn *videoIn;
+ FILE *file;
+
+ (void) signal (SIGINT, sigcatch);
+ (void) signal (SIGQUIT, sigcatch);
+ (void) signal (SIGKILL, sigcatch);
+ (void) signal (SIGTERM, sigcatch);
+ (void) signal (SIGABRT, sigcatch);
+ (void) signal (SIGTRAP, sigcatch);
+
+ // set post_capture_command to default values
+ post_capture_command[0] = NULL;
+ post_capture_command[1] = NULL;
+ post_capture_command[2] = NULL;
+
+ //Options Parsing (FIXME)
+ while ((argc > 1) && (argv[1][0] == '-')) {
+ switch (argv[1][1]) {
+ case 'v':
+ verbose++;
+ break;
+
+ case 'o':
+ outputfile = &argv[1][2];
+ break;
+
+ case 'd':
+ videodevice = &argv[1][2];
+ break;
+
+ case 'x':
+ width = atoi (&argv[1][2]);
+ break;
+
+ case 'y':
+ height = atoi (&argv[1][2]);
+ break;
+
+ case 'r':
+ grabmethod = 0;
+ break;
+
+ case 'm':
+ format = V4L2_PIX_FMT_YUYV;
+ break;
+
+ case 't':
+ delay = atoi (&argv[1][2]);
+ break;
+
+ case 'c':
+ post_capture_command[0] = &argv[1][2];
+ break;
+
+ case 'w':
+ post_capture_command_wait = 1;
+ break;
+
+ case 'B':
+ brightness = atoi (&argv[1][2]);
+ break;
+
+ case 'C':
+ contrast = atoi (&argv[1][2]);
+ break;
+
+ case 'S':
+ saturation = atoi (&argv[1][2]);
+ break;
+
+ case 'G':
+ gain = atoi (&argv[1][2]);
+ break;
+
+ case 'q':
+ quality = atoi (&argv[1][2]);
+ break;
+
+ case 'h':
+ usage ();
+ break;
+
+ default:
+ fprintf (stderr, "Unknown option %s \n", argv[1]);
+ usage ();
+ }
+ ++argv;
+ --argc;
}
- ++argv;
- --argc;
- }
-
-
- /* user requrested quality activates YUYV mode */
- if (quality != 95)
- format = V4L2_PIX_FMT_YUYV;
-
- if (post_capture_command[0])
- post_capture_command[1] = outputfile;
-
- if (verbose >= 1) {
- fprintf (stderr, "Using videodevice: %s\n", videodevice);
- fprintf (stderr, "Saving images to: %s\n", outputfile);
- fprintf (stderr, "Image size: %dx%d\n", width, height);
- fprintf (stderr, "Taking snapshot every %d seconds\n", delay);
- if (grabmethod == 1)
- fprintf (stderr, "Taking images using mmap\n");
- else
- fprintf (stderr, "Taking images using read\n");
+
+
+ /* user requrested quality activates YUYV mode */
+ if (quality != 95)
+ format = V4L2_PIX_FMT_YUYV;
+
if (post_capture_command[0])
- fprintf (stderr, "Executing '%s' after each image capture\n",
- post_capture_command[0]);
- }
- videoIn = (struct vdIn *) calloc (1, sizeof (struct vdIn));
- if (init_videoIn
- (videoIn, (char *) videodevice, width, height, format, grabmethod) < 0)
- exit (1);
-
- //Reset all camera controls
- if (verbose >= 1)
- fprintf (stderr, "Resetting camera settings\n");
- v4l2ResetControl (videoIn, V4L2_CID_BRIGHTNESS);
- v4l2ResetControl (videoIn, V4L2_CID_CONTRAST);
- v4l2ResetControl (videoIn, V4L2_CID_SATURATION);
- v4l2ResetControl (videoIn, V4L2_CID_GAIN);
-
- //Setup Camera Parameters
- if (brightness != 0) {
- if (verbose >= 1)
- fprintf (stderr, "Setting camera brightness to %d\n", brightness);
- v4l2SetControl (videoIn, V4L2_CID_BRIGHTNESS, brightness);
- } else if (verbose >= 1) {
- fprintf (stderr, "Camera brightness level is %d\n",
- v4l2GetControl (videoIn, V4L2_CID_BRIGHTNESS));
- }
- if (contrast != 0) {
- if (verbose >= 1)
- fprintf (stderr, "Setting camera contrast to %d\n", contrast);
- v4l2SetControl (videoIn, V4L2_CID_CONTRAST, contrast);
- } else if (verbose >= 1) {
- fprintf (stderr, "Camera contrast level is %d\n",
- v4l2GetControl (videoIn, V4L2_CID_CONTRAST));
- }
- if (saturation != 0) {
- if (verbose >= 1)
- fprintf (stderr, "Setting camera saturation to %d\n", saturation);
- v4l2SetControl (videoIn, V4L2_CID_SATURATION, saturation);
- } else if (verbose >= 1) {
- fprintf (stderr, "Camera saturation level is %d\n",
- v4l2GetControl (videoIn, V4L2_CID_SATURATION));
- }
- if (gain != 0) {
- if (verbose >= 1)
- fprintf (stderr, "Setting camera gain to %d\n", gain);
- v4l2SetControl (videoIn, V4L2_CID_GAIN, gain);
- } else if (verbose >= 1) {
- fprintf (stderr, "Camera gain level is %d\n",
- v4l2GetControl (videoIn, V4L2_CID_GAIN));
- }
- ref_time = time (NULL);
-
- while (run) {
- if (verbose >= 2)
- fprintf (stderr, "Grabbing frame\n");
- if (uvcGrab (videoIn) < 0) {
- fprintf (stderr, "Error grabbing\n");
- close_v4l2 (videoIn);
- free (videoIn);
- exit (1);
+ post_capture_command[1] = outputfile;
+
+ if (verbose >= 1) {
+ fprintf (stderr, "Using videodevice: %s\n", videodevice);
+ fprintf (stderr, "Saving images to: %s\n", outputfile);
+ fprintf (stderr, "Image size: %dx%d\n", width, height);
+ fprintf (stderr, "Taking snapshot every %d seconds\n", delay);
+ if (grabmethod == 1)
+ fprintf (stderr, "Taking images using mmap\n");
+ else
+ fprintf (stderr, "Taking images using read\n");
+ if (post_capture_command[0])
+ fprintf (stderr, "Executing '%s' after each image capture\n",
+ post_capture_command[0]);
}
+ videoIn = (struct vdIn *) calloc (1, sizeof (struct vdIn));
+ if (init_videoIn
+ (videoIn, (char *) videodevice, width, height, format, grabmethod) < 0)
+ exit (1);
- if ((difftime (time (NULL), ref_time) > delay) || delay == 0) {
- if (verbose >= 1)
- fprintf (stderr, "Saving image to: %s\n", outputfile);
- file = fopen (outputfile, "wb");
- if (file != NULL) {
- switch (videoIn->formatIn) {
- case V4L2_PIX_FMT_YUYV:
- compress_yuyv_to_jpeg (videoIn, file, quality);
- break;
- default:
- fwrite (videoIn->tmpbuffer, videoIn->buf.bytesused + DHT_SIZE, 1,
- file);
- break;
- }
- fclose (file);
- videoIn->getPict = 0;
- }
- if (post_capture_command[0]) {
- if (verbose >= 1)
- fprintf (stderr, "Executing '%s %s'\n", post_capture_command[0],
- post_capture_command[1]);
- if (spawn (post_capture_command, post_capture_command_wait, verbose)) {
- fprintf (stderr, "Command exited with error\n");
- close_v4l2 (videoIn);
- free (videoIn);
- exit (1);
- }
- }
-
- ref_time = time (NULL);
+ //Reset all camera controls
+ if (verbose >= 1)
+ fprintf (stderr, "Resetting camera settings\n");
+ v4l2ResetControl (videoIn, V4L2_CID_BRIGHTNESS);
+ v4l2ResetControl (videoIn, V4L2_CID_CONTRAST);
+ v4l2ResetControl (videoIn, V4L2_CID_SATURATION);
+ v4l2ResetControl (videoIn, V4L2_CID_GAIN);
+
+ //Setup Camera Parameters
+ if (brightness != 0) {
+ if (verbose >= 1)
+ fprintf (stderr, "Setting camera brightness to %d\n", brightness);
+ v4l2SetControl (videoIn, V4L2_CID_BRIGHTNESS, brightness);
+ } else if (verbose >= 1) {
+ fprintf (stderr, "Camera brightness level is %d\n",
+ v4l2GetControl (videoIn, V4L2_CID_BRIGHTNESS));
+ }
+ if (contrast != 0) {
+ if (verbose >= 1)
+ fprintf (stderr, "Setting camera contrast to %d\n", contrast);
+ v4l2SetControl (videoIn, V4L2_CID_CONTRAST, contrast);
+ } else if (verbose >= 1) {
+ fprintf (stderr, "Camera contrast level is %d\n",
+ v4l2GetControl (videoIn, V4L2_CID_CONTRAST));
+ }
+ if (saturation != 0) {
+ if (verbose >= 1)
+ fprintf (stderr, "Setting camera saturation to %d\n", saturation);
+ v4l2SetControl (videoIn, V4L2_CID_SATURATION, saturation);
+ } else if (verbose >= 1) {
+ fprintf (stderr, "Camera saturation level is %d\n",
+ v4l2GetControl (videoIn, V4L2_CID_SATURATION));
+ }
+ if (gain != 0) {
+ if (verbose >= 1)
+ fprintf (stderr, "Setting camera gain to %d\n", gain);
+ v4l2SetControl (videoIn, V4L2_CID_GAIN, gain);
+ } else if (verbose >= 1) {
+ fprintf (stderr, "Camera gain level is %d\n",
+ v4l2GetControl (videoIn, V4L2_CID_GAIN));
+ }
+ ref_time = time (NULL);
+
+ while (run) {
+ if (verbose >= 2)
+ fprintf (stderr, "Grabbing frame\n");
+ if (uvcGrab (videoIn) < 0) {
+ fprintf (stderr, "Error grabbing\n");
+ close_v4l2 (videoIn);
+ free (videoIn);
+ exit (1);
+ }
+
+ if ((difftime (time (NULL), ref_time) > delay) || delay == 0) {
+ if (verbose >= 1)
+ fprintf (stderr, "Saving image to: %s\n", outputfile);
+ file = fopen (outputfile, "wb");
+ if (file != NULL) {
+ switch (videoIn->formatIn) {
+ case V4L2_PIX_FMT_YUYV:
+ compress_yuyv_to_jpeg (videoIn, file, quality);
+ break;
+ default:
+ fwrite (videoIn->tmpbuffer, videoIn->buf.bytesused + DHT_SIZE, 1,
+ file);
+ break;
+ }
+ fclose (file);
+ videoIn->getPict = 0;
+ }
+ if (post_capture_command[0]) {
+ if (verbose >= 1)
+ fprintf (stderr, "Executing '%s %s'\n", post_capture_command[0],
+ post_capture_command[1]);
+ if (spawn (post_capture_command, post_capture_command_wait, verbose)) {
+ fprintf (stderr, "Command exited with error\n");
+ close_v4l2 (videoIn);
+ free (videoIn);
+ exit (1);
+ }
+ }
+
+ ref_time = time (NULL);
+ }
+ if (delay == 0)
+ break;
}
- if (delay == 0)
- break;
- }
- close_v4l2 (videoIn);
- free (videoIn);
+ close_v4l2 (videoIn);
+ free (videoIn);
- return 0;
+ return 0;
}
View
926 v4l2uvc.c
@@ -36,556 +36,542 @@
static int debug = 0;
static unsigned char dht_data[DHT_SIZE] = {
- 0xff, 0xc4, 0x01, 0xa2, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02,
- 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01, 0x00, 0x03,
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
- 0x0a, 0x0b, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05,
- 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04,
- 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22,
- 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15,
- 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17,
- 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36,
- 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
- 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66,
- 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
- 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95,
- 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8,
- 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2,
- 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5,
- 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
- 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
- 0xfa, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05,
- 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04,
- 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22,
- 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33,
- 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25,
- 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36,
- 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
- 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66,
- 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
- 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94,
- 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
- 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba,
- 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
- 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
- 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa
+ 0xff, 0xc4, 0x01, 0xa2, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02,
+ 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01, 0x00, 0x03,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
+ 0x0a, 0x0b, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05,
+ 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04,
+ 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22,
+ 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15,
+ 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36,
+ 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
+ 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66,
+ 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
+ 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95,
+ 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8,
+ 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2,
+ 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5,
+ 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+ 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
+ 0xfa, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05,
+ 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04,
+ 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22,
+ 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33,
+ 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25,
+ 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36,
+ 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
+ 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66,
+ 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
+ 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94,
+ 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba,
+ 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
+ 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+ 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa
};
static int init_v4l2 (struct vdIn *vd);
-int
-init_videoIn (struct vdIn *vd, char *device, int width, int height,
- int format, int grabmethod)
+int init_videoIn (struct vdIn *vd, char *device, int width, int height,
+ int format, int grabmethod)
{
- if (vd == NULL || device == NULL)
- return -1;
- if (width == 0 || height == 0)
+ if (vd == NULL || device == NULL)
+ return -1;
+ if (width == 0 || height == 0)
+ return -1;
+ if (grabmethod < 0 || grabmethod > 1)
+ grabmethod = 1; //mmap by default;
+ vd->videodevice = NULL;
+ vd->status = NULL;
+ vd->pictName = NULL;
+ vd->videodevice = (char *) calloc (1, 16 * sizeof (char));
+ vd->status = (char *) calloc (1, 100 * sizeof (char));
+ vd->pictName = (char *) calloc (1, 80 * sizeof (char));
+ snprintf (vd->videodevice, 12, "%s", device);
+ vd->toggleAvi = 0;
+ vd->getPict = 0;
+ vd->signalquit = 1;
+ vd->width = width;
+ vd->height = height;
+ vd->formatIn = format;
+ vd->grabmethod = grabmethod;
+ if (init_v4l2 (vd) < 0) {
+ fprintf (stderr, " Init v4L2 failed !! exit fatal \n");
+ goto error;;
+ }
+ /* alloc a temp buffer to reconstruct the pict */
+ vd->framesizeIn = (vd->width * vd->height << 1);
+ switch (vd->formatIn) {
+ case V4L2_PIX_FMT_MJPEG:
+ vd->tmpbuffer = (unsigned char *) calloc (1, (size_t) vd->framesizeIn);
+ if (!vd->tmpbuffer)
+ goto error;
+ vd->framebuffer =
+ (unsigned char *) calloc (1, (size_t) vd->width * (vd->height + 8) * 2);
+ break;
+ case V4L2_PIX_FMT_YUYV:
+ vd->framebuffer = (unsigned char *) calloc (1, (size_t) vd->framesizeIn);
+ break;
+ default:
+ fprintf (stderr, " should never arrive exit fatal !!\n");
+ goto error;
+ break;
+ }
+ if (!vd->framebuffer)
+ goto error;
+ return 0;
+ error:
+ free (vd->videodevice);
+ free (vd->status);
+ free (vd->pictName);
+ close (vd->fd);
return -1;
- if (grabmethod < 0 || grabmethod > 1)
- grabmethod = 1; //mmap by default;
- vd->videodevice = NULL;
- vd->status = NULL;
- vd->pictName = NULL;
- vd->videodevice = (char *) calloc (1, 16 * sizeof (char));
- vd->status = (char *) calloc (1, 100 * sizeof (char));
- vd->pictName = (char *) calloc (1, 80 * sizeof (char));
- snprintf (vd->videodevice, 12, "%s", device);
- vd->toggleAvi = 0;
- vd->getPict = 0;
- vd->signalquit = 1;
- vd->width = width;
- vd->height = height;
- vd->formatIn = format;
- vd->grabmethod = grabmethod;
- if (init_v4l2 (vd) < 0) {
- fprintf (stderr, " Init v4L2 failed !! exit fatal \n");
- goto error;;
- }
- /* alloc a temp buffer to reconstruct the pict */
- vd->framesizeIn = (vd->width * vd->height << 1);
- switch (vd->formatIn) {
- case V4L2_PIX_FMT_MJPEG:
- vd->tmpbuffer = (unsigned char *) calloc (1, (size_t) vd->framesizeIn);
- if (!vd->tmpbuffer)
- goto error;
- vd->framebuffer =
- (unsigned char *) calloc (1, (size_t) vd->width * (vd->height + 8) * 2);
- break;
- case V4L2_PIX_FMT_YUYV:
- vd->framebuffer = (unsigned char *) calloc (1, (size_t) vd->framesizeIn);
- break;
- default:
- fprintf (stderr, " should never arrive exit fatal !!\n");
- goto error;
- break;
- }
- if (!vd->framebuffer)
- goto error;
- return 0;
-error:
- free (vd->videodevice);
- free (vd->status);
- free (vd->pictName);
- close (vd->fd);
- return -1;
}
-static int
-init_v4l2 (struct vdIn *vd)
+static int init_v4l2 (struct vdIn *vd)
{
- int i;
- int ret = 0;
-
- if ((vd->fd = open (vd->videodevice, O_RDWR)) == -1) {
- perror ("ERROR opening V4L interface \n");
- exit (1);
- }
- memset (&vd->cap, 0, sizeof (struct v4l2_capability));
- ret = ioctl (vd->fd, VIDIOC_QUERYCAP, &vd->cap);
- if (ret < 0) {
- fprintf (stderr, "Error opening device %s: unable to query device.\n",
- vd->videodevice);
- goto fatal;
- }
-
- if ((vd->cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) {
- fprintf (stderr,
- "Error opening device %s: video capture not supported.\n",
- vd->videodevice);
- goto fatal;;
- }
- if (vd->grabmethod) {
- if (!(vd->cap.capabilities & V4L2_CAP_STREAMING)) {
- fprintf (stderr, "%s does not support streaming i/o\n",
- vd->videodevice);
- goto fatal;
+ int i;
+ int ret = 0;
+
+ if ((vd->fd = open (vd->videodevice, O_RDWR)) == -1) {
+ perror ("ERROR opening V4L interface \n");
+ exit (1);
+ }
+ memset (&vd->cap, 0, sizeof (struct v4l2_capability));
+ ret = ioctl (vd->fd, VIDIOC_QUERYCAP, &vd->cap);
+ if (ret < 0) {
+ fprintf (stderr, "Error opening device %s: unable to query device.\n",
+ vd->videodevice);
+ goto fatal;
}
- } else {
- if (!(vd->cap.capabilities & V4L2_CAP_READWRITE)) {
- fprintf (stderr, "%s does not support read i/o\n", vd->videodevice);
- goto fatal;
+
+ if ((vd->cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) {
+ fprintf (stderr,
+ "Error opening device %s: video capture not supported.\n",
+ vd->videodevice);
+ goto fatal;;
}
- }
- /* set format in */
- memset (&vd->fmt, 0, sizeof (struct v4l2_format));
- vd->fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- vd->fmt.fmt.pix.width = vd->width;
- vd->fmt.fmt.pix.height = vd->height;
- vd->fmt.fmt.pix.pixelformat = vd->formatIn;
- vd->fmt.fmt.pix.field = V4L2_FIELD_ANY;
- ret = ioctl (vd->fd, VIDIOC_S_FMT, &vd->fmt);
- if (ret < 0) {
- fprintf (stderr, "Unable to set format: %d.\n", errno);
- goto fatal;
- }
- if ((vd->fmt.fmt.pix.width != vd->width) ||
- (vd->fmt.fmt.pix.height != vd->height)) {
- fprintf (stderr, " format asked unavailable get width %d height %d \n",
- vd->fmt.fmt.pix.width, vd->fmt.fmt.pix.height);
- vd->width = vd->fmt.fmt.pix.width;
- vd->height = vd->fmt.fmt.pix.height;
- /* look the format is not part of the deal ??? */
- //vd->formatIn = vd->fmt.fmt.pix.pixelformat;
- }
- /* request buffers */
- memset (&vd->rb, 0, sizeof (struct v4l2_requestbuffers));
- vd->rb.count = NB_BUFFER;
- vd->rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- vd->rb.memory = V4L2_MEMORY_MMAP;
-
- ret = ioctl (vd->fd, VIDIOC_REQBUFS, &vd->rb);
- if (ret < 0) {
- fprintf (stderr, "Unable to allocate buffers: %d.\n", errno);
- goto fatal;
- }
- /* map the buffers */
- for (i = 0; i < NB_BUFFER; i++) {
- memset (&vd->buf, 0, sizeof (struct v4l2_buffer));
- vd->buf.index = i;
- vd->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- vd->buf.memory = V4L2_MEMORY_MMAP;
- ret = ioctl (vd->fd, VIDIOC_QUERYBUF, &vd->buf);
+ if (vd->grabmethod) {
+ if (!(vd->cap.capabilities & V4L2_CAP_STREAMING)) {
+ fprintf (stderr, "%s does not support streaming i/o\n",
+ vd->videodevice);
+ goto fatal;
+ }
+ } else {
+ if (!(vd->cap.capabilities & V4L2_CAP_READWRITE)) {
+ fprintf (stderr, "%s does not support read i/o\n", vd->videodevice);
+ goto fatal;
+ }
+ }
+ /* set format in */
+ memset (&vd->fmt, 0, sizeof (struct v4l2_format));
+ vd->fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ vd->fmt.fmt.pix.width = vd->width;
+ vd->fmt.fmt.pix.height = vd->height;
+ vd->fmt.fmt.pix.pixelformat = vd->formatIn;
+ vd->fmt.fmt.pix.field = V4L2_FIELD_ANY;
+ ret = ioctl (vd->fd, VIDIOC_S_FMT, &vd->fmt);
if (ret < 0) {
- fprintf (stderr, "Unable to query buffer (%d).\n", errno);
- goto fatal;
+ fprintf (stderr, "Unable to set format: %d.\n", errno);
+ goto fatal;
}
- if (debug)
- fprintf (stderr, "length: %u offset: %u\n", vd->buf.length,
- vd->buf.m.offset);
- vd->mem[i] = mmap (0 /* start anywhere */ ,
- vd->buf.length, PROT_READ, MAP_SHARED, vd->fd,
- vd->buf.m.offset);
- if (vd->mem[i] == MAP_FAILED) {
- fprintf (stderr, "Unable to map buffer (%d)\n", errno);
- goto fatal;
+ if ((vd->fmt.fmt.pix.width != vd->width) ||
+ (vd->fmt.fmt.pix.height != vd->height)) {
+ fprintf (stderr, " format asked unavailable get width %d height %d \n",
+ vd->fmt.fmt.pix.width, vd->fmt.fmt.pix.height);
+ vd->width = vd->fmt.fmt.pix.width;
+ vd->height = vd->fmt.fmt.pix.height;
+ /* look the format is not part of the deal ??? */
+ //vd->formatIn = vd->fmt.fmt.pix.pixelformat;
}
- if (debug)
- fprintf (stderr, "Buffer mapped at address %p.\n", vd->mem[i]);
- }
- /* Queue the buffers. */
- for (i = 0; i < NB_BUFFER; ++i) {
- memset (&vd->buf, 0, sizeof (struct v4l2_buffer));
- vd->buf.index = i;
- vd->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- vd->buf.memory = V4L2_MEMORY_MMAP;
- ret = ioctl (vd->fd, VIDIOC_QBUF, &vd->buf);
+ /* request buffers */
+ memset (&vd->rb, 0, sizeof (struct v4l2_requestbuffers));
+ vd->rb.count = NB_BUFFER;
+ vd->rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ vd->rb.memory = V4L2_MEMORY_MMAP;
+
+ ret = ioctl (vd->fd, VIDIOC_REQBUFS, &vd->rb);
if (ret < 0) {
- fprintf (stderr, "Unable to queue buffer (%d).\n", errno);
- goto fatal;;
+ fprintf (stderr, "Unable to allocate buffers: %d.\n", errno);
+ goto fatal;
+ }
+ /* map the buffers */
+ for (i = 0; i < NB_BUFFER; i++) {
+ memset (&vd->buf, 0, sizeof (struct v4l2_buffer));
+ vd->buf.index = i;
+ vd->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ vd->buf.memory = V4L2_MEMORY_MMAP;
+ ret = ioctl (vd->fd, VIDIOC_QUERYBUF, &vd->buf);
+ if (ret < 0) {
+ fprintf (stderr, "Unable to query buffer (%d).\n", errno);
+ goto fatal;
+ }
+ if (debug)
+ fprintf (stderr, "length: %u offset: %u\n", vd->buf.length,
+ vd->buf.m.offset);
+ vd->mem[i] = mmap (0 /* start anywhere */ ,
+ vd->buf.length, PROT_READ, MAP_SHARED, vd->fd,
+ vd->buf.m.offset);
+ if (vd->mem[i] == MAP_FAILED) {
+ fprintf (stderr, "Unable to map buffer (%d)\n", errno);
+ goto fatal;
+ }
+ if (debug)
+ fprintf (stderr, "Buffer mapped at address %p.\n", vd->mem[i]);
}
- }
- return 0;
+ /* Queue the buffers. */
+ for (i = 0; i < NB_BUFFER; ++i) {
+ memset (&vd->buf, 0, sizeof (struct v4l2_buffer));
+ vd->buf.index = i;
+ vd->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ vd->buf.memory = V4L2_MEMORY_MMAP;
+ ret = ioctl (vd->fd, VIDIOC_QBUF, &vd->buf);
+ if (ret < 0) {
+ fprintf (stderr, "Unable to queue buffer (%d).\n", errno);
+ goto fatal;;
+ }
+ }
+ return 0;
+
fatal:
- return -1;
+ return -1;
}
-static int
-video_enable (struct vdIn *vd)
+static int video_enable (struct vdIn *vd)
{
- int type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- int ret;
-
- ret = ioctl (vd->fd, VIDIOC_STREAMON, &type);
- if (ret < 0) {
- fprintf (stderr, "Unable to %s capture: %d.\n", "start", errno);
- return ret;
- }
- vd->isstreaming = 1;
- return 0;
+ int type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ int ret;
+
+ ret = ioctl (vd->fd, VIDIOC_STREAMON, &type);
+ if (ret < 0) {
+ fprintf (stderr, "Unable to %s capture: %d.\n", "start", errno);
+ return ret;
+ }
+ vd->isstreaming = 1;
+ return 0;
}
-static int
-video_disable (struct vdIn *vd)
+static int video_disable (struct vdIn *vd)
{
- int type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- int ret;
-
- ret = ioctl (vd->fd, VIDIOC_STREAMOFF, &type);
- if (ret < 0) {
- fprintf (stderr, "Unable to %s capture: %d.\n", "stop", errno);
- return ret;
- }
- vd->isstreaming = 0;
- return 0;
+ int type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ int ret;
+
+ ret = ioctl (vd->fd, VIDIOC_STREAMOFF, &type);
+ if (ret < 0) {
+ fprintf (stderr, "Unable to %s capture: %d.\n", "stop", errno);
+ return ret;
+ }
+ vd->isstreaming = 0;
+ return 0;
}
-int
-uvcGrab (struct vdIn *vd)
+int uvcGrab (struct vdIn *vd)
{
#define HEADERFRAME1 0xaf
- int ret;
-
- if (!vd->isstreaming)
- if (video_enable (vd))
- goto err;
- memset (&vd->buf, 0, sizeof (struct v4l2_buffer));
- vd->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- vd->buf.memory = V4L2_MEMORY_MMAP;
- ret = ioctl (vd->fd, VIDIOC_DQBUF, &vd->buf);
- if (ret < 0) {
- fprintf (stderr, "Unable to dequeue buffer (%d).\n", errno);
- goto err;
- }
- switch (vd->formatIn) {
- case V4L2_PIX_FMT_MJPEG:
-
- memcpy (vd->tmpbuffer, vd->mem[vd->buf.index], HEADERFRAME1);
- memcpy (vd->tmpbuffer + HEADERFRAME1, dht_data, DHT_SIZE);
- memcpy (vd->tmpbuffer + HEADERFRAME1 + DHT_SIZE,
- vd->mem[vd->buf.index] + HEADERFRAME1,
- (vd->buf.bytesused - HEADERFRAME1));
- if (debug)
- fprintf (stderr, "bytes in used %d \n", vd->buf.bytesused);
- break;
- case V4L2_PIX_FMT_YUYV:
- if (vd->buf.bytesused > vd->framesizeIn)
- memcpy (vd->framebuffer, vd->mem[vd->buf.index],
- (size_t) vd->framesizeIn);
- else
- memcpy (vd->framebuffer, vd->mem[vd->buf.index],
- (size_t) vd->buf.bytesused);
- break;
- default:
- goto err;
- break;
- }
- ret = ioctl (vd->fd, VIDIOC_QBUF, &vd->buf);
- if (ret < 0) {
- fprintf (stderr, "Unable to requeue buffer (%d).\n", errno);
- goto err;
- }
-
- return 0;
-err:
- vd->signalquit = 0;
- return -1;
+ int ret;
+
+ if (!vd->isstreaming)
+ if (video_enable (vd))
+ goto err;
+ memset (&vd->buf, 0, sizeof (struct v4l2_buffer));
+ vd->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ vd->buf.memory = V4L2_MEMORY_MMAP;
+ ret = ioctl (vd->fd, VIDIOC_DQBUF, &vd->buf);
+ if (ret < 0) {
+ fprintf (stderr, "Unable to dequeue buffer (%d).\n", errno);
+ goto err;
+ }
+ switch (vd->formatIn) {
+ case V4L2_PIX_FMT_MJPEG:
+
+ memcpy (vd->tmpbuffer, vd->mem[vd->buf.index], HEADERFRAME1);
+ memcpy (vd->tmpbuffer + HEADERFRAME1, dht_data, DHT_SIZE);
+ memcpy (vd->tmpbuffer + HEADERFRAME1 + DHT_SIZE,
+ vd->mem[vd->buf.index] + HEADERFRAME1,
+ (vd->buf.bytesused - HEADERFRAME1));
+ if (debug)
+ fprintf (stderr, "bytes in used %d \n", vd->buf.bytesused);
+ break;
+ case V4L2_PIX_FMT_YUYV:
+ if (vd->buf.bytesused > vd->framesizeIn)
+ memcpy (vd->framebuffer, vd->mem[vd->buf.index],
+ (size_t) vd->framesizeIn);
+ else
+ memcpy (vd->framebuffer, vd->mem[vd->buf.index],
+ (size_t) vd->buf.bytesused);
+ break;
+ default:
+ goto err;
+ break;
+ }
+ ret = ioctl (vd->fd, VIDIOC_QBUF, &vd->buf);
+ if (ret < 0) {
+ fprintf (stderr, "Unable to requeue buffer (%d).\n", errno);
+ goto err;
+ }
+
+ return 0;
+ err:
+ vd->signalquit = 0;
+ return -1;
}
-int
-close_v4l2 (struct vdIn *vd)
+int close_v4l2 (struct vdIn *vd)
{
- int i;
+ int i;
- if (vd->isstreaming)
- video_disable (vd);
+ if (vd->isstreaming)
+ video_disable (vd);
- /* If the memory maps are not released the device will remain opened even
+ /* If the memory maps are not released the device will remain opened even
after a call to close(); */
- for (i = 0; i < NB_BUFFER; i++) {
- munmap (vd->mem[i], vd->buf.length);
- }
-
- if (vd->tmpbuffer)
- free (vd->tmpbuffer);
- vd->tmpbuffer = NULL;
- free (vd->framebuffer);
- vd->framebuffer = NULL;
- free (vd->videodevice);
- free (vd->status);
- free (vd->pictName);
- vd->videodevice = NULL;
- vd->status = NULL;
- vd->pictName = NULL;
- close (vd->fd);
- return 0;
-}
+ for (i = 0; i < NB_BUFFER; i++) {
+ munmap (vd->mem[i], vd->buf.length);
+ }
-/* return >= 0 ok otherwhise -1 */
-static int
-isv4l2Control (struct vdIn *vd, int control, struct v4l2_queryctrl *queryctrl)
-{
- int err = 0;
-
- queryctrl->id = control;
- if ((err = ioctl (vd->fd, VIDIOC_QUERYCTRL, queryctrl)) < 0) {
- fprintf (stderr, "ioctl querycontrol error %d \n", errno);
- } else if (queryctrl->flags & V4L2_CTRL_FLAG_DISABLED) {
- fprintf (stderr, "control %s disabled \n", (char *) queryctrl->name);
- } else if (queryctrl->flags & V4L2_CTRL_TYPE_BOOLEAN) {
- return 1;
- } else if (queryctrl->type & V4L2_CTRL_TYPE_INTEGER) {
+ if (vd->tmpbuffer)
+ free (vd->tmpbuffer);
+ vd->tmpbuffer = NULL;
+ free (vd->framebuffer);
+ vd->framebuffer = NULL;
+ free (vd->videodevice);
+ free (vd->status);
+ free (vd->pictName);
+ vd->videodevice = NULL;
+ vd->status = NULL;
+ vd->pictName = NULL;
+ close (vd->fd);
return 0;
- } else {
- fprintf (stderr, "contol %s unsupported \n", (char *) queryctrl->name);
- }
- return -1;
}
-int
-v4l2GetControl (struct vdIn *vd, int control)
+/* return >= 0 ok otherwhise -1 */
+static int isv4l2Control (struct vdIn *vd, int control, struct v4l2_queryctrl *queryctrl)
{
- struct v4l2_queryctrl queryctrl;
- struct v4l2_control control_s;
- int err;
-
- if (isv4l2Control (vd, control, &queryctrl) < 0)
- return -1;
- control_s.id = control;
- if ((err = ioctl (vd->fd, VIDIOC_G_CTRL, &control_s)) < 0) {
- fprintf (stderr, "ioctl get control error\n");
+ int err = 0;
+
+ queryctrl->id = control;
+ if ((err = ioctl (vd->fd, VIDIOC_QUERYCTRL, queryctrl)) < 0) {
+ fprintf (stderr, "ioctl querycontrol error %d \n", errno);
+ } else if (queryctrl->flags & V4L2_CTRL_FLAG_DISABLED) {
+ fprintf (stderr, "control %s disabled \n", (char *) queryctrl->name);
+ } else if (queryctrl->flags & V4L2_CTRL_TYPE_BOOLEAN) {
+ return 1;
+ } else if (queryctrl->type & V4L2_CTRL_TYPE_INTEGER) {
+ return 0;
+ } else {
+ fprintf (stderr, "contol %s unsupported \n", (char *) queryctrl->name);
+ }
return -1;
- }
- return control_s.value;
}
-int
-v4l2SetControl (struct vdIn *vd, int control, int value)
+int v4l2GetControl (struct vdIn *vd, int control)
{
- struct v4l2_control control_s;
- struct v4l2_queryctrl queryctrl;
- int min, max, step, val_def;
- int err;
+ struct v4l2_queryctrl queryctrl;
+ struct v4l2_control control_s;
+ int err;
- if (isv4l2Control (vd, control, &queryctrl) < 0)
- return -1;
- min = queryctrl.minimum;
- max = queryctrl.maximum;
- step = queryctrl.step;
- val_def = queryctrl.default_value;
- if ((value >= min) && (value <= max)) {
+ if (isv4l2Control (vd, control, &queryctrl) < 0)
+ return -1;
control_s.id = control;
- control_s.value = value;
- if ((err = ioctl (vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) {
- fprintf (stderr, "ioctl set control error\n");
- return -1;
+ if ((err = ioctl (vd->fd, VIDIOC_G_CTRL, &control_s)) < 0) {
+ fprintf (stderr, "ioctl get control error\n");
+ return -1;
}
- }
- return 0;
+ return control_s.value;
}
-int
-v4l2UpControl (struct vdIn *vd, int control)
+int v4l2SetControl (struct vdIn *vd, int control, int value)
{
- struct v4l2_control control_s;
- struct v4l2_queryctrl queryctrl;
- int min, max, current, step, val_def;
- int err;
+ struct v4l2_control control_s;
+ struct v4l2_queryctrl queryctrl;
+ int min, max, step, val_def;
+ int err;
+
+ if (isv4l2Control (vd, control, &queryctrl) < 0)
+ return -1;
+ min = queryctrl.minimum;
+ max = queryctrl.maximum;
+ step = queryctrl.step;
+ val_def = queryctrl.default_value;
+ if ((value >= min) && (value <= max)) {
+ control_s.id = control;
+ control_s.value = value;
+ if ((err = ioctl (vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) {
+ fprintf (stderr, "ioctl set control error\n");
+ return -1;
+ }
+ }
+ return 0;
+}
- if (isv4l2Control (vd, control, &queryctrl) < 0)
- return -1;
- min = queryctrl.minimum;
- max = queryctrl.maximum;
- step = queryctrl.step;
- val_def = queryctrl.default_value;
- current = v4l2GetControl (vd, control);
- current += step;
- if (current <= max) {
- control_s.id = control;
- control_s.value = current;
- if ((err = ioctl (vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) {
- fprintf (stderr, "ioctl set control error\n");
- return -1;
+int v4l2UpControl (struct vdIn *vd, int control)
+{
+ struct v4l2_control control_s;
+ struct v4l2_queryctrl queryctrl;
+ int min, max, current, step, val_def;
+ int err;
+
+ if (isv4l2Control (vd, control, &queryctrl) < 0)
+ return -1;
+ min = queryctrl.minimum;
+ max = queryctrl.maximum;
+ step = queryctrl.step;
+ val_def = queryctrl.default_value;
+ current = v4l2GetControl (vd, control);
+ current += step;
+ if (current <= max) {
+ control_s.id = control;
+ control_s.value = current;
+ if ((err = ioctl (vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) {
+ fprintf (stderr, "ioctl set control error\n");
+ return -1;
+ }
}
- }
- return control_s.value;
+ return control_s.value;
}
-int
-v4l2DownControl (struct vdIn *vd, int control)
+int v4l2DownControl (struct vdIn *vd, int control)
{
- struct v4l2_control control_s;
- struct v4l2_queryctrl queryctrl;
- int min, max, current, step, val_def;
- int err;
+ struct v4l2_control control_s;
+ struct v4l2_queryctrl queryctrl;
+ int min, max, current, step, val_def;
+ int err;
+
+ if (isv4l2Control (vd, control, &queryctrl) < 0)
+ return -1;
+ min = queryctrl.minimum;
+ max = queryctrl.maximum;
+ step = queryctrl.step;
+ val_def = queryctrl.default_value;
+ current = v4l2GetControl (vd, control);
+ current -= step;
+ if (current >= min) {
+ control_s.id = control;
+ control_s.value = current;
+ if ((err = ioctl (vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) {
+ fprintf (stderr, "ioctl set control error\n");
+ return -1;
+ }
+ }
+ return control_s.value;
+}
- if (isv4l2Control (vd, control, &queryctrl) < 0)
- return -1;
- min = queryctrl.minimum;
- max = queryctrl.maximum;
- step = queryctrl.step;
- val_def = queryctrl.default_value;
- current = v4l2GetControl (vd, control);
- current -= step;
- if (current >= min) {
+int v4l2ToggleControl (struct vdIn *vd, int control)
+{
+ struct v4l2_control control_s;
+ struct v4l2_queryctrl queryctrl;
+ int current;
+ int err;
+
+ if (isv4l2Control (vd, control, &queryctrl) != 1)
+ return -1;
+ current = v4l2GetControl (vd, control);
control_s.id = control;
- control_s.value = current;
+ control_s.value = !current;
if ((err = ioctl (vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) {
- fprintf (stderr, "ioctl set control error\n");
- return -1;
+ fprintf (stderr, "ioctl toggle control error\n");
+ return -1;
}
- }
- return control_s.value;
+ return control_s.value;
}
-int
-v4l2ToggleControl (struct vdIn *vd, int control)
+int v4l2ResetControl (struct vdIn *vd, int control)
{
- struct v4l2_control control_s;
- struct v4l2_queryctrl queryctrl;
- int current;
- int err;
+ struct v4l2_control control_s;
+ struct v4l2_queryctrl queryctrl;
+ int val_def;
+ int err;
+
+ if (isv4l2Control (vd, control, &queryctrl) < 0)
+ return -1;
+ val_def = queryctrl.default_value;
+ control_s.id = control;
+ control_s.value = val_def;
+ if ((err = ioctl (vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) {
+ fprintf (stderr, "ioctl reset control error\n");
+ return -1;
+ }
- if (isv4l2Control (vd, control, &queryctrl) != 1)
- return -1;
- current = v4l2GetControl (vd, control);
- control_s.id = control;
- control_s.value = !current;
- if ((err = ioctl (vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) {
- fprintf (stderr, "ioctl toggle control error\n");
- return -1;
- }
- return control_s.value;
+ return 0;
}
-int
-v4l2ResetControl (struct vdIn *vd, int control)
+int v4l2ResetPanTilt (struct vdIn *vd, int pantilt)
{
- struct v4l2_control control_s;
- struct v4l2_queryctrl queryctrl;
- int val_def;
- int err;
-
- if (isv4l2Control (vd, control, &queryctrl) < 0)
- return -1;
- val_def = queryctrl.default_value;
- control_s.id = control;
- control_s.value = val_def;
- if ((err = ioctl (vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) {
- fprintf (stderr, "ioctl reset control error\n");
- return -1;
- }
+ int control = V4L2_CID_PANTILT_RESET;
+ struct v4l2_control control_s;
+ struct v4l2_queryctrl queryctrl;
+ unsigned char val;
+ int err;
+
+ if (isv4l2Control (vd, control, &queryctrl) < 0)
+ return -1;
+ val = (unsigned char) pantilt;
+ control_s.id = control;
+ control_s.value = val;
+ if ((err = ioctl (vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) {
+ fprintf (stderr, "ioctl reset Pan control error\n");
+ return -1;
+ }
- return 0;
+ return 0;
}
-int
-v4l2ResetPanTilt (struct vdIn *vd, int pantilt)
-{
- int control = V4L2_CID_PANTILT_RESET;
- struct v4l2_control control_s;
- struct v4l2_queryctrl queryctrl;
- unsigned char val;
- int err;
-
- if (isv4l2Control (vd, control, &queryctrl) < 0)
- return -1;
- val = (unsigned char) pantilt;
- control_s.id = control;
- control_s.value = val;
- if ((err = ioctl (vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) {
- fprintf (stderr, "ioctl reset Pan control error\n");
- return -1;
- }
-
- return 0;
-}
union pantilt {
- struct {
- short pan;
- short tilt;
- } s16;
- int value;
+ struct {
+ short pan;
+ short tilt;
+ } s16;
+ int value;
} pantilt;
-int
-v4L2UpDownPan (struct vdIn *vd, short inc)
+int v4L2UpDownPan (struct vdIn *vd, short inc)
{
- int control = V4L2_CID_PANTILT_RELATIVE;
- struct v4l2_control control_s;
- struct v4l2_queryctrl queryctrl;
- int err;
+ int control = V4L2_CID_PANTILT_RELATIVE;
+ struct v4l2_control control_s;
+ struct v4l2_queryctrl queryctrl;
+ int err;
- union pantilt pan;
+ union pantilt pan;
- control_s.id = control;
- if (isv4l2Control (vd, control, &queryctrl) < 0)
- return -1;
+ control_s.id = control;
+ if (isv4l2Control (vd, control, &queryctrl) < 0)
+ return -1;
- pan.s16.pan = inc;
- pan.s16.tilt = 0;
+ pan.s16.pan = inc;
+ pan.s16.tilt = 0;
- control_s.value = pan.value;
- if ((err = ioctl (vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) {
- fprintf (stderr, "ioctl pan updown control error\n");
- return -1;
- }
- return 0;
+ control_s.value = pan.value;
+ if ((err = ioctl (vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) {
+ fprintf (stderr, "ioctl pan updown control error\n");
+ return -1;
+ }
+ return 0;
}
-int
-v4L2UpDownTilt (struct vdIn *vd, short inc)
+int v4L2UpDownTilt (struct vdIn *vd, short inc)
{
- int control = V4L2_CID_PANTILT_RELATIVE;
- struct v4l2_control control_s;
- struct v4l2_queryctrl queryctrl;
- int err;
- union pantilt pan;
-
- control_s.id = control;
- if (isv4l2Control (vd, control, &queryctrl) < 0)
- return -1;
+ int control = V4L2_CID_PANTILT_RELATIVE;
+ struct v4l2_control control_s;
+ struct v4l2_queryctrl queryctrl;
+ int err;
+ union pantilt pan;
- pan.s16.pan = 0;
- pan.s16.tilt = inc;
+ control_s.id = control;
+ if (isv4l2Control (vd, control, &queryctrl) < 0)
+ return -1;
- control_s.value = pan.value;
- if ((err = ioctl (vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) {
- fprintf (stderr, "ioctl tiltupdown control error\n");
- return -1;
- }
- return 0;
+ pan.s16.pan = 0;
+ pan.s16.tilt = inc;
+
+ control_s.value = pan.value;
+ if ((err = ioctl (vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) {
+ fprintf (stderr, "ioctl tiltupdown control error\n");
+ return -1;
+ }
+ return 0;
}
View
47 v4l2uvc.h
@@ -37,33 +37,32 @@
#define V4L2_CID_PANTILT_RESET (V4L2_CID_PRIVATE_BASE+8)
struct vdIn {
- int fd;
- char *videodevice;
- char *status;
- char *pictName;
- struct v4l2_capability cap;
- struct v4l2_format fmt;
- struct v4l2_buffer buf;
- struct v4l2_requestbuffers rb;
- void *mem[NB_BUFFER];
- unsigned char *tmpbuffer;
- unsigned char *framebuffer;
- int isstreaming;
- int grabmethod;
- int width;
- int height;
- int formatIn;
- int formatOut;
- int framesizeIn;
- int signalquit;
- int toggleAvi;
- int getPict;
+ int fd;
+ char *videodevice;
+ char *status;
+ char *pictName;
+ struct v4l2_capability cap;
+ struct v4l2_format fmt;
+ struct v4l2_buffer buf;
+ struct v4l2_requestbuffers rb;
+ void *mem[NB_BUFFER];
+ unsigned char *tmpbuffer;
+ unsigned char *framebuffer;
+ int isstreaming;
+ int grabmethod;
+ int width;
+ int height;
+ int formatIn;
+ int formatOut;
+ int framesizeIn;
+ int signalquit;
+ int toggleAvi;
+ int getPict;
};
-int
- init_videoIn (struct vdIn *vd, char *device, int width, int height,
- int format, int grabmethod);
+int init_videoIn (struct vdIn *vd, char *device, int width, int height,
+ int format, int grabmethod);
int uvcGrab (struct vdIn *vd);
int close_v4l2 (struct vdIn *vd);

0 comments on commit dc6b9cd

Please sign in to comment.