From 7b70159842fcd93bc7cbd025305f58202fcf4b0c Mon Sep 17 00:00:00 2001 From: josh Date: Wed, 12 Aug 2009 02:52:39 +0000 Subject: [PATCH] added setFormat() to call ioctl VIDIOC_S_FMT and deallocating a buffer no longer blocks!! git-svn-id: svn://anubis/misc/WebcamTracker@125 bd8a9e45-a331-0410-811e-c64571078777 --- WebcamTracker.cc | 30 +++++++++++++++++++++++++++++- WebcamTracker.h | 1 + 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/WebcamTracker.cc b/WebcamTracker.cc index 9329730..5cb76ac 100644 --- a/WebcamTracker.cc +++ b/WebcamTracker.cc @@ -8,6 +8,7 @@ #include #include /* mmap() */ #include +#include /* memset() */ #include #include "WebcamTracker.h" using namespace std; @@ -58,6 +59,7 @@ bool WebcamTracker::open(const char * device) void WebcamTracker::start() { + setFormat(); requestBuffers(20); for (int i = 0; i < m_numbufs; i++) { @@ -91,7 +93,6 @@ void WebcamTracker::requestBuffers(int num) else { m_numbufs = reqbuf.count; - cout << "Got " << m_numbufs << " buffers" << endl; m_buffers = new void *[m_numbufs]; m_lengths = new int[m_numbufs]; } @@ -238,3 +239,30 @@ WebcamTracker::~WebcamTracker() close(m_fd); } } + +void WebcamTracker::setFormat() +{ + v4l2_format fmt; + memset(&fmt, 0, sizeof(fmt)); + fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + int ret = ioctl(m_fd, VIDIOC_G_FMT, &fmt); + if (ret != 0) + { + cerr << "Warning: VIDIOC_G_FMT ioctl failed, errno " << errno; + if (errno == EBUSY) + cerr << " (EBUSY)"; + if (errno == EINVAL) + cerr << " (EINVAL)"; + cerr << endl; + } + cerr << "width: " << fmt.fmt.pix.width << endl; + cerr << "height: " << fmt.fmt.pix.height << endl; + cerr << "pixelformat: " << fmt.fmt.pix.pixelformat << endl; + cerr << "field: " << fmt.fmt.pix.field << endl; + cerr << "bytesperline: " << fmt.fmt.pix.bytesperline << endl; + ret = ioctl(m_fd, VIDIOC_S_FMT, &fmt); + if (ret != 0) + { + cerr << "Warning: VIDIOC_S_FMT ioctl failed, errno " << errno << endl; + } +} diff --git a/WebcamTracker.h b/WebcamTracker.h index b19463f..6f972fe 100644 --- a/WebcamTracker.h +++ b/WebcamTracker.h @@ -25,6 +25,7 @@ class WebcamTracker void dequeueBuffer(v4l2_buffer * dqbuf); void unmapBuffer(int i); void freeBuffers(); + void setFormat(); bool m_open; int m_fd;