Retrieving information on the possible frame rates for a given pixel format (RGB, YUYV, …) and a given frame size (640*480, …) using v4l2 should be simple. However, it took me some time to find the appropriate section in the documentation. In case you already have a file descriptor fd for the webcam device, this snippet illustrates the usage
struct v4l2_frmivalenum temp; memset(&temp, 0, sizeof(temp)); temp.pixel_format = V4L2_PIX_FMT_YUYV; temp.width = 640; temp.height = 480; v4l2_ioctl(fd, VIDIOC_ENUM_FRAMEINTERVALS, &temp); if (temp.type == V4L2_FRMIVAL_TYPE_DISCRETE) { while (v4l2_ioctl(fd, VIDIOC_ENUM_FRAMEINTERVALS, &temp) != -1) { cout << float(temp.discrete.denominator)/temp.discrete.numerator << " fps" << endl; temp.index += 1; } } float stepval = 0; if (temp.type == V4L2_FRMIVAL_TYPE_CONTINUOUS) { stepval = 1; } if (temp.type == V4L2_FRMIVAL_TYPE_STEPWISE || temp.type == V4L2_FRMIVAL_TYPE_CONTINUOUS) { float minval = float(temp.stepwise.min.numerator)/temp.stepwise.min.denominator; float maxval = float(temp.stepwise.max.numerator)/temp.stepwise.max.denominator; if (stepval == 0) { stepval = float(temp.stepwise.step.numerator)/temp.stepwise.step.denominator; } for (float cval = minval; cval <= maxval; cval += stepval) { cout << 1/cval << " fps" << endl; } }
The mix of numerator and denominator is caused by the way v4l2 stores the information. The API uses frame intervals instead of frame rates.