Firefly开源社区

打印 上一主题 下一主题

【已找到root cause】UVC 摄像头预览失败,无法拍照

36

积分

0

威望

0

贡献

技术小白

积分
36

【已找到root cause】UVC 摄像头预览失败,无法拍照

发表于 2016-1-28 16:58:15      浏览:45747 | 回复:37        打印     [复制链接] 楼主
本帖最后由 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, 下载次数: 491, 下载积分: 灯泡 -1 , 经验 -1

patch文件

回复

使用道具 举报

36

积分

0

威望

0

贡献

技术小白

积分
36
发表于 2016-1-29 16:41:32      沙发
没有人碰到过这个问题么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表