vctrl.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:4k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /* For changing the capture dimensions on a V4L2 device.
  2.  * Originally written by Erik Walthinsen
  3.  */
  4. #include <sys/time.h>
  5. #include <sys/types.h>
  6. #include <asm/types.h>
  7. #include <sys/stat.h>
  8. #include <fcntl.h>
  9. #include <sys/ioctl.h>
  10. #include <unistd.h>
  11. #include <stdlib.h>
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <sys/mman.h>
  15. #include <errno.h>
  16. #include <linux/fs.h>
  17. #include <linux/kernel.h>
  18. #include <linux/videodev2.h>
  19. void print_settings(int fd) {
  20.   struct v4l2_format fmt;
  21.   int input = -1;
  22.   struct v4l2_input inp;
  23.   if (ioctl(fd,VIDIOC_G_FMT,&fmt) < 0)
  24.     perror("getting video format"),exit(1);
  25.   if (ioctl(fd,VIDIOC_G_INPUT,&input) < 0)
  26.     perror("getting video input"),exit(1);
  27.   inp.index = input;
  28.   if (ioctl(fd,VIDIOC_ENUMINPUT,&inp) < 0)
  29.     perror("getting video input"),exit(1);
  30.   printf("%d x %d @ %d bpp from input %d (%s)n",
  31.  fmt.width,fmt.height,fmt.depth,input,inp.name);
  32.   printf("The inputs are:");
  33.   for (input=0; ;++input)
  34.   {
  35. inp.index = input;
  36. if (ioctl(fd,VIDIOC_ENUMINPUT,&inp) < 0)
  37. break;
  38. printf(" %d=%s",input,inp.name);
  39.   }
  40.   printf("n");
  41.   close(fd);
  42.   exit(0);
  43. }
  44. int main(int argc,char **argv) {
  45.   int vfd = 0;
  46.   int arg;
  47.   char curchar;
  48.   int devicenext = 0;
  49.   char *devname = "/dev/video";
  50.   int width=0,height=0,bpp=0;
  51.   int input=-1;
  52.   int query = 1;
  53.   struct v4l2_format fmt;
  54.     for (arg=1;arg<argc;arg++) {
  55.       if (argv[arg][0] == '-') {
  56.         /* this is an option */
  57.         curchar = argv[arg][1];
  58.         switch (curchar) {
  59.           case 'w': if (!width) width = atoi(argv[++arg]);break;
  60.           case 'h': if (!height) height = atoi(argv[++arg]);break;
  61.           case 'b': if (!bpp) bpp = atoi(argv[++arg]);break;
  62.           case 'i': if (input==-1) input = atoi(argv[++arg]);break;
  63.           default:
  64.             fprintf(stderr,"unknown option %cn",curchar);exit(1);
  65.         }
  66. query = 0;
  67.       } else {
  68.         curchar = argv[arg][0];
  69.         if ((curchar >= '0') && (curchar <= '9') && (!width) && (!devicenext)) {
  70.           /* this might be a geometry */
  71.           char *hptr, *bptr;
  72.           int fieldlen;
  73.           hptr = strchr(argv[arg],(int)'x');
  74.           fieldlen = (long)hptr - (long)argv[arg];
  75.           if ((!fieldlen) || (fieldlen > 5) || (!hptr)) continue;
  76.           hptr[0] = 0;
  77.           width = atoi(argv[arg]);
  78.           hptr++;
  79.           bptr = strchr(hptr,(int)'x');
  80.           fieldlen = (long)hptr - (long)argv[arg];
  81.           if ((!fieldlen) || (fieldlen > 5)) {
  82.             width = 0;
  83.             /* try this argument again, explicitly not as a geometry */
  84.             arg--;devicenext = 1;
  85.             continue;
  86.           }
  87.   query = 0;
  88.           if (bptr) bptr[0] = 0;
  89.           height = atoi(hptr);
  90.           if (bptr) {
  91.             bptr++;
  92.             bpp = atoi(bptr);
  93.           }
  94.         } else {
  95.           devname = argv[arg];
  96.         }
  97.         devicenext = 0;
  98.       }
  99.     }
  100.   vfd = open(devname,O_RDWR);
  101.   if ((vfd > 0) && (argc <= 2)) print_settings(vfd);
  102.   if (vfd <= 0) {
  103.     fprintf(stderr,"sorry, no such device %sn",devname);
  104.     exit(1);
  105.   }
  106.   if (ioctl(vfd,VIDIOC_G_FMT,&fmt) < 0)
  107.     perror("getting video format"),exit(1);
  108.   if (width) fmt.width = width;
  109.   if (height) fmt.height = height;
  110.   if (bpp) fmt.depth = bpp;
  111.   switch (bpp) {
  112.     case 15: fmt.pixelformat = V4L2_PIX_FMT_RGB555;break;
  113.     case 16: fmt.pixelformat = V4L2_PIX_FMT_RGB565;break;
  114.     case 24: fmt.pixelformat = V4L2_PIX_FMT_BGR24;break;
  115.     case 32: fmt.pixelformat = V4L2_PIX_FMT_BGR32;break;
  116.   }
  117.   if (ioctl(vfd,VIDIOC_S_FMT,&fmt) < 0)
  118.     perror("setting video format"),exit(1);
  119.   if (input != -1 && ioctl(vfd,VIDIOC_S_INPUT,input) < 0)
  120.     perror("setting video input"),exit(1);
  121.   close(vfd);
  122.   return 0;
  123. }