Android之Camera预览过程中插拔摄像头节点后移
2013-12-11 10:19
489 查看
现象:
在使用Camera Preview时;热插拔摄像头会导致设备节点由/dev/video0变为/dev/video1,或者插入多个video设备时,会变为/dev/video1、/dev/video2......。
一、首先看设备节点的创建
drivers/media/video/uvc/uvc_driver.c
drivers/media/video/v4l2-devices.c
drivers/media/video/v4l2-dev.c
二、问题解决
最终修改,问题解决:
drivers/media/video/uvc/uvc_driver.c
我的修改:
drivers/media/video/v4l2-dev.c
1.这是一个网友在HAL层的解决办法
http://blog.csdn.net/rachel_rq/article/details/7545332
2.我们在HAL的解决办法
hardware/amlogic/camera/AppCallbackNotifier.cpp
在使用Camera Preview时;热插拔摄像头会导致设备节点由/dev/video0变为/dev/video1,或者插入多个video设备时,会变为/dev/video1、/dev/video2......。
一、首先看设备节点的创建
drivers/media/video/uvc/uvc_driver.c
static int uvc_probe(struct usb_interface *intf, const struct usb_device_id *id){ if (v4l2_device_register(&intf->dev, &dev->vdev) < 0) goto error; }
drivers/media/video/v4l2-devices.c
int v4l2_device_register_subdev_nodes(struct v4l2_device *v4l2_dev) { err = __video_register_device(vdev, VFL_TYPE_SUBDEV, -1, 1, sd->owner); }
drivers/media/video/v4l2-dev.c
int __video_register_device(struct video_device *vdev, int type, int nr, int warn_if_nr_in_use, struct module *owner){ int nr = -1; int minor_cnt = 64; nr = devnode_find(vdev, nr == -1 ? 0 : nr, minor_cnt); //设备节点名,即“/dev/video*” vdev->num = nr; devnode_set(vdev); //该vdev->numd对应的符号被置为1 /* devnode_set(vdev); //该vdev->numd对应的符号被置为1 devnode_clear(vdev); //该vdev->numd对应的符号被置为0 */ name_base = "video"; dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num); ret = device_register(&vdev->dev); vdev->dev.release = v4l2_device_release; //该接口会调用devnode_clear(vdev) }
二、问题解决
最终修改,问题解决:
drivers/media/video/uvc/uvc_driver.c
static void uvc_disconnect(struct usb_interface *intf){ uvc_unregister_video(dev); } static void uvc_unregister_video(struct uvc_device *dev){ video_unregister_device(stream->vdev); //修改该接口函数 if (atomic_dec_and_test(&dev->nstreams)){ //这里也有些问题,但不是根本原因 uvc_delete(dev); } }
我的修改:
drivers/media/video/v4l2-dev.c
void video_unregister_device(struct video_device *vdev){ devnode_clear(vdev);//add by tankai device_unregister(&vdev->dev); //该接口本身会调用v4l2_device_release,但却没有 }三、其他解决办法
1.这是一个网友在HAL层的解决办法
http://blog.csdn.net/rachel_rq/article/details/7545332
2.我们在HAL的解决办法
hardware/amlogic/camera/AppCallbackNotifier.cpp
//All sub-components of Camera HAL call this whenever any error happens void AppCallbackNotifier::errorNotify(int error) { LOG_FUNCTION_NAME; CAMHAL_LOGEB("AppCallbackNotifier received error %d", error); // If it is a fatal error abort here! if((error == CAMERA_ERROR_FATAL) || (error == CAMERA_ERROR_HARD)) { //We kill media server if we encounter these errors as there is //no point continuing and apps also don't handle errors other //than media server death always. abort(); return; } if ( ( NULL != mCameraHal ) && ( NULL != mNotifyCb ) && ( mCameraHal->msgTypeEnabled(CAMERA_MSG_ERROR) ) ) { CAMHAL_LOGEB("AppCallbackNotifier mNotifyCb %d", error); mNotifyCb(CAMERA_MSG_ERROR, CAMERA_ERROR_UNKNOWN, 0, mCallbackCookie); mCameraHal->release(); //add by tankai } LOG_FUNCTION_NAME_EXIT; }
相关文章推荐
- Android系统Camera参数设置&&Android之Camera拍照 && Android之Camera预览过程中插拔摄像头节点后移
- Android之USB Camera摄像头节点后移
- android通过camera和surfaceview选择摄像头并即时预览
- Android 实例讲解自定义Camera拍照和预览以及前后置摄像头切换
- cocos2d-x嵌入android的camera 实现前后摄像头的预览和保存
- 【Android】设置摄像头方向、打开线程与预览线程、设置参数、Camera外设按键、自动对焦与触摸对焦、拍照、人脸检测、位置管理、旋转管理、变焦、录像
- Android Camera开发:给摄像头预览界面加个ZoomBar(附完整代码下载)
- Android 举例说明自己的定义Camera图片和预览,以及前后摄像头切换
- Android自定义照相机 预览拍照 切换前后置摄像头
- Android开发指南——摄像头camera使用(转)
- 【Android】Opencv For Android: 如何显示摄像头预览
- Android 使Camera预览清晰,循环自动对焦处理
- Android中直播视频技术探究之---摄像头Camera视频源数据采集解析
- Android系统Camera录像过程分析
- Android Camera 通过V4L2与kernel driver的完整交互过程
- Android Camera API/Camera2 API 相机预览及滤镜、贴纸等处理
- Android Zxing 扫描条码实现竖屏模式 Camera摄像头 旋转90度
- Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView)
- [置顶] Android Multimedia框架总结(十九)Camera2框架C/S模型之CameraService启动及与Client连接过程
- Android Camera2采集摄像头原始数据并手动预览