• linux_cam_test文件


    相机测试:

      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <errno.h>
      4 #include <stdlib.h>
      5 #include <sys/types.h>
      6 #include <sys/stat.h>
      7 #include <fcntl.h>
      8 #include <time.h>
      9 #include <sys/mman.h>
     10 #include <assert.h>
     11 #include <linux/videodev2.h>
     12 #include <linux/fb.h>
     13  
     14  
     15 #define CLEAR(x)    memset(&(x), 0, sizeof(x))
     16 typedef unsigned char BYTE;
     17 typedef unsigned short WORD;
     18 typedef unsigned int DWORD;
     19 typedef long LONG;
     20  
     21 #define CHECKNUM 8
     22  
     23 struct {
     24 unsigned int type;
     25 char *name;
     26 } enum_fmt[]={
     27 {V4L2_CAP_VIDEO_CAPTURE, "V4L2_CAP_VIDEO_CAPTURE"},
     28 {V4L2_CAP_VIDEO_OUTPUT, "V4L2_CAP_VIDEO_OUTPUT"},
     29 {V4L2_CAP_VIDEO_OVERLAY, "V4L2_CAP_VIDEO_OVERLAY"},
     30 {V4L2_CAP_VIDEO_CAPTURE_MPLANE, "V4L2_CAP_VIDEO_CAPTURE_MPLANE"},
     31 {V4L2_CAP_VIDEO_OUTPUT_MPLANE, "V4L2_CAP_VIDEO_OUTPUT_MPLANE"},
     32 {V4L2_CAP_VIDEO_M2M_MPLANE, "V4L2_CAP_VIDEO_M2M_MPLANE"},
     33 {V4L2_CAP_VIDEO_M2M, "V4L2_CAP_VIDEO_M2M"},
     34 {V4L2_CAP_STREAMING, "V4L2_CAP_STREAMING"},
     35 };
     36  
     37  
     38  
     39 int open_camer_device(char *path)
     40 {
     41     int fd;
     42  
     43     if((fd = open(path,O_RDWR | O_NONBLOCK)) < 0)
     44     {
     45         perror("Fail to open");
     46         exit(EXIT_FAILURE);
     47     } 
     48  
     49     printf("open cam:%s success %d
    ",path, fd);
     50     return fd;
     51 }
     52  
     53 void enum_video_ctrls_and_menus(int fd){
     54  /*
     55   * To query the attributes of a control applications set the id field of a struct 
     56   * v4l2_queryctrl and call the VIDIOC_QUERYCTRL ioctl with a pointer to this
     57   * structure. The driver fills the rest of the structure or returns an EINVAL 
     58   * error code when the id is invalid.
     59   *
     60   * To enumerate controls call VIDIOC_QUERYCTRL with successive
     61   * id values starting from V4L2_CID_BASE up to and exclusive V4L2_CID_LASTP1, 
     62   * or starting from V4L2_CID_PRIVATE_BASE until the driver returns EINVAL. 
     63   */ 
     64   struct v4l2_queryctrl queryctrl;    /* Query Control structure as defined in <sys/videodev2.h> */
     65   struct v4l2_querymenu querymenu;    /* Query Menu Structure as defined in <sys/videodev2.h> */
     66  
     67   fprintf(stdout,"Discovering controls:
    ");
     68  
     69  
     70   memset (&queryctrl, 0, sizeof (queryctrl));  
     71   for (queryctrl.id = V4L2_CID_BASE; queryctrl.id < V4L2_CID_LASTP1; queryctrl.id++) {
     72       if ( ioctl (fd, VIDIOC_QUERYCTRL, &queryctrl) == 0 ) {
     73           /* Check to see if this control is permanently disabled and should be ignored by the application */
     74           if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
     75               continue;
     76           /* We got a video control back */
     77           fprintf(stdout,"
    VIDIOC_QUERYCTRL(V4L2_CID_BASE+%d)
    ", queryctrl.id-V4L2_CID_BASE);
     78           fprintf(stdout,"   id: %d
    ", queryctrl.id);
     79           switch (queryctrl.type){
     80               case V4L2_CTRL_TYPE_INTEGER:
     81                   fprintf(stdout, "   type: INTEGER
    ");
     82                   break;
     83               case V4L2_CTRL_TYPE_BOOLEAN:
     84                   fprintf(stdout, "   type: BOOLEAN
    ");
     85                   break;
     86               case V4L2_CTRL_TYPE_MENU:
     87                   fprintf(stdout, "   type: MENU
    ");
     88                   /* Additional information is required for menu controls, the name of menu items. 
     89                    * To query them applications set the id and index fields of struct v4l2_querymenu 
     90                    *   and call the VIDIOC_QUERYMENU ioctl with a pointer to this structure. The driver
     91                    *   fills the rest of the structure or returns an EINVAL error code when the id or 
     92                    *   index is invalid. Menu items are enumerated by calling VIDIOC_QUERYMENU with 
     93                    *   successive index values from struct v4l2_queryctrl minimum (0) to maximum, inclusive.
     94                    */
     95                   querymenu.id = queryctrl.id;
     96                   for (querymenu.index = queryctrl.minimum; querymenu.index < queryctrl.maximum; querymenu.index++){
     97                       fprintf(stdout, "      menu id:%d
    ", querymenu.index);
     98                       fprintf(stdout, "      menu name:%s
    ", querymenu.name);
     99                   }
    100                   break;
    101               case V4L2_CTRL_TYPE_BUTTON:
    102                   fprintf(stdout, "   type: BUTTON
    ");
    103                   break;
    104           }
    105           fprintf(stdout,"   name: %s
    ", queryctrl.name);
    106           fprintf(stdout,"   minimum: %d
    ", queryctrl.minimum);
    107           fprintf(stdout,"   maximum: %d
    ", queryctrl.maximum);
    108           fprintf(stdout,"   step: %d
    ", queryctrl.step);
    109           fprintf(stdout,"   default_value: %d
    ", queryctrl.default_value);
    110           fprintf(stdout,"   flags: %d
    ", queryctrl.flags);
    111       } else {
    112  
    113              if (errno == EINVAL)
    114                  continue;
    115  
    116              perror("VIDIOC_QUERYCTRL");
    117              break;
    118       }
    119  
    120    }      
    121  
    122 } /* End of enum_video_ctrls_and_menus() */
    123  
    124  
    125 int main(int argc, char** argv)
    126 {
    127     int fd;
    128     struct v4l2_fmtdesc fmt;
    129     struct v4l2_capability cap;
    130     struct v4l2_format stream_fmt;
    131     struct v4l2_input input;
    132     struct v4l2_control ctrl;
    133     struct v4l2_streamparm stream;
    134     int err;
    135     int ret;
    136     int i;
    137     
    138     if (argc < 2) {
    139       //  printusage(argv[0]);
    140       printf("please input path
    ");
    141         return -1;
    142     }
    143     fd = open_camer_device(argv[1]);
    144  
    145     
    146  
    147     for(i = 0; i < CHECKNUM; i++)
    148     {
    149         memset(&fmt,0,sizeof(fmt));
    150         fmt.index = 0;
    151         fmt.type = enum_fmt[i].type;
    152         //printf("enum_fmt:%s
    ", enum_fmt[i].name);
    153         while((ret = ioctl(fd,VIDIOC_ENUM_FMT,&fmt)) == 0)
    154         {
    155             fmt.index ++ ;
    156             printf("%s:{pixelformat = %c%c%c%c},description = '%s'
    ",
    157                     enum_fmt[i].name,
    158                     fmt.pixelformat & 0xff,(fmt.pixelformat >> 8)&0xff,
    159                     (fmt.pixelformat >> 16) & 0xff,(fmt.pixelformat >> 24)&0xff,
    160                     fmt.description);
    161         }
    162     }
    163     printf("
    
    ");
    164     enum_video_ctrls_and_menus(fd);
    165     //查询视频设备支持的功能
    166     ret = ioctl(fd,VIDIOC_QUERYCAP,&cap);
    167     if(ret < 0){
    168         perror("FAIL to ioctl VIDIOC_QUERYCAP");
    169         //exit(EXIT_FAILURE);
    170     }
    171     //printf("capabilities:%08x
    ", cap.capabilities);
    172     printf("
    check the support capabilities
    ");
    173     for(i = 0; i < CHECKNUM; i++)
    174     {
    175         if(cap.capabilities & enum_fmt[i].type)
    176         printf("%s
    ",enum_fmt[i].name);
    177     }
    178     printf("
    ");
    179     if(!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE))
    180     {
    181         printf("The Current device is not a video capture device
    ");
    182         //exit(EXIT_FAILURE);
    183     
    184     }
    185     else
    186     printf("The Current device is a video capture device
    ");
    187     if(!(cap.capabilities & V4L2_CAP_STREAMING))
    188     {
    189         printf("The Current device does not support streaming i/o
    ");
    190         //exit(EXIT_FAILURE);
    191     }
    192     else
    193     printf("The Current device support streaming i/o
    ");
    194  
    195     return 0;
    196 }
  • 相关阅读:
    对 getaddrinfo Android 返回错误 EAI_BADFLAGS
    getaddrinfo详解
    使用moment.js管理时间
    ejs循环实例
    Express优化-合并路由
    Express重定向
    Express中间件
    express.Router创建模块化路由
    Express路由
    nodejs + express访问静态资源
  • 原文地址:https://www.cnblogs.com/Lxk0825/p/11748896.html
Copyright © 2020-2023  润新知