基于国嵌的H264的那个v4l项目,本人想改为V4L2,但是在板子上显示:
USB_video is OK
VIDIOC_S_FMT is OK
VIDIOC_REQBUFS is OK
buffers is OK
VIDIOC_QUERYBUF is OK
the buf length is 32768
the buf offset is 0
mmap is failed
VIDIOC_QBUF is OK
zc3xx: probe 2wr ov vga 0x0000
VIDIOC_STREAMON is OK
VIDIOC_DQBUF is OK
Segmentation fault
发现原来是mmap没有成功,原代码部分如下:
void init_video() /* bpp == bytes per pixel*/
{
int ret;
/*设备的打开*/
cam_fd = open( USB_VIDEO, O_NONBLOCK);
if( cam_fd<0 )
printf("Can't open video device\n");
else
printf("USB_video is OK\n");
CLEAR (fmt);
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 100;//帧宽
fmt.fmt.pix.height = 100;//帧高
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;//像素格式
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;//隔行扫描
//设置当前驱动的视频捕获格式
if (-1 == ioctl (cam_fd, VIDIOC_S_FMT, &fmt))
errno_exit ("VIDIOC_S_FMT");
else
printf("VIDIOC_S_FMT is OK\n");
struct v4l2_requestbuffers req;
CLEAR (req);
req.count = 1;//在缓存队列里保存多少张照片
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;//内存映射
/*向驱动申请帧缓冲,一般不超过5个。*/
if (-1 == ioctl (cam_fd, VIDIOC_REQBUFS, &req))
{
errno_exit ("VIDIOC_REQBUFS");
}
else
printf("VIDIOC_REQBUFS is OK\n");
buffers = calloc (req.count, sizeof (*buffers));//分配连续的内存给刚才申请的缓冲区,并且初始化为0,返回值是首地址(物理地址)
if (!buffers) {
fprintf (stderr, "Out of memory\n");
exit (EXIT_FAILURE);
}
else
printf("buffers is OK\n");
for (n_buffers = 0; n_buffers < req.count; ++n_buffers) {
struct v4l2_buffer buf;
CLEAR (buf);
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = n_buffers;//缓冲区序号
if (-1 == ioctl (cam_fd, VIDIOC_QUERYBUF, &buf))//把数据缓存转换成物理地址
errno_exit ("VIDIOC_QUERYBUF");
else
printf("VIDIOC_QUERYBUF is OK\n");
printf("the buf length is %d\n",buf.length);
printf("the buf offset is %d\n",buf.m.offset);
buffers[n_buffers].length = buf.length;
buffers[n_buffers].offset = (size_t) buf.m.offset;
//buffers[n_buffers].start= (char*)mmap (NULL, buf.length,PROT_READ | PROT_WRITE, MAP_SHARED, cam_fd, buf.m.offset);//确定被映射的内存地址
buffers[n_buffers].start = mmap(NULL, buf.length, PROT_READ | PROT_WRITE,
MAP_SHARED, cam_fd, buf.m.offset);
if (MAP_FAILED == buffers[n_buffers].start)
printf("mmap is failed\n");
else
printf("mmap is OK\n");
InitLookupTable();
}
}
求高人指教,究竟哪个地方错了!!!! |