{
v4l2_frmivalenum frmival;
- if (enum_frameintervals(frmival, m_pixelformat, m_width, m_height, idx)) {
- // TODO
+ if (enum_frameintervals(frmival, m_pixelformat, m_width, m_height, idx)
+ && frmival.type == V4L2_FRMIVAL_TYPE_DISCRETE) {
+ set_interval(frmival.discrete);
}
}
void GeneralTab::updateFrameInterval()
{
v4l2_frmivalenum frmival;
- bool ok = false;
+ v4l2_fract curr;
+ bool curr_ok, ok;
m_frameInterval->clear();
ok = enum_frameintervals(frmival, m_pixelformat, m_width, m_height);
+ curr_ok = get_interval(curr);
if (ok && frmival.type == V4L2_FRMIVAL_TYPE_DISCRETE) {
do {
m_frameInterval->addItem(QString("%1 fps")
.arg((double)frmival.discrete.denominator / frmival.discrete.numerator));
+ if (curr_ok &&
+ frmival.discrete.numerator == curr.numerator &&
+ frmival.discrete.denominator == curr.denominator)
+ m_frameInterval->setCurrentIndex(frmival.index);
} while (enum_frameintervals(frmival));
}
}
}
m_capMethod = m_genTab->capMethod();
g_fmt_cap(m_capSrcFormat);
- if (useWrapper()) {
+ if (useWrapper() &&
+ m_capSrcFormat.fmt.pix.pixelformat != V4L2_PIX_FMT_RGB24) {
+ v4l2_fract interval;
+ bool interval_ok = get_interval(interval);
m_capSrcFormat.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB24;
s_fmt(m_capSrcFormat);
g_fmt_cap(m_capSrcFormat);
+ if (interval_ok)
+ set_interval(interval);
}
m_frameData = new unsigned char[m_capSrcFormat.fmt.pix.sizeimage];
m_capDestFormat = m_capSrcFormat;
return ioctl("Stop Output", VIDIOC_STREAMOFF, &type);
}
+
+bool v4l2::set_interval(v4l2_fract interval)
+{
+ v4l2_streamparm parm;
+
+ parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ if (ioctl(VIDIOC_G_PARM, &parm) < 0)
+ return false;
+
+ if (!(parm.parm.capture.capability & V4L2_CAP_TIMEPERFRAME))
+ return false;
+
+ parm.parm.capture.timeperframe = interval;
+
+ return ioctl("Set FPS", VIDIOC_S_PARM, &parm);
+}
+
+bool v4l2::get_interval(v4l2_fract &interval)
+{
+ v4l2_streamparm parm;
+
+ parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ if (ioctl(VIDIOC_G_PARM, &parm) >= 0 &&
+ (parm.parm.capture.capability & V4L2_CAP_TIMEPERFRAME)) {
+ interval = parm.parm.capture.timeperframe;
+ return true;
+ }
+
+ return false;
+}
bool streamon_out();
bool streamoff_out();
+ bool set_interval(v4l2_fract interval);
+ bool get_interval(v4l2_fract &interval);
private:
void clear() { error(QString()); }