My apologies -- I just figured this out. First of all, I had forgotten mmap
returned MAP_FAILED, not NULL, if it fails, and the real failure was in the
mmap() call. Secondly, and most importantly, mmap() needed a MAP_SHARED flag.
----- Original Message -----
From: "Paul Forgey" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, December 23, 2002 2:19 AM
Subject: streaming capture problem at VIDIOC_QBUF
I'm trying to write a simple application to do streaming capture from a bt878.
Specifically, this is a Hauppage WinTV 401 (identifies in kernel log as
card=10). bttv-0.9.3 on kernel 2.4.18, patched for the v4l2 api. Running the
bttv.o and video-buf.o from bttv-0.9.3 rather than the bttv.o supplied with the
2.4 kernel.
I can read() the frames just fine, although only at 10 frames per second.
mmaping fails when I get to the VIDIOC_QBUF step with the ever helpful EINVAL.
What am I doing wrong?? I've enclosed the relavent section of code (temporary
crap code to learn the api with).
memset (&requestbuffers, 0, sizeof (requestbuffers));
requestbuffers.count = 4;
requestbuffers.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
requestbuffers.memory = V4L2_MEMORY_MMAP;
r = ioctl (vd, VIDIOC_REQBUFS, &requestbuffers);
if (r < 0)
{
perror ("VIDIOC_REQBUFS");
return 1;
}
printf ("allocating %d buffers\n", requestbuffers.count);
buffers = calloc (sizeof (*buffers), requestbuffers.count);
map_buffers = calloc (sizeof (void *), requestbuffers.count);
if (!buffers || !map_buffers)
{
fprintf (stderr, "out of memory\n");
return 1;
}
for (i = 0; i < requestbuffers.count; i++)
{
buffers[i].index = i;
buffers[i].type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
r = ioctl (vd, VIDIOC_QUERYBUF, &buffers[i]);
if (r < 0)
{
perror ("VIDIOC_QUERYBUF");
while (--i)
munmap (map_buffers[i], buffers[i].length);
return 1;
}
map_buffers[i] = mmap (NULL, buffers[i].length, PROT_READ | PROT_WRITE,
0, vd, buffers[i].m.offset);
if (!map_buffers[i])
{
perror ("mmap");
while (--i)
munmap (map_buffers[i], buffers[i].length);
return 1;
}
printf ("mapped buffer %d length %d offset %d\n",
buffers[i].index, buffers[i].length, buffers[i].m.offset);
}
for (i = 0; i < requestbuffers.count; i++)
{
/*********** fails with EINVAL */
r = ioctl (vd, VIDIOC_QBUF, &buffers[i]);
if (r < 0)
{
perror ("VIDIOC_QBUF");
goto done;
}
}
buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
r = ioctl (vd, VIDIOC_STREAMON, &buf_type);
if (r < 0)
{
perror ("VIDIOC_STREAMON");
goto done;
}
--
video4linux-list mailing list
Unsubscribe mailto:[EMAIL PROTECTED]?subject=unsubscribe
https://listman.redhat.com/mailman/listinfo/video4linux-list