【已找到root cause】UVC 摄像头预览失败,无法拍照
本帖最后由 heavenward 于 2016-2-3 14:44 编辑如题,系统版本是android5.1
第一次开启uvc摄像头预览正常,但是一拍照就会退出app。
再次尝试打开摄像头都会报下面的这种错误。
尝试在代码里搜reprocessFrame处理的函数,但是没有找到。
求助。。。
下面是出错的log:
3401:E/CameraHal(167): reprocessFrame(942): mjpeg data error!!
3402:E/CameraHal(167): reprocessFrame(942): mjpeg data error!!
3403:E/CameraHal(167): getFrame(614): getFrame(614): VIDIOC_DQBUF Failed!!! err
3404:E/CameraHal(167): getFrame(620): getFrame(620): camera driver or device may be error, so notify CAMERA_MSG_ERROR
2016/2/3 更新:
最后花了点时间,从hal层一直追到kernel uvc driver,最后终于发现问题的原因。
现象:
第一次打开uvc设备预览等一切正常,但是退出再重新打开或者拍照后回到预览界面时APP会崩溃退出。
原因:
kernel uvc driver内的uvc_video_complete_fun函数在检查urb_state时发现state为UrbDeactive,直接报错返回了
if (atomic_read(urb_state)==UrbDeactive) {
printk(KERN_DEBUG "urb is deactive, this urb complete cancel!");
uvc_queue_cancel(queue, urb->status == -ESHUTDOWN);
return;
}
造成deactive的原因是,上一次打开设备后调用了uvc_video_suspend函数,其中又调用了uvc_uninit_video函数将urb全部deactive了。
在第二次打开uvc设备时调用的uvc_video_resume函数中又调用了uvc_init_video_bulk进行uvc_stream的重新初始化,但是没有对Urb重新
active。导致第二次进入预览界面会造成urb数据获取不到的问题。
分析过程:
一开始追到hal层,发现每次get frame都会失败,而且总是报mjpeg data error。由于处理mjpeg frame的code没有开放,无法继续查下去。
为了排除hal层decode frame引起bug的嫌疑。从网上找了直接通过V4L2打开video设备的apk再次尝试。最后发现还是会报错。确认是driver的
问题。打开uvc的全部log,最后发现第二次进入preview状态时总是报Urb Deactive的error。最后添加log,找到对应的suspend和resume使用的
函数,将ACTIVE的流程添加进去。问题解决。
附件为patch:
patch使用方法,在SDK更目录下使用如下命令
patch -p0 < uvc.patch
没有人碰到过这个问题么? 厉害!受教了 楼主,厉害!谢谢分享! 也碰到这个问题,下了试下。 本帖最后由 xueyuking 于 2016-12-6 16:44 编辑
楼主,加入修改后可以拍照了,但有些分辩率下图像显示绿色,并且图像不完整 。请问你有遇到这种情况吗?
遇到了同样的问题,用了楼主的patch,问题解决
顺便看了一下UVC的代码,对于uvc_init_video_isoc 初始化的同步方法设备,里面有active方法,不存在这个问题;
对于uvc_init_video_bulk初始化的bulk方法设备,里面没有active方法,即存在这个bug,添加了楼主的方法之后,问题解决。
谢谢分享!! 我们也在调一款bulk模式的摄像头,也需要上面的问题,我们还有另外一个问题就是第一次也很大概率打不开,打开2秒就卡死,出现无法连接到相机的错误,这个有人解决过吗? 我的usb摄像头用了楼主的patch,很大的改善,楼主威武。 18682316023 发表于 2017-9-7 19:42
我的usb摄像头用了楼主的patch,很大的改善,楼主威武。
您好! 请问您是用的多大预览分辨率的USB摄像头?