第2课第1.1_18节_讲解mjpg-streamer_4_源码分析(中)_输入通道_视频采集过程_P

通过上节对主函数的分析发现,主函数会以此调用以下四个函数:

input_init();   //在文件input_uvc.c文件中

output_init();  //也在文件input_uvc.c文件中

input_run();

output_run();

 

 

 

       input_init();会调用init_v4l2函数,进而调用那那11个ioctrl函数中的前几个,只执行到将一个新的缓冲区挂接到缓冲区队列中(QBUF)。调用完init_v4l2这个函数,就会分配一个临时缓冲区,用来接收摄像头数据,不同的摄像头输出格式(MIPEG/YUV)有不同的分类方式。

       input_run();函数会先给仓库分配一段内存空间,然后创建一个线程。在线程执行函数中,会进入一个循环,只要不stop(按下ctrl+c),就会一直获取一帧图像数据(uvcGrab函数)。uvcGrab函数中的执行过程如下:首先使能视频捕获设备(STREAMON),然后从缓冲区队列中取出一个缓冲区(DQBUF),如果取出的数据是MJPEG格式,则放入videoIn->tempbuffer中,如果是YUV,则放入videoIn->framebuffer中。视频数据拷贝完以后执行QBUF这个iotrl。

跳出uvcGrab函数函数后,则进入一段原子操作(这段代码不能同时被两个线程执行)。在这段原子操作中,会判断上面所取出的数据是不是YUV格式,若是YUV,则进行转换(YUV->RGB->JPEG,会用到libjpeg库),然后存放到仓库当中。如果数据是MJPEG,则直接存入仓库。在接下来就会发出数据更新的信号,通知发送通道来取数据。

 

 

 

猜你喜欢

转载自blog.csdn.net/hahaha_2017/article/details/81809326
今日推荐