int main (int argc,char ** argv)
{
struct v4l2_capability cap;
struct v4l2_cropcap cropcap;
struct v4l2_crop crop;
struct v4l2_format fmt,fmt1;
unsigned int i;
int ret;
// enum v4l2_buf_type type;
cam_fd = open (dev_name, O_RDWR);
ret=xioctl (cam_fd, VIDIOC_QUERYCAP, &cap);
printf("Debug...........VIDIOC_QUERYCAP: \n driver is: %s!\n card is: %s!\n bus_info is: %s!\n version is: %d!\n capabilities is: 0x%x!\n\n",
cap.driver,cap.card,cap.bus_info,cap.version,cap.capabilities);
CLEAR(cropcap);
cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
ret=xioctl(cam_fd,VIDIOC_CROPCAP,&cropcap);
if(ret==0){
crop.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
crop.c=cropcap.defrect;
printf("Debug...........VIDIOC_CROPCAP: \n cropcap.defrect.height is: %d!\n cropcap.defrect.width is: %d!\n",
cropcap.defrect.height,cropcap.defrect.width);
}
CLEAR (fmt);
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 640;
fmt.fmt.pix.height = 480;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
ret=xioctl (cam_fd, VIDIOC_S_FMT, &fmt);
if (ret==0){
printf("Debug...........VIDIOC_S_FMT: ret=%d \n",ret);
CLEAR (fmt1);
fmt1.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
ret=xioctl(cam_fd,VIDIOC_G_FMT,&fmt1);
if(ret==0)
printf("Debug...........VIDIOC_G_FMT: ret=%d\n pix.width is:%d\n pix.pixelformat is :0x%x\n\n",
ret,fmt1.fmt.pix.width,fmt1.fmt.pix.pixelformat);
}
struct v4l2_requestbuffers req;
CLEAR (req);
req.count =4;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
ret=xioctl (cam_fd, VIDIOC_REQBUFS, &req);
printf("Debug........ VIDIOC_REQBUFS: \n ret= %d\n req.count=%d,\n",ret,req.count);
struct buffer *vbuffer = calloc( req.count, sizeof(*vbuffer) );
if (vbuffer!=NULL)
printf("Debug...........sizeof(VideoBuffer) is %d\n",sizeof(struct buffer));
struct v4l2_buffer buf;
for (i = 0; i < req.count; i++) {
CLEAR(buf);
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = i;
ret=xioctl(cam_fd, VIDIOC_QUERYBUF, &buf);
printf("Debug........... ret=%d\n",ret);
if (ret < 0) {
printf("VIDIOC_QUERYBUF error\n");
//return -1;
}
else {
printf("Debug...........buf len is %d\n",sizeof(buf));
vbuffer.length = buf.length;
//vbuffer.offset = (size_t) buf.m.offset;
vbuffer.start = mmap (NULL, buf.length,PROT_READ | PROT_WRITE, MAP_SHARED, cam_fd, buf.m.offset);
printf("Debug...........\n i=%d\n",i);
printf("buf2 len is %d\n",sizeof(vbuffer.start));
if (vbuffer.start == MAP_FAILED) {
perror("buffers error\n");
//return -1;
}
if (ioctl (cam_fd, VIDIOC_QBUF, &buf) < 0) {
printf("VIDIOC_QBUF error\n");
//return -1;
}
}
}
close(cam_fd);
粘上我的代码。
友善给出的camtest 是使用 V4L2_BUF_TYPE_VIDEO_OVERLAY 方式,我所说的驱动中的问题是指是否支持 V4L2_BUF_TYPE_VIDEO_CAPTURE方式。