aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil@xs4all.nl>2010-08-02 08:50:32 (GMT)
committerHans Verkuil <hverkuil@xs4all.nl>2010-08-02 08:50:32 (GMT)
commit9c1095e49e6b24b231c9671f409944a73a9c4851 (patch)
treee6ce3820cfaf4f1df0f9456b78e9e62bec8c546d
parente0a76ed17b65e3b5efe197e58b008b18c35cd8cb (diff)
qv4l2: add dv_preset support
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
-rw-r--r--utils/qv4l2/general-tab.cpp81
-rw-r--r--utils/qv4l2/general-tab.h3
-rw-r--r--utils/qv4l2/v4l2-api.cpp48
-rw-r--r--utils/qv4l2/v4l2-api.h7
4 files changed, 119 insertions, 20 deletions
diff --git a/utils/qv4l2/general-tab.cpp b/utils/qv4l2/general-tab.cpp
index cb8d37b..e00d3b4 100644
--- a/utils/qv4l2/general-tab.cpp
+++ b/utils/qv4l2/general-tab.cpp
@@ -33,6 +33,8 @@ GeneralTab::GeneralTab(const QString &device, v4l2 &fd, int n, QWidget *parent)
m_col(0),
m_cols(n),
m_audioInput(NULL),
+ m_tvStandard(NULL),
+ m_videoPreset(NULL),
m_freq(NULL),
m_vidCapFormats(NULL),
m_frameSize(NULL),
@@ -58,6 +60,30 @@ GeneralTab::GeneralTab(const QString &device, v4l2 &fd, int n, QWidget *parent)
g_tuner(m_tuner);
+ v4l2_standard vs;
+ if (enum_std(vs, true)) {
+ addLabel("TV Standard");
+ m_tvStandard = new QComboBox(parent);
+ do {
+ m_tvStandard->addItem((char *)vs.name);
+ } while (enum_std(vs));
+ addWidget(m_tvStandard);
+ connect(m_tvStandard, SIGNAL(activated(int)), SLOT(standardChanged(int)));
+ updateStandard();
+ }
+
+ v4l2_dv_enum_preset preset;
+ if (enum_dv_preset(preset, true)) {
+ addLabel("Video Preset");
+ m_videoPreset = new QComboBox(parent);
+ do {
+ m_videoPreset->addItem((char *)preset.name);
+ } while (enum_dv_preset(preset));
+ addWidget(m_videoPreset);
+ connect(m_videoPreset, SIGNAL(activated(int)), SLOT(presetChanged(int)));
+ updatePreset();
+ }
+
v4l2_input vin;
if (enum_input(vin, true)) {
addLabel("Input");
@@ -106,18 +132,6 @@ GeneralTab::GeneralTab(const QString &device, v4l2 &fd, int n, QWidget *parent)
updateAudioOutput();
}
- v4l2_standard vs;
- if (enum_std(vs, true)) {
- addLabel("TV Standard");
- m_tvStandard = new QComboBox(parent);
- do {
- m_tvStandard->addItem((char *)vs.name);
- } while (enum_std(vs));
- addWidget(m_tvStandard);
- connect(m_tvStandard, SIGNAL(activated(int)), SLOT(standardChanged(int)));
- updateStandard();
- }
-
if (m_tuner.type) {
m_freq = new QSpinBox(parent);
m_freq->setMinimum(m_tuner.rangelow);
@@ -279,6 +293,15 @@ void GeneralTab::standardChanged(int std)
updateStandard();
}
+void GeneralTab::presetChanged(int index)
+{
+ v4l2_dv_enum_preset preset;
+
+ enum_dv_preset(preset, true, index);
+ s_dv_preset(preset.preset);
+ updatePreset();
+}
+
void GeneralTab::freqTableChanged(int)
{
updateFreqChannel();
@@ -381,17 +404,29 @@ void GeneralTab::vidOutFormatChanged(int idx)
void GeneralTab::updateVideoInput()
{
int input;
+ v4l2_input in;
g_input(input);
+ enum_input(in, true, input);
m_videoInput->setCurrentIndex(input);
+ if (m_tvStandard)
+ m_tvStandard->setEnabled(in.capabilities & V4L2_IN_CAP_STD);
+ if (m_videoPreset)
+ m_videoPreset->setEnabled(in.capabilities & V4L2_IN_CAP_PRESETS);
}
void GeneralTab::updateVideoOutput()
{
int output;
+ v4l2_output out;
g_output(output);
+ enum_output(out, true, output);
m_videoOutput->setCurrentIndex(output);
+ if (m_tvStandard)
+ m_tvStandard->setEnabled(out.capabilities & V4L2_OUT_CAP_STD);
+ if (m_videoPreset)
+ m_videoPreset->setEnabled(out.capabilities & V4L2_OUT_CAP_PRESETS);
}
void GeneralTab::updateAudioInput()
@@ -453,6 +488,28 @@ void GeneralTab::updateStandard()
m_tvStandard->setWhatsThis(what);
}
+void GeneralTab::updatePreset()
+{
+ __u32 preset;
+ v4l2_dv_enum_preset p;
+ QString what;
+
+ g_dv_preset(preset);
+ if (enum_dv_preset(p, true)) {
+ do {
+ if (p.preset == preset)
+ break;
+ } while (enum_dv_preset(p));
+ }
+ if (p.preset != preset)
+ return;
+ m_videoPreset->setCurrentIndex(p.index);
+ what.sprintf("Video Preset (%u)\n"
+ "Frame %ux%u\n",
+ p.preset, p.width, p.height);
+ m_videoPreset->setWhatsThis(what);
+}
+
void GeneralTab::updateFreq()
{
v4l2_frequency f;
diff --git a/utils/qv4l2/general-tab.h b/utils/qv4l2/general-tab.h
index 4309279..9a6615b 100644
--- a/utils/qv4l2/general-tab.h
+++ b/utils/qv4l2/general-tab.h
@@ -48,6 +48,7 @@ private slots:
void inputAudioChanged(int);
void outputAudioChanged(int);
void standardChanged(int);
+ void presetChanged(int);
void freqTableChanged(int);
void freqChannelChanged(int);
void freqChanged(int);
@@ -64,6 +65,7 @@ private:
void updateAudioInput();
void updateAudioOutput();
void updateStandard();
+ void updatePreset();
void updateFreq();
void updateFreqChannel();
void updateVidCapFormat();
@@ -99,6 +101,7 @@ private:
QComboBox *m_audioInput;
QComboBox *m_audioOutput;
QComboBox *m_tvStandard;
+ QComboBox *m_videoPreset;
QSpinBox *m_freq;
QComboBox *m_freqTable;
QComboBox *m_freqChannel;
diff --git a/utils/qv4l2/v4l2-api.cpp b/utils/qv4l2/v4l2-api.cpp
index 4078f60..6b91bc4 100644
--- a/utils/qv4l2/v4l2-api.cpp
+++ b/utils/qv4l2/v4l2-api.cpp
@@ -204,6 +204,27 @@ bool v4l2::s_std(v4l2_std_id std)
return ioctl("Set TV Standard", VIDIOC_S_STD, &std);
}
+bool v4l2::g_dv_preset(__u32 &preset)
+{
+ struct v4l2_dv_preset p;
+ int err;
+
+ memset(&p, 0, sizeof(p));
+ err = ioctl(VIDIOC_G_DV_PRESET, &p);
+ preset = p.preset;
+ return err >= 0;
+}
+
+bool v4l2::s_dv_preset(__u32 preset)
+{
+ struct v4l2_dv_preset p;
+
+ memset(&p, 0, sizeof(p));
+ p.preset = preset;
+ return ioctl("Set Preset", VIDIOC_S_DV_PRESET, &p);
+}
+
+
bool v4l2::g_frequency(v4l2_frequency &freq)
{
memset(&freq, 0, sizeof(freq));
@@ -251,21 +272,25 @@ bool v4l2::s_fmt(v4l2_format &fmt)
return ioctl("Set Capture Format", VIDIOC_S_FMT, &fmt);
}
-bool v4l2::enum_input(v4l2_input &in, bool init)
+bool v4l2::enum_input(v4l2_input &in, bool init, int index)
{
- if (init)
+ if (init) {
memset(&in, 0, sizeof(in));
- else
+ in.index = index;
+ } else {
in.index++;
+ }
return ioctl(VIDIOC_ENUMINPUT, &in) >= 0;
}
-bool v4l2::enum_output(v4l2_output &out, bool init)
+bool v4l2::enum_output(v4l2_output &out, bool init, int index)
{
- if (init)
+ if (init) {
memset(&out, 0, sizeof(out));
- else
+ out.index = index;
+ } else {
out.index++;
+ }
return ioctl(VIDIOC_ENUMOUTPUT, &out) >= 0;
}
@@ -298,6 +323,17 @@ bool v4l2::enum_std(v4l2_standard &std, bool init, int index)
return ioctl(VIDIOC_ENUMSTD, &std) >= 0;
}
+bool v4l2::enum_dv_preset(v4l2_dv_enum_preset &preset, bool init, int index)
+{
+ if (init) {
+ memset(&preset, 0, sizeof(preset));
+ preset.index = index;
+ } else {
+ preset.index++;
+ }
+ return ioctl(VIDIOC_ENUM_DV_PRESETS, &preset) >= 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 99c67b6..8b8c55a 100644
--- a/utils/qv4l2/v4l2-api.h
+++ b/utils/qv4l2/v4l2-api.h
@@ -65,6 +65,8 @@ public:
bool s_audout(int output);
bool s_std(v4l2_std_id std);
bool g_std(v4l2_std_id &std);
+ bool s_dv_preset(__u32 preset);
+ bool g_dv_preset(__u32 &preset);
bool g_frequency(v4l2_frequency &freq);
bool s_frequency(v4l2_frequency &freq);
bool s_frequency(int freq);
@@ -72,11 +74,12 @@ public:
bool g_fmt_out(v4l2_format &fmt);
bool try_fmt(v4l2_format &fmt);
bool s_fmt(v4l2_format &fmt);
- bool enum_input(v4l2_input &in, bool init = false);
- bool enum_output(v4l2_output &out, bool init = false);
+ bool enum_input(v4l2_input &in, bool init = false, int index = 0);
+ bool enum_output(v4l2_output &out, bool init = false, int index = 0);
bool enum_audio(v4l2_audio &audio, bool init = false);
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_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);

Privacy Policy