|
【已找到root cause】UVC 摄像头预览失败,无法拍照
发表于 2016-1-28 16:58:15
浏览:83758
|
回复:39
打印
只看该作者
[复制链接]
楼主
本帖最后由 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[I/O error]
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
|
-
-
uvc.zip
455 Bytes, 下载次数: 495, 下载积分: 灯泡 -1 , 经验 -1
patch文件
|