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
