项目-基于视频压缩的实时监控系统--tiny6410

项目-基于视频压缩的实时监控系统--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
");
        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.1.3事件处理函数void cam_Handler( int fd, void *arg )

      将图像的首地址赋值给

    3.2添加传输子系统net_sys_init();       

struct tcp_srv
{
 int sock;
};

struct tcp_cli
{
 int sock;
 char *buf;
 int len;
 struct sockaddr_in addr;
 struct event_ext *ev_rx;
 struct event_ext *ev_tx;

 unsigned char req[FRAME_MAX_SZ];
 unsigned char rsp[FRAME_MAX_SZ+VID_FRAME_MAX_SZ];
};

  

   

  4.等待事件发生且处理。

    

原文地址:https://www.cnblogs.com/ynxf/p/5732156.html