项目-基于视频压缩的实时监控系统--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[]; //设备名称
__u8 drv[]; //驱动名称
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 -;
}
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.等待事件发生且处理。

    

最新文章

  1. 对jquery操作复选框
  2. FTP 传输中的主动模式和被动模式
  3. C#页面添加提交数据后跳出小弹窗的功能
  4. OpenStack学习系列-----第二篇 由一个错误看理解整个架构的重要性
  5. OC 加密
  6. ssl https服务 需要 php5.3以上
  7. ECharts-百度地图使用
  8. 享元模式(Flyweight)
  9. Ubuntu 18.04 安装MySQL
  10. [java]创建一个默认TreeMap() key为什么不能为null
  11. xtrabackup 恢复单个表【转】
  12. Deep learnin简介
  13. 为Subline Text 3 添加支持ini文件语法高亮
  14. Spring JDBC NamedParameterJdbcTemplate类示例
  15. apktool 打包解包apk的总结
  16. 分布式缓存技术memcached学习系列(三)——memcached内存管理机制
  17. DotNet三层架构
  18. Web | 一小时看懂前端基本语法
  19. 清理网页中的HTML
  20. Spring MVC源码——Root WebApplicationContext

热门文章

  1. DEV控件:gridControl常用属性设置(转载)
  2. Java虚拟机JVM学习01 流程概述
  3. tableView的footerView下面的颜色修改、限制文本框的输入字数
  4. 搭建Maven私服-续
  5. Config文件
  6. 验证码做得不错,有.net 版本 https://captcha.com/
  7. jQuery 更改checkbox的状态,无效
  8. 【AdaBoost算法】弱分类器训练过程
  9. T-SQL基础--TOP
  10. SharePoint2010新特性:InfoPath定义创建列表的界面