源码输入组件分析
当选择使用USB摄像头时,input_uvc将是一个必选的输入组件,其主要功能是获取摄像头拍摄的图像并进行压缩编码,并将处理好的图像复制到全局图像缓存区。此输入组件文件参照关系如图4.7所示。
图4.7 输入组件input_uvc文件参照关系
与其他组件一样它有5个接口函数分别为input_init、input_run、input_stop、input_cmd、help。具体函数定义在input_uvc.c文件内。下面重点对前三个函数进行分析,了解具体的模块化设计思路及图像输入的工作原理。input_init为输入组件初始化函数,其工作流程如图4.8所示。
图4.8 input_init操作流程
在初始化函数中用到的网络摄像头设备描述数据结构,它包含了V4L2接口信息、图片高宽、图片格式、从摄像头抓取方式等,具体的数据结构vdIn定义如下:
struct vdIn {
int fd;
char *videodevice;
char *status;
char *pictName;
struct v4l2_capability cap;
struct v4l2_format fmt;
struct v4l2_buffer buf;
struct v4l2_requestbuffers rb;
void *mem[NB_BUFFER];
unsigned char *tmpbuffer;
unsigned char*framebuffer;
int isstreaming;
int grabmethod;
int width;
int height;
int fps;
int formatIn;
int formatOut;
int framesizeIn;
int signalquit;
int toggleAvi;
int getPict;
int rawFrameCapture;
/* raw frame capture */
unsigned int fileCounter;
/* raw frame streamcapture */
unsigned intrfsFramesWritten;
unsigned intrfsBytesWritten;
/* raw stream capture */
FILE *captureFile;
unsigned intframesWritten;
unsigned int bytesWritten;
int framecount;
int recordstart;
int recordtime;
};
在input_run函数中创建了描述符为cam的线程,线程调用函数为cam_thread,然后调用pthread_detach(cam),将此线程设置为detached(分离状态),这样一来该线程运行结束后会自动释放所有资源,且不必阻塞其他线程而等待它结束。工作线程cam_thread的操作流程如图4.9所示。
图4.9 工作线程cam_thread操作流程