标签:
项目-基于视频压缩的实时监控系统--tiny6410
@国嵌linux学习笔记。
1. 构造服务端结构体 server
struct server { int epfd; //保存epoll指针 struct cam *cam; //采集子系统 struct tcp_srv *srv; //传输子系统 struct cfg *cfg; //配置子系统 };
struct server *srv_main;
2.创建epoll,将返回值保存到srv_main->epfd;
3.让子系统自己添加事件,并将子系统的结构体指针保存到 srv_main 中。
3.1 添加采集子系统 cam_sys_init();
构造采集子系统结构
/*图像信息数据*/ struct buf { void *start; //图像起始地址 int len; //图像长度 }; /*摄像头数据*/ struct v4l2_dev { int fd; //保存设备文件的指针 __u8 name[32]; //设备名称 __u8 drv[16]; //驱动名称 struct buf *buf; struct event_ext *ev; struct cam *arg; }; struct cam { struct v4l2_dev *v4l2_dev; //摄像头设备 struct buf tran_frm; //图像数据 __u32 tran_frm_max_size; //最大图像数据长度 };
3.1.1初始化摄像头v4l2_init();
3.1.1.1 打开设备文件
v->fd = open("/dev/video2",O_RDWR|O_NONBLOCK);
3.1.1.2获取驱动信息
ioctl( v->fd, VIDIOC_QUERYCAP, &cap); if( !(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) ) { printf("this is not a video device\n"); return -1; } strcpy((char *)v->name,(char *)cap.card); strcpy((char *)v->drv,(char *)cap.driver);
3.1.1.3设置图像格式
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.width = 320; fmt.fmt.pix.height = 240; fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; ioctl( v->fd, VIDIOC_S_FMT, &fmt );
3.1.1.4申请图像缓存区
req.count = 4; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP; ioctl( v->fd, VIDIOC_REQBUFS, &req );
3.1.1.5把内核空间映射到用户空间
v->buf = calloc( 4, sizeof(struct buf) ); for( i=0; i<req.count; i++ ) { buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = i; ioctl( v->fd, VIDIOC_QUERYBUF, &buf ); v->buf[i].len = buf.length; v->buf[i].start = mmap( NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, v->fd,buf.m.offset); }
3.1.1.6图像缓存入队
for( i=0; i<4; i++ ) { buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = i; ioctl( v->fd, VIDIOC_QBUF, &buf ); }
3.1.2将采集子系统的事件加入到epoll池
v4l2_start_capture( cam->v4l2_dev );
3.2添加传输子系统net_sys_init();
4.等待事件发生且处理。
标签:
原文地址:http://www.cnblogs.com/ynxf/p/5732156.html