视频监控—mjpeg-streamer源码分析(1)-框架
- 硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3)
- 软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统
- 开发环境:arm-linux-gcc-4.3.2工具链、linux-3.4.2内核(开发版根文件系统)
- 源码仓库:https://gitee.com/d_1254436976/Embedded-Linux-Phase-3
目录
-
视频监控—mjpeg-streamer源码分析(1)-框架 - 一、mjpg-streamer的简单介绍
- 二、mjpg-streamer的框架
- 1、`globals`结构体管理
- 2、`in`输入插件
- 3、`output`输出插件
一、mjpg-streamer的简单介绍
??mjpg-streamer是一款免费基于IP地址的视频流服务器,它的输入插件从摄像头读取视频数据,这个输入插件产生视频数据并将视频数据复制到内存中,它有多个输出插件将这些视频数据经过处理,其中最重要的输出插件是网站服务器插件,它将视频数据传送到用户浏览器中.
??mjpg-streamer的工作就是将其中的一个输入插件和多个输出插件绑定在一起,所有的工作都是通过它的各个插件完成的。
二、mjpg-streamer的框架
1、globals
结构体管理
通过分析得到下图:
可以知道,整个mjpg-streame是由_globals
这个结构体进行管理的
struct _globals {int stop;/* signal fresh frames */pthread_mutex_t db;pthread_cond_t db_update;/* global JPG frame, this is more or less the "database" */unsigned char *buf;int size;/* input plugin */input in;/* output plugin */output out[MAX_OUTPUT_PLUGINS];int outcnt;};
在这个结构体中,主要分为如下3部分:buf
数据中转站,in
输入插件、out
输出插件
2、in
输入插件
由_input 结构体进行管理
typedef struct _input input;
struct _input {char *plugin;void *handle;input_parameter param;int (*init)(input_parameter *);int (*stop)(void);int (*run)(void);int (*cmd)(in_cmd_type, int);
};
对于mjpg-streamer,其设置了如下三种的输入方式,通过运行-i input_xxx.so
指定具体的调用库
每个调用库的主要函数为xxx_inti、xxx_stop、xxx_run
,其所做的事情如下:
其中在xxx_run函数中
,把数据存储到globals
结构体的buf
中,供输出插件来获取数据
3、output
输出插件
由 _output
结构体进行管理
typedef struct _output output;
struct _output {char *plugin;void *handle;output_parameter param;int (*init)(output_parameter *);int (*stop)(int);int (*run)(int);int (*cmd)(int, out_cmd_type, int);
};
对于mjpg-streamer,其设置了如下三种的输入方式,通过运行-o output_xxx.so
指定具体的调用库
每个调用库的主要函数为xxx_inti、xxx_stop、xxx_run
,其所做的事情如下:
其中在xxx_run函数中
,程序会把在in
输入插件中存储到globals
结构体的buf
中的数据取出