This is an automatic generated email to let you know that the following patch 
were queued at the 
http://git.linuxtv.org/v4l-utils.git tree:

Subject: qv4l2: add support for the new timings ioctls.
Author:  Hans Verkuil <[email protected]>
Date:    Tue May 22 11:07:04 2012 +0200

Signed-off-by: Hans Verkuil <[email protected]>
(cherry picked from commit 499dbab42b914ffd75415cc59e1bbfa4eaf565c2)

Signed-off-by: Gregor Jasny <[email protected]>

 utils/qv4l2/general-tab.cpp |   90 +++++++++++++++++++++++++++++++++++++++++++
 utils/qv4l2/general-tab.h   |    6 +++
 utils/qv4l2/v4l2-api.cpp    |   27 +++++++++++++
 utils/qv4l2/v4l2-api.h      |    4 ++
 4 files changed, 127 insertions(+), 0 deletions(-)

---

http://git.linuxtv.org/v4l-utils.git?a=commitdiff;h=7e07672607a1924a25958d9399db6f8c95b25602

diff --git a/utils/qv4l2/general-tab.cpp b/utils/qv4l2/general-tab.cpp
index 21ed2d9..60247d0 100644
--- a/utils/qv4l2/general-tab.cpp
+++ b/utils/qv4l2/general-tab.cpp
@@ -25,6 +25,7 @@
 #include <QComboBox>
 #include <QPushButton>
 
+#include <stdio.h>
 #include <errno.h>
 
 GeneralTab::GeneralTab(const QString &device, v4l2 &fd, int n, QWidget 
*parent) :
@@ -38,6 +39,8 @@ GeneralTab::GeneralTab(const QString &device, v4l2 &fd, int 
n, QWidget *parent)
        m_qryStandard(NULL),
        m_videoPreset(NULL),
        m_qryPreset(NULL),
+       m_videoTimings(NULL),
+       m_qryTimings(NULL),
        m_freq(NULL),
        m_vidCapFormats(NULL),
        m_frameSize(NULL),
@@ -66,6 +69,7 @@ GeneralTab::GeneralTab(const QString &device, v4l2 &fd, int 
n, QWidget *parent)
        v4l2_input vin;
        bool needsStd = false;
        bool needsPreset = false;
+       bool needsTimings = false;
 
        if (enum_input(vin, true)) {
                addLabel("Input");
@@ -76,6 +80,8 @@ GeneralTab::GeneralTab(const QString &device, v4l2 &fd, int 
n, QWidget *parent)
                                needsStd = true;
                        if (vin.capabilities & V4L2_IN_CAP_PRESETS)
                                needsPreset = true;
+                       if (vin.capabilities & V4L2_IN_CAP_CUSTOM_TIMINGS)
+                               needsTimings = true;
                } while (enum_input(vin));
                addWidget(m_videoInput);
                connect(m_videoInput, SIGNAL(activated(int)), 
SLOT(inputChanged(int)));
@@ -141,6 +147,18 @@ GeneralTab::GeneralTab(const QString &device, v4l2 &fd, 
int n, QWidget *parent)
                connect(m_qryPreset, SIGNAL(clicked()), 
SLOT(qryPresetClicked()));
        }
 
+       if (needsTimings) {
+               addLabel("Video Timings");
+               m_videoTimings = new QComboBox(parent);
+               addWidget(m_videoTimings);
+               connect(m_videoTimings, SIGNAL(activated(int)), 
SLOT(timingsChanged(int)));
+               refreshTimings();
+               addLabel("");
+               m_qryTimings = new QPushButton("Query Timings", parent);
+               addWidget(m_qryTimings);
+               connect(m_qryTimings, SIGNAL(clicked()), 
SLOT(qryTimingsClicked()));
+       }
+
        if (m_tuner.type) {
                m_freq = new QSpinBox(parent);
                m_freq->setMinimum(m_tuner.rangelow);
@@ -315,6 +333,15 @@ void GeneralTab::presetChanged(int index)
        updatePreset();
 }
 
+void GeneralTab::timingsChanged(int index)
+{
+       v4l2_enum_dv_timings timings;
+
+       enum_dv_timings(timings, true, index);
+       s_dv_timings(timings.timings);
+       updateTimings();
+}
+
 void GeneralTab::freqTableChanged(int)
 {
        updateFreqChannel();
@@ -436,6 +463,12 @@ void GeneralTab::updateVideoInput()
                m_videoPreset->setEnabled(in.capabilities & 
V4L2_IN_CAP_PRESETS);
                m_qryPreset->setEnabled(in.capabilities & V4L2_IN_CAP_PRESETS);
        }
+       if (m_videoTimings) {
+               refreshTimings();
+               updateTimings();
+               m_videoTimings->setEnabled(in.capabilities & 
V4L2_IN_CAP_CUSTOM_TIMINGS);
+               m_qryTimings->setEnabled(in.capabilities & 
V4L2_IN_CAP_CUSTOM_TIMINGS);
+       }
 }
 
 void GeneralTab::updateVideoOutput()
@@ -455,6 +488,10 @@ void GeneralTab::updateVideoOutput()
                m_videoPreset->setEnabled(out.capabilities & 
V4L2_OUT_CAP_PRESETS);
                m_qryPreset->setEnabled(out.capabilities & 
V4L2_OUT_CAP_PRESETS);
        }
+       if (m_videoTimings) {
+               m_videoTimings->setEnabled(out.capabilities & 
V4L2_OUT_CAP_CUSTOM_TIMINGS);
+               m_qryTimings->setEnabled(out.capabilities & 
V4L2_OUT_CAP_CUSTOM_TIMINGS);
+       }
 }
 
 void GeneralTab::updateAudioInput()
@@ -582,6 +619,59 @@ void GeneralTab::qryPresetClicked()
        }
 }
 
+void GeneralTab::refreshTimings()
+{
+       v4l2_enum_dv_timings timings;
+       m_videoTimings->clear();
+       if (enum_dv_timings(timings, true)) {
+               do {
+                       v4l2_bt_timings &bt = timings.timings.bt;
+                       char buf[100];
+
+                       sprintf(buf, "%dx%d%c%.2f", bt.width, bt.height,
+                                       bt.interlaced ? 'i' : 'p',
+                                       (double)bt.pixelclock /
+                                               ((bt.width + bt.hfrontporch + 
bt.hsync + bt.hbackporch) *
+                                                (bt.height + bt.vfrontporch + 
bt.vsync + bt.vbackporch +
+                                                 bt.il_vfrontporch + 
bt.il_vsync + bt.il_vbackporch)));
+                       m_videoTimings->addItem(buf);
+               } while (enum_dv_timings(timings));
+       }
+}
+
+void GeneralTab::updateTimings()
+{
+       v4l2_dv_timings timings;
+       v4l2_enum_dv_timings p;
+       QString what;
+
+       g_dv_timings(timings);
+       if (enum_dv_timings(p, true)) {
+               do {
+                       if (!memcmp(&timings, &p.timings, sizeof(timings)))
+                               break;
+               } while (enum_dv_timings(p));
+       }
+       if (memcmp(&timings, &p.timings, sizeof(timings)))
+               return;
+       m_videoTimings->setCurrentIndex(p.index);
+       what.sprintf("Video Timings (%u)\n"
+               "Frame %ux%u\n",
+               p.index, p.timings.bt.width, p.timings.bt.height);
+       m_videoTimings->setWhatsThis(what);
+       updateVidCapFormat();
+}
+
+void GeneralTab::qryTimingsClicked()
+{
+       v4l2_dv_timings timings;
+
+       if (query_dv_timings(timings)) {
+               s_dv_timings(timings);
+               updateTimings();
+       }
+}
+
 void GeneralTab::updateFreq()
 {
        v4l2_frequency f;
diff --git a/utils/qv4l2/general-tab.h b/utils/qv4l2/general-tab.h
index 469ab8d..d483d8f 100644
--- a/utils/qv4l2/general-tab.h
+++ b/utils/qv4l2/general-tab.h
@@ -53,6 +53,8 @@ private slots:
        void qryStdClicked();
        void presetChanged(int);
        void qryPresetClicked();
+       void timingsChanged(int);
+       void qryTimingsClicked();
        void freqTableChanged(int);
        void freqChannelChanged(int);
        void freqChanged(int);
@@ -72,6 +74,8 @@ private:
        void updateStandard();
        void refreshPresets();
        void updatePreset();
+       void refreshTimings();
+       void updateTimings();
        void updateFreq();
        void updateFreqChannel();
        void updateVidCapFormat();
@@ -112,6 +116,8 @@ private:
        QPushButton *m_qryStandard;
        QComboBox *m_videoPreset;
        QPushButton *m_qryPreset;
+       QComboBox *m_videoTimings;
+       QPushButton *m_qryTimings;
        QSpinBox  *m_freq;
        QComboBox *m_freqTable;
        QComboBox *m_freqChannel;
diff --git a/utils/qv4l2/v4l2-api.cpp b/utils/qv4l2/v4l2-api.cpp
index 2969e7e..2252f60 100644
--- a/utils/qv4l2/v4l2-api.cpp
+++ b/utils/qv4l2/v4l2-api.cpp
@@ -234,6 +234,22 @@ bool v4l2::query_dv_preset(v4l2_dv_preset &preset)
        return ioctl("Query Preset", VIDIOC_QUERY_DV_PRESET, &preset);
 }
 
+bool v4l2::g_dv_timings(v4l2_dv_timings &timings)
+{
+       int err = ioctl(VIDIOC_G_DV_TIMINGS, &timings);
+       return err >= 0;
+}
+
+bool v4l2::s_dv_timings(v4l2_dv_timings &timings)
+{
+       return ioctl("Set Timings", VIDIOC_S_DV_TIMINGS, &timings);
+}
+
+bool v4l2::query_dv_timings(v4l2_dv_timings &timings)
+{
+       return ioctl("Query Timings", VIDIOC_QUERY_DV_TIMINGS, &timings);
+}
+
 
 bool v4l2::g_frequency(v4l2_frequency &freq)
 {
@@ -346,6 +362,17 @@ bool v4l2::enum_dv_preset(v4l2_dv_enum_preset &preset, 
bool init, int index)
        return ioctl(VIDIOC_ENUM_DV_PRESETS, &preset) >= 0;
 }
 
+bool v4l2::enum_dv_timings(v4l2_enum_dv_timings &timings, bool init, int index)
+{
+       if (init) {
+               memset(&timings, 0, sizeof(timings));
+               timings.index = index;
+       } else {
+               timings.index++;
+       }
+       return ioctl(VIDIOC_ENUM_DV_TIMINGS, &timings) >= 0;
+}
+
 bool v4l2::enum_fmt_cap(v4l2_fmtdesc &fmt, bool init, int index)
 {
        if (init) {
diff --git a/utils/qv4l2/v4l2-api.h b/utils/qv4l2/v4l2-api.h
index 0baca08..b4876bc 100644
--- a/utils/qv4l2/v4l2-api.h
+++ b/utils/qv4l2/v4l2-api.h
@@ -69,6 +69,9 @@ public:
        bool s_dv_preset(__u32 preset);
        bool g_dv_preset(__u32 &preset);
        bool query_dv_preset(v4l2_dv_preset &preset);
+       bool s_dv_timings(v4l2_dv_timings &timings);
+       bool g_dv_timings(v4l2_dv_timings &timings);
+       bool query_dv_timings(v4l2_dv_timings &timings);
        bool g_frequency(v4l2_frequency &freq);
        bool s_frequency(v4l2_frequency &freq);
        bool s_frequency(int freq);
@@ -82,6 +85,7 @@ public:
        bool enum_audout(v4l2_audioout &audout, bool init = false);
        bool enum_std(v4l2_standard &std, bool init = false, int index = 0);
        bool enum_dv_preset(v4l2_dv_enum_preset &preset, bool init = false, int 
index = 0);
+       bool enum_dv_timings(v4l2_enum_dv_timings &timings, bool init = false, 
int index = 0);
        bool enum_fmt_cap(v4l2_fmtdesc &std, bool init = false, int index = 0);
        bool enum_fmt_out(v4l2_fmtdesc &std, bool init = false, int index = 0);
        bool enum_framesizes(v4l2_frmsizeenum &frm, __u32 init_pixfmt = 0, int 
index = 0);

_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to