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: fix interval updating, use device_caps, handle conversion 
errors.
Author:  Hans Verkuil <[email protected]>
Date:    Sun Jun 10 09:31:58 2012 +0200

Choosing a new interval when capturing failed (of course), but the combobox
wasn't put back to the old position.

Now support device_caps for better capability reporting.

If a format can't be converted, then still memcpy it: that's better than a
black window.

Signed-off-by: Hans Verkuil <[email protected]>

 utils/qv4l2/general-tab.cpp |   10 ++++++----
 utils/qv4l2/qv4l2.cpp       |   14 +++++++-------
 utils/qv4l2/v4l2-api.h      |    6 +++++-
 3 files changed, 18 insertions(+), 12 deletions(-)

---

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

diff --git a/utils/qv4l2/general-tab.cpp b/utils/qv4l2/general-tab.cpp
index 7478b6b..503c113 100644
--- a/utils/qv4l2/general-tab.cpp
+++ b/utils/qv4l2/general-tab.cpp
@@ -242,7 +242,7 @@ GeneralTab::GeneralTab(const QString &device, v4l2 &fd, int 
n, QWidget *parent)
 
        addLabel("Capture Method");
        m_capMethods = new QComboBox(parent);
-       if (m_querycap.capabilities & V4L2_CAP_STREAMING) {
+       if (caps() & V4L2_CAP_STREAMING) {
                v4l2_requestbuffers reqbuf;
 
                // Yuck. The videobuf framework does not accept a count of 0.
@@ -263,7 +263,7 @@ GeneralTab::GeneralTab(const QString &device, v4l2 &fd, int 
n, QWidget *parent)
                        reqbufs_mmap_cap(reqbuf, 0);
                }
        }
-       if (m_querycap.capabilities & V4L2_CAP_READWRITE) {
+       if (caps() & V4L2_CAP_READWRITE) {
                m_capMethods->addItem("read()", QVariant(methodRead));
        }
        addWidget(m_capMethods);
@@ -422,9 +422,10 @@ void GeneralTab::frameIntervalChanged(int idx)
 
        if (enum_frameintervals(frmival, m_pixelformat, m_width, m_height, idx)
            && frmival.type == V4L2_FRMIVAL_TYPE_DISCRETE) {
-               set_interval(frmival.discrete);
-               m_interval = frmival.discrete;
+               if (set_interval(frmival.discrete))
+                       m_interval = frmival.discrete;
        }
+       updateVidCapFormat();
 }
 
 void GeneralTab::vidOutFormatChanged(int idx)
@@ -702,6 +703,7 @@ void GeneralTab::updateVidCapFormat()
        m_width       = fmt.fmt.pix.width;
        m_height      = fmt.fmt.pix.height;
        updateFrameSize();
+       updateFrameInterval();
        if (enum_fmt_cap(desc, true)) {
                do {
                        if (desc.pixelformat == fmt.fmt.pix.pixelformat)
diff --git a/utils/qv4l2/qv4l2.cpp b/utils/qv4l2/qv4l2.cpp
index 1272a0d..336473c 100644
--- a/utils/qv4l2/qv4l2.cpp
+++ b/utils/qv4l2/qv4l2.cpp
@@ -200,8 +200,8 @@ void ApplicationWindow::capFrame()
                        err = v4lconvert_convert(m_convertData, 
&m_capSrcFormat, &m_capDestFormat,
                                m_frameData, s,
                                m_capImage->bits(), 
m_capDestFormat.fmt.pix.sizeimage);
-               else
-                       memcpy(m_capImage->bits(), m_frameData, s);
+               if (!m_mustConvert || err)
+                       memcpy(m_capImage->bits(), m_frameData, std::min(s, 
m_capImage->numBytes()));
                break;
 
        case methodMmap:
@@ -219,10 +219,10 @@ void ApplicationWindow::capFrame()
                                        &m_capSrcFormat, &m_capDestFormat,
                                        (unsigned char 
*)m_buffers[buf.index].start, buf.bytesused,
                                        m_capImage->bits(), 
m_capDestFormat.fmt.pix.sizeimage);
-                       else
+                       if (!m_mustConvert || err)
                                memcpy(m_capImage->bits(),
                                       (unsigned char 
*)m_buffers[buf.index].start,
-                                      buf.bytesused);
+                                      std::min(buf.bytesused, 
(unsigned)m_capImage->numBytes()));
                }
 
                qbuf(buf);
@@ -243,15 +243,15 @@ void ApplicationWindow::capFrame()
                                        &m_capSrcFormat, &m_capDestFormat,
                                        (unsigned char *)buf.m.userptr, 
buf.bytesused,
                                        m_capImage->bits(), 
m_capDestFormat.fmt.pix.sizeimage);
-                       else
+                       if (!m_mustConvert || err)
                                memcpy(m_capImage->bits(), (unsigned char 
*)buf.m.userptr,
-                                       buf.bytesused);
+                                      std::min(buf.bytesused, 
(unsigned)m_capImage->numBytes()));
                }
 
                qbuf(buf);
                break;
        }
-       if (err == -1)
+       if (err == -1 && m_frame == 0)
                error(v4lconvert_get_error_message(m_convertData));
 
        QString status;
diff --git a/utils/qv4l2/v4l2-api.h b/utils/qv4l2/v4l2-api.h
index b4876bc..4e1e52a 100644
--- a/utils/qv4l2/v4l2-api.h
+++ b/utils/qv4l2/v4l2-api.h
@@ -45,7 +45,11 @@ public:
 
        inline int fd() const { return m_fd; }
        inline bool useWrapper() const { return m_useWrapper; }
-       inline __u32 caps() const { return m_capability.capabilities; }
+       inline __u32 caps() const {
+               if (m_capability.capabilities & V4L2_CAP_DEVICE_CAPS)
+                       return m_capability.device_caps;
+               return m_capability.capabilities;
+       }
        inline const QString &device() const { return m_device; }
        static QString pixfmt2s(unsigned pixelformat);
 

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

Reply via email to