qv4l2: Add and hookup set / get interval code
authorHans de Goede <hdegoede@redhat.com>
Mon, 9 May 2011 20:36:30 +0000 (22:36 +0200)
committerHans de Goede <hdegoede@redhat.com>
Tue, 10 May 2011 09:43:08 +0000 (11:43 +0200)
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
utils/qv4l2/general-tab.cpp
utils/qv4l2/qv4l2.cpp
utils/qv4l2/v4l2-api.cpp
utils/qv4l2/v4l2-api.h

index 045bd7b..d1cb9f6 100644 (file)
@@ -380,8 +380,9 @@ void GeneralTab::frameIntervalChanged(int idx)
 {
        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);
        }
 }
 
@@ -595,15 +596,21 @@ void GeneralTab::updateFrameSize()
 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));
        }
 }
index 232a318..4692f1f 100644 (file)
@@ -436,10 +436,15 @@ void ApplicationWindow::capStart(bool start)
        }
        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;
index cd22ca7..e87e9ea 100644 (file)
@@ -543,3 +543,33 @@ bool v4l2::streamoff_out()
 
        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;
+}
index e8bd813..c2fac1c 100644 (file)
@@ -104,6 +104,8 @@ public:
        bool streamon_out();
        bool streamoff_out();
 
+       bool set_interval(v4l2_fract interval);
+       bool get_interval(v4l2_fract &interval);
 private:
        void clear() { error(QString()); }