Hello video gurus. I didn't see this mentioned and was hoping someone
might see a mistake I'm making.
When my v4l2 application makes a call to mmap (after successful
VIDIOC_REQBUFS and VIDIOC_QUERYBUF calls) mmap returns error,
with errno = 13 (EACCES? - Permission Denied)) - The application
is running as root. - I've attached my modules, dmesg output,
and a code snippet below. Any ideas? xawtv works fine, and
I've written applications using the v4l 1 interface on this
system (with bttv 0.7) without problems. I'm using the slightly
older v4l2 bttv (0.8.46) because some legacy code I have didn't compile
on the newer 0.9 stuff... (videodev(2).h differences).
Any suggestions would be greatly appreciated. The capture
device is a hauppauge wintv.
I am running the 2.4.19 kernel with the v4l2 patch from
the "oldstuff" section, and using bttv 0.8.46. I didn't see EACCES
in the bttv module, so I'm wondering if I've found the wrong errno and
am chasing a wild goose...
My modules installed:
Module Size Used by Not tainted
bttv 76416 0
video-buf 8928 0 [bttv]
v4l2-common 4488 0 [bttv]
videodev 5472 2 [bttv]
i2c-algo-bit 7084 1 [bttv]
i2c-core 12768 0 [bttv i2c-algo-bit]
usbserial 17728 0 (unused)
dmesg after I have installed the bttv module:
bttv0: unloading
i2c-core.o: adapter unregistered: bt848 #0
bttv: driver version 0.8.46 loaded [v4l/v4l2]
bttv: using 8 buffers with 2080k (520 pages) each for capture
bttv: Host bridge is Silicon Integrated Systems [SiS] 730 Host
bttv: Bt8xx card found (0).
PCI: Found IRQ 5 for device 00:09.0
PCI: Sharing IRQ 5 with 00:09.1
bttv0: Bt878 (rev 2) at 00:09.0, irq: 5, latency: 64, mmio: 0xcfdfc000
bttv0: detected: Hauppauge WinTV [card=10], PCI subsystem ID is 0070:13eb
bttv0: using: BT878(Hauppauge (bt878)) [card=10,autodetected]
bttv0: risc main @ 01e30000
bttv0: Hauppauge/Voodoo msp34xx: reset line init [5]
i2c-core.o: adapter bt848 #0 registered as adapter 0.
bttv0: Hauppauge eeprom: model=61111, tuner=Philips FI1236 MK2 (2), radio=no
bttv0: using tuner=2
bttv0: i2c: checking for MSP34xx @ 0x80... found
bttv0: i2c: checking for TDA9875 @ 0xb0... not found
bttv0: i2c: checking for TDA7432 @ 0x8a... not found
bttv0: registered device video0
bttv0: registered device vbi0
bttv0: video mux: input=0 mux=2
bttv0: PLL: 28636363 => 35468950 .. ok
After my application has started:
bttv: open minor=0
bttv0: open called (video)
vbuf: mmap setup: 8 buffers, 40960 bytes each
vbuf: init kernel [10 pages]
bttv0: buffer flags: odd format: 4:2:2, packed, YUYV size: 160x120
The bit of code of interest: (From the capture library of CMVision)
// Open the video device
vid_fd = open(device, O_RDONLY);
if(vid_fd == -1){
printf("Could not open video device [%s]\n",device);
return(false);
}
fmt.type = V4L2_BUF_TYPE_CAPTURE;
err = ioctl(vid_fd, VIDIOC_G_FMT, &fmt);
if(err){
printf("G_FMT returned error %d\n",errno);
return(false);
}
// Set video format
fmt.fmt.pix.width = nwidth;
fmt.fmt.pix.height = nheight;
fmt.fmt.pix.pixelformat = nfmt;
if(true){
// attempt double framerate
fmt.fmt.pix.flags = V4L2_FMT_FLAG_TOPFIELD; // |V4L2_FMT_FLAG_BOTFIELD;
/*
fmt.fmt.pix.flags = (fmt.fmt.pix.flags |
V4L2_FMT_FLAG_TOPFIELD | V4L2_FMT_FLAG_BOTFIELD) &
~V4L2_FMT_FLAG_INTERLACED;
*/
}else{
fmt.fmt.pix.flags = fmt.fmt.pix.flags | V4L2_FMT_FLAG_INTERLACED;
}
err = ioctl(vid_fd, VIDIOC_S_FMT, &fmt);
if(err){
printf("S_FMT returned error %d\n",errno);
perror("S_FMT:");
return(false);
}
// Request mmap-able capture buffers
req.count = STREAMBUFS;
req.type = V4L2_BUF_TYPE_CAPTURE;
err = ioctl(vid_fd, VIDIOC_REQBUFS, &req);
if(err < 0 || req.count < 1){
printf("REQBUFS returned error %d, count %d\n",
errno,req.count);
return(false);
}
for(i=0; i<req.count; i++){
vimage[i].vidbuf.index = i;
vimage[i].vidbuf.type = V4L2_BUF_TYPE_CAPTURE;
err = ioctl(vid_fd, VIDIOC_QUERYBUF, &vimage[i].vidbuf);
if(err < 0){
printf("QUERYBUF returned error %d\n",errno);
return(false);
}
/* This call to mmap is returning EACCES (13) */
vimage[i].data = (char*)mmap(0, vimage[i].vidbuf.length, PROT_WRITE |
PROT_READ, MAP_SHARED, vid_fd, vimage[i].vidbuf.offset);
if((int)vimage[i].data == -1){
printf("mmap() returned error %d\n", errno);
return(false);
}
} /* End for */
--
video4linux-list mailing list
Unsubscribe mailto:[EMAIL PROTECTED]?subject=unsubscribe
https://listman.redhat.com/mailman/listinfo/video4linux-list