int main(int argc, char *argv[]) { struct device dev; int ret; /* Options parsings */ int do_file = 0, do_capture = 0, do_pause = 0; int do_set_time_per_frame = 0; int do_enum_formats = 0, do_set_format = 0; int do_enum_inputs = 0, do_set_input = 0; int do_list_controls = 0, do_get_control = 0, do_set_control = 0; int do_sleep_forever = 0, do_requeue_last = 0; int no_query = 0; char *endptr; int c; /* Controls */ int ctrl_name = 0; int ctrl_value = 0; /* Video buffers */ enum v4l2_memory memtype = V4L2_MEMORY_MMAP; unsigned int pixelformat = V4L2_PIX_FMT_YUYV; unsigned int width = 640; unsigned int height = 480; unsigned int nbufs = V4L_BUFFERS_DEFAULT; unsigned int input = 0; unsigned int skip = 0; unsigned int quality = (unsigned int)-1; unsigned int userptr_offset = 0; struct v4l2_fract time_per_frame = {1, 25}; /* Capture loop */ unsigned int delay = 0, nframes = (unsigned int)-1; const char *filename = "/dev/shm/capture.output"; opterr = 0; while ((c = getopt_long(argc, argv, "c::d:f:F::hi:ln:pq:r:s:t:uw:", opts, NULL)) != -1) { switch (c) { case 'c': do_capture = 1; if (optarg) nframes = atoi(optarg); break; case 'd': delay = atoi(optarg); break; case 'f': do_set_format = 1; if (strcasecmp(optarg, "MJPEG") == 0) pixelformat = V4L2_PIX_FMT_MJPEG; else if (strcasecmp(optarg, "YUYV") == 0) pixelformat = V4L2_PIX_FMT_YUYV; else if (strcasecmp(optarg, "UYVY") == 0) pixelformat = V4L2_PIX_FMT_UYVY; else if (strcasecmp(optarg, "Y16") == 0) pixelformat = V4L2_PIX_FMT_Y16; else if (strcasecmp(optarg, "SGRBG10_DPMC8") == 0) pixelformat = V4L2_PIX_FMT_SGRBG10DPCM8; else if (strcasecmp(optarg, "SGRBG10") == 0) pixelformat = V4L2_PIX_FMT_SGRBG10; #ifdef V4L2_PIX_FMT_SGRBG12 else if (strcasecmp(optarg, "SGRBG12") == 0) pixelformat = V4L2_PIX_FMT_SGRBG12; #endif else if (strcasecmp(optarg, "DV") == 0) pixelformat = V4L2_PIX_FMT_DV; else { printf("Unsupported video format '%s'\n", optarg); return 1; } break; case 'F': do_file = 1; if (optarg) filename = optarg; break; case 'h': usage(argv[0]); return 0; case 'i': do_set_input = 1; input = atoi(optarg); break; case 'l': do_list_controls = 1; break; case 'n': nbufs = atoi(optarg); if (nbufs > V4L_BUFFERS_MAX) nbufs = V4L_BUFFERS_MAX; break; case 'p': do_pause = 1; break; case 'q': quality = atoi(optarg); break; case 'r': ctrl_name = strtol(optarg, &endptr, 0); if (*endptr != 0) { printf("Invalid control name '%s'\n", optarg); return 1; } do_get_control = 1; break; case 's': do_set_format = 1; width = strtol(optarg, &endptr, 10); if (*endptr != 'x' || endptr == optarg) { printf("Invalid size '%s'\n", optarg); return 1; } height = strtol(endptr + 1, &endptr, 10); if (*endptr != 0) { printf("Invalid size '%s'\n", optarg); return 1; } break; case 't': do_set_time_per_frame = 1; time_per_frame.numerator = strtol(optarg, &endptr, 10); if (*endptr != '/' || endptr == optarg) { printf("Invalid time per frame '%s'\n", optarg); return 1; } time_per_frame.denominator = strtol(endptr + 1, &endptr, 10); if (*endptr != 0) { printf("Invalid time per frame '%s'\n", optarg); return 1; } break; case 'u': memtype = V4L2_MEMORY_USERPTR; break; case 'w': ctrl_name = strtol(optarg, &endptr, 0); if (*endptr != ' ' || endptr == optarg) { printf("Invalid control name '%s'\n", optarg); return 1; } ctrl_value = strtol(endptr + 1, &endptr, 0); if (*endptr != 0) { printf("Invalid control value '%s'\n", optarg); return 1; } do_set_control = 1; break; case OPT_ENUM_FORMATS: do_enum_formats = 1; break; case OPT_ENUM_INPUTS: do_enum_inputs = 1; break; case OPT_NO_QUERY: no_query = 1; break; case OPT_REQUEUE_LAST: do_requeue_last = 1; break; case OPT_SKIP_FRAMES: skip = atoi(optarg); break; case OPT_SLEEP_FOREVER: do_sleep_forever = 1; break; case OPT_USERPTR_OFFSET: userptr_offset = atoi(optarg); break; default: printf("Invalid option -%c\n", c); printf("Run %s -h for help.\n", argv[0]); return 1; } } if (optind >= argc) { usage(argv[0]); return 1; } if (!do_file) filename = NULL; /* Open the video device. */ ret = video_open(&dev, argv[optind], no_query); if (ret < 0) return 1; dev.memtype = memtype; if (do_get_control) uvc_get_control(&dev, ctrl_name); if (do_set_control) uvc_set_control(&dev, ctrl_name, ctrl_value); if (do_list_controls) video_list_controls(&dev); if (do_enum_formats) { printf("- Available formats:\n"); video_enum_formats(&dev, V4L2_BUF_TYPE_VIDEO_CAPTURE); video_enum_formats(&dev, V4L2_BUF_TYPE_VIDEO_OUTPUT); video_enum_formats(&dev, V4L2_BUF_TYPE_VIDEO_OVERLAY); } if (do_enum_inputs) { printf("- Available inputs:\n"); video_enum_inputs(&dev); } if (do_set_input) { video_set_input(&dev, input); ret = video_get_input(&dev); printf("Input %d selected\n", ret); } /* Set the video format. */ if (do_set_format) { if (video_set_format(&dev, width, height, pixelformat) < 0) { video_close(&dev); return 1; } } if (!no_query || do_capture) video_get_format(&dev); /* Set the frame rate. */ if (do_set_time_per_frame) { if (video_set_framerate(&dev, &time_per_frame) < 0) { video_close(&dev); return 1; } } while (do_sleep_forever) sleep(1000); if (!do_capture) { video_close(&dev); return 0; } /* Set the compression quality. */ if (video_set_quality(&dev, quality) < 0) { video_close(&dev); return 1; } if (video_prepare_capture(&dev, nbufs, userptr_offset, filename)) { video_close(&dev); return 1; } if (do_pause) { printf("Press enter to start capture\n"); getchar(); } if (video_do_capture(&dev, nframes, skip, delay, filename, do_requeue_last) < 0) { video_close(&dev); return 1; } video_close(&dev); return 0; }
void set_control(unsigned int id, int value) { uvc_set_control(dev,id,value); };