From 93bc544155210ee8eb6732d803a048425bb533d2 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Mon, 9 May 2011 22:36:30 +0200 Subject: [PATCH] qv4l2: Add and hookup set / get interval code Signed-off-by: Hans de Goede --- utils/qv4l2/general-tab.cpp | 13 ++++++++++--- utils/qv4l2/qv4l2.cpp | 7 ++++++- utils/qv4l2/v4l2-api.cpp | 30 ++++++++++++++++++++++++++++++ utils/qv4l2/v4l2-api.h | 2 ++ 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/utils/qv4l2/general-tab.cpp b/utils/qv4l2/general-tab.cpp index 045bd7b..d1cb9f6 100644 --- a/utils/qv4l2/general-tab.cpp +++ b/utils/qv4l2/general-tab.cpp @@ -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)); } } diff --git a/utils/qv4l2/qv4l2.cpp b/utils/qv4l2/qv4l2.cpp index 232a318..4692f1f 100644 --- a/utils/qv4l2/qv4l2.cpp +++ b/utils/qv4l2/qv4l2.cpp @@ -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; diff --git a/utils/qv4l2/v4l2-api.cpp b/utils/qv4l2/v4l2-api.cpp index cd22ca7..e87e9ea 100644 --- a/utils/qv4l2/v4l2-api.cpp +++ b/utils/qv4l2/v4l2-api.cpp @@ -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; +} diff --git a/utils/qv4l2/v4l2-api.h b/utils/qv4l2/v4l2-api.h index e8bd813..c2fac1c 100644 --- a/utils/qv4l2/v4l2-api.h +++ b/utils/qv4l2/v4l2-api.h @@ -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()); } -- 2.7.4