2013-03-12 3 views

ответ

5

использовать VIDIOC_ENUM_FRAMESIZES IOCTL:

enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 
    struct v4l2_fmtdesc fmt; 
    struct v4l2_frmsizeenum frmsize; 
    struct v4l2_frmivalenum frmival; 

    fmt.index = 0; 
    fmt.type = type; 
    while (ioctl(fd, VIDIOC_ENUM_FMT, &fmt) >= 0) { 
     frmsize.pixel_format = fmt.pixelformat; 
     frmsize.index = 0; 
     while (ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &frmsize) >= 0) { 
      if (frmsize.type == V4L2_FRMSIZE_TYPE_DISCRETE) { 
       printf("%dx%d\n", 
            frmsize.discrete.width, 
            frmsize.discrete.height); 
      } else if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) { 
       printf("%dx%d\n", 
            frmsize.stepwise.max_width, 
            frmsize.stepwise.max_height); 
      } 
       frmsize.index++; 
      } 
      fmt.index++; 
    } 

AFAIK, VIDIOC_ENUM_FRAMESIZES был введен в Linux-2.6.29