camera初始化失败的一个奇怪问题

最近的工作中遇到一个camera的奇怪的问题,特做记录。


平台:权智 A10 ;

系统:android 4.0.3;

工作内容:视频通话功能,使用ioctl命令操作摄像头的驱动节点,捕获图像,交给硬件编码器做264编码,然后rtp发送出去。

代码逻辑:初始化接口里init camera,申请4个buf,然后创建一个camer线程和一个enc线程。

    在camera线程里,如果有空闲buf,则调用 VIDIOC_DQBUF ,获取图像;没有空闲buf,则continue;

                    在enc线程里,检查有没有准备好的buf,有的话就把图像数据送给硬件编码器,编码完毕调用 VIDIOC_QBUF ,释放这个buf;

遇到问题:压力测试一段时间后(有可能是一个月,也可能是一天),init camera失败,具体是 VIDIOC_QUERYBUF 命令报错。当出错一次之后,每次都是这个错,

除非重启系统,无法恢复。


问题debug:VIDIOC_QUERYBUF 出错,是申请buf失败,buf的申请和释放都是在v4l2的驱动里完成的,在streamoff的时候,还会释放所有的buf。首先怀疑我对

camera驱动的ioctl调用有问题,但是核对过调用流程,发现只有一点不一样,那就是qbuf和dqbuf的调用逻辑不一样。别的资料里面都是单

任务里面 dqbuf -> use buf -> qbuf ,而我是多任务操作,也就是说,当qbuf和dqbuf不配对的时候,v4l2的驱动可否运转正常?于是我合并了camera 线程和enc线程,

测试了几天,没有发现问题。


后记:这个问题在之前几个月很少发生,印象中一个月难发生2次,但是上个星期突然频繁了起来,一天就可以发生2次,了解到驱动那边有人修改了v4l2初始化的一个

问题,s_input命令会调用设备驱动的init函数配置camera寄存器,init失败却没有返回-1,他们修改的时候直接把open标志赋值为零,这个修改明显是有问题的。可能

是导致camera频繁初始化失败的原因。s_input的问题和qbuf、dqbuf都修改了才做的测试,也不能确定根源上是谁的问题,先记录一下吧。

你可能感兴趣的:(linux编程)