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 UVC support
Author:  Hans Verkuil <hverk...@xs4all.nl>
Date:    Sat Mar 13 23:19:48 2010 +0100

The workaround for drivers using videobuf broke the UVC support.
Fix this.

Signed-off-by: Hans Verkuil <hverk...@xs4all.nl>

 utils/qv4l2-qt4/general-tab.cpp |   18 +++++++++++++++---
 utils/qv4l2-qt4/qv4l2.cpp       |    4 +++-
 2 files changed, 18 insertions(+), 4 deletions(-)

---

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

diff --git a/utils/qv4l2-qt4/general-tab.cpp b/utils/qv4l2-qt4/general-tab.cpp
index 50a3edc..cb8d37b 100644
--- a/utils/qv4l2-qt4/general-tab.cpp
+++ b/utils/qv4l2-qt4/general-tab.cpp
@@ -198,11 +198,23 @@ GeneralTab::GeneralTab(const QString &device, v4l2 &fd, 
int n, QWidget *parent)
        if (m_querycap.capabilities & V4L2_CAP_STREAMING) {
                v4l2_requestbuffers reqbuf;
 
-               if (reqbufs_user_cap(reqbuf, 1))
+               // Yuck. The videobuf framework does not accept a count of 0.
+               // This is out-of-spec, but it means that the only way to test 
which
+               // method is supported is to give it a non-zero count. But 
non-videobuf
+               // drivers like uvc do not allow e.g. S_FMT calls after a 
REQBUFS call
+               // with non-zero counts unless there is a REQBUFS call with 
count == 0
+               // in between. This is actual proper behavior, although somewhat
+               // unexpected. So the only way at the moment to do this that 
works
+               // everywhere is to call REQBUFS with a count of 1, and then 
again with
+               // a count of 0.
+               if (reqbufs_user_cap(reqbuf, 1)) {
                        m_capMethods->addItem("User pointer I/O", 
QVariant(methodUser));
-
-               if (reqbufs_mmap_cap(reqbuf, 1))
+                       reqbufs_user_cap(reqbuf, 0);
+               }
+               if (reqbufs_mmap_cap(reqbuf, 1)) {
                        m_capMethods->addItem("Memory mapped I/O", 
QVariant(methodMmap));
+                       reqbufs_mmap_cap(reqbuf, 0);
+               }
        }
        if (m_querycap.capabilities & V4L2_CAP_READWRITE) {
                m_capMethods->addItem("read()", QVariant(methodRead));
diff --git a/utils/qv4l2-qt4/qv4l2.cpp b/utils/qv4l2-qt4/qv4l2.cpp
index 96cb4d7..63881be 100644
--- a/utils/qv4l2-qt4/qv4l2.cpp
+++ b/utils/qv4l2-qt4/qv4l2.cpp
@@ -352,7 +352,7 @@ void ApplicationWindow::stopCapture()
                        if (-1 == munmap(m_buffers[i].start, 
m_buffers[i].length))
                                perror("munmap");
                // Free all buffers.
-               reqbufs_mmap_out(reqbufs, 0);
+               reqbufs_mmap_cap(reqbufs, 0);
                break;
 
        case methodUser:
@@ -360,6 +360,8 @@ void ApplicationWindow::stopCapture()
                        perror("VIDIOC_STREAMOFF");
                for (i = 0; i < m_nbuffers; ++i)
                        free(m_buffers[i].start);
+               // Free all buffers.
+               reqbufs_user_cap(reqbufs, 0);
                break;
        }
        free(m_buffers);

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to