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
This commit is contained in:
josh 2009-08-12 02:52:39 +00:00
parent 3f048de88d
commit 7b70159842
2 changed files with 30 additions and 1 deletions

View File

@ -8,6 +8,7 @@
#include <unistd.h>
#include <sys/mman.h> /* mmap() */
#include <errno.h>
#include <string.h> /* memset() */
#include <iostream>
#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;
}
}

View File

@ -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;