Firefly开源社区

1234
发表新贴
打印 上一主题 下一主题

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

36

积分

0

威望

0

贡献

技术小白

积分
36

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

发表于 2016-1-28 16:58:15      浏览:80418 | 回复: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文件

回复

使用道具 举报

36

积分

0

威望

0

贡献

技术小白

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

使用道具 举报

22

积分

0

威望

0

贡献

游客

积分
22
发表于 2016-3-24 14:14:06        只看该作者  板凳
厉害!受教了
回复

使用道具 举报

16

积分

0

威望

0

贡献

游客

积分
16
发表于 2016-6-22 16:37:18        只看该作者  地板
楼主,厉害!谢谢分享!
回复

使用道具 举报

620

积分

0

威望

0

贡献

技术大神

Rank: 3Rank: 3

积分
620
发表于 2016-12-6 15:14:44        只看该作者  5#
也碰到这个问题,下了试下。
回复

使用道具 举报

620

积分

0

威望

0

贡献

技术大神

Rank: 3Rank: 3

积分
620
发表于 2016-12-6 15:41:11        只看该作者  6#
本帖最后由 xueyuking 于 2016-12-6 16:44 编辑

楼主,加入修改后可以拍照了,但有些分辩率下图像显示绿色,并且图像不完整 。请问你有遇到这种情况吗?
回复

使用道具 举报

19

积分

0

威望

0

贡献

技术小白

积分
19
发表于 2017-5-17 17:37:42        只看该作者  7#
遇到了同样的问题,用了楼主的patch,问题解决
顺便看了一下UVC的代码,对于uvc_init_video_isoc 初始化的同步方法设备,里面有active方法,不存在这个问题;
对于uvc_init_video_bulk初始化的bulk方法设备,里面没有active方法,即存在这个bug,添加了楼主的方法之后,问题解决。
谢谢分享!!
回复

使用道具 举报

11

积分

0

威望

0

贡献

游客

积分
11
发表于 2017-7-27 15:48:33        只看该作者  8#
我们也在调一款bulk模式的摄像头,也需要上面的问题,我们还有另外一个问题就是第一次也很大概率打不开,打开2秒就卡死,出现无法连接到相机的错误,这个有人解决过吗?
回复

使用道具 举报

19

积分

0

威望

0

贡献

游客

积分
19
发表于 2017-9-7 19:42:33        只看该作者  9#
我的usb摄像头用了楼主的patch,很大的改善,楼主威武。
回复

使用道具 举报

44

积分

0

威望

0

贡献

技术小白

积分
44
发表于 2017-9-20 15:23:05        只看该作者  10#
18682316023 发表于 2017-9-7 19:42
我的usb摄像头用了楼主的patch,很大的改善,楼主威武。

您好! 请问您是用的多大预览分辨率的USB摄像头?
回复

使用道具 举报

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

本版积分规则

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