【问题描述】在友善之臂视频监控方案源码学习(4) - 数据流向一文中,对视频数据流向进行了简要阐述。本文对输入控制进行解析。
【解析】
1 涉及到的文件和目录
mjpg-streamer-mini2440-read-only/start_uvc.sh
mjpg-streamer-mini2440-read-only/mjpg_streamer.c
mjpg-streamer-mini2440-read-only/mjpg_streamer.h
mjpg-streamer-mini2440-read-only/plugins/input.h
mjpg-streamer-mini2440-read-only/plugins/input_uvc
2 输入结构
mjpg-streamer-mini2440-read-only/plugins目录下input.h中对input结构描述如下:
/* structure to store variables/functions for input plugin */
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);
};
友善之臂视频监控方案源码学习(1) - 架构分析一文,指出了该方案实质上就是实现了输入、输出的接口。从输入看,就是实现了init、stop、run、cmd函数指针。主程序中实际上,只调用了init、run接口。stop接口是在信号的回调函数void signal_handler(int sig);中调用的。
3 input_init分析
(1) 定义在mjpg-streamer-mini2440-read-only/plugins/input_uvc/Input_uvc.c文件中
(2) 在mjpg-streamer-mini2440-read-only/mjpg_streamer.c 的main函数中,默认的输入为:
char *input = "input_uvc.so --resolution 640x480 --fps 5 --device /dev/video0";
若-i参数不为空,则采用下述方法更新输入:
/* i, input */
case 2:
case 3:
input = strdup(optarg);
break;
传送给Input_uvc.c中input_init的参数为:
global.in.param.parameter_string = strchr(input, ' ');
下面分析mjpg-streamer-mini2440-read-only/plugins/input_uvc/input_uvc.c中的input_init接口。接口定义如下:
int in