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

DVD

开发平台:

Unix_Linux

  1. /* Capture a frame of video from a V4L2 driver and send it
  2.  * to stdout. Use vctrl to set image width, height, depth.
  3.  *
  4.  * This program was written by Bill Dirks.
  5.  * This program is in the public domain.
  6.  *
  7.  * gcc -o xcaptest -L/usr/X11R6/lib/ -lXt -lXaw -Wall xcaptest.c
  8.  *
  9.  * ./vcat [-rgb | -bgr] [device-node]
  10.  */
  11. #include <sys/time.h>
  12. #include <sys/types.h>
  13. #include <sys/stat.h>
  14. #include <sys/ioctl.h>
  15. #include <fcntl.h>
  16. #include <unistd.h>
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. #include <sys/mman.h>
  20. #include <errno.h>
  21. /* These are needed to use the Videum driver */
  22. #include <linux/fs.h>
  23. #include <linux/kernel.h>
  24. #include <linux/videodev2.h>  /* Video for Linux Two */
  25. int
  26. main(int argc, char *argv[])
  27. {
  28. char *device = NULL;
  29. int vid;
  30. int err;
  31. int i;
  32. int n;
  33. struct v4l2_capability cap;
  34.         struct v4l2_format fmt;
  35. int bgr = 0;
  36. int rgb = 0;
  37. int rgbswap = 0;
  38. char *data;
  39. char t;
  40. for (i = 1; i < argc; ++i)
  41. {
  42. if (strcmp(argv[i], "-rgb") == 0)
  43. rgb = 1;
  44. else if (strcmp(argv[i], "-bgr") == 0)
  45. bgr = 1;
  46. else if (argv[i][0] == '-')
  47. continue;
  48. else
  49. device = argv[i];
  50. }
  51. if (device == NULL)
  52. device = "/dev/video";
  53. vid = open(device, O_RDONLY);
  54. if (vid < 0)
  55. {
  56. fprintf(stderr, "Can't open %sn", device);
  57. return 1;
  58. }
  59. err = ioctl(vid, VIDIOC_QUERYCAP, &cap);
  60. if (err)
  61. {
  62. fprintf(stderr, "QUERYCAP returned error %dn", errno);
  63. return 1;
  64. }
  65. if (cap.type != V4L2_TYPE_CAPTURE)
  66. {
  67. fprintf(stderr, "Device %s is not a video capture device.n",
  68. device);
  69. return 1;
  70. }
  71. if (!(cap.flags & V4L2_FLAG_READ))
  72. {
  73. fprintf(stderr, "Device %s doesn't support read().n", device);
  74. return 1;
  75. }
  76. err = ioctl(vid, VIDIOC_G_FMT, &fmt);
  77. if (err)
  78. {
  79. fprintf(stderr, "G_FMT returned error %dn", errno);
  80. return 1;
  81. }
  82. if ((fmt.pixelformat == V4L2_PIX_FMT_RGB24 && bgr) ||
  83.     (fmt.pixelformat == V4L2_PIX_FMT_BGR24 && rgb))
  84. rgbswap = 1;
  85. data = malloc(fmt.sizeimage);
  86. if (data == NULL)
  87. {
  88. fprintf(stderr, "malloc(%d) failedn", fmt.sizeimage);
  89. return 1;
  90. }
  91. n = read(vid, data, fmt.sizeimage);
  92. if (n < 0)
  93. {
  94. fprintf(stderr, "read() returned error %dn", errno);
  95. return 1;
  96. }
  97. if (rgbswap)
  98. for (i = 0; i < n; i += 3)
  99. {
  100. t = data[i];
  101. data[i] = data[i + 2];
  102. data[i + 2] = t;
  103. }
  104. if (n)
  105. fwrite(data, (size_t)n, 1, stdout);
  106. return 0;
  107. }