问题:打开安卓系统里的camera APP,这时候camera处于preview的状态,如果这个时候将USB camera拔出然后再接入,则camera的设备节点/dev/camera会发生偏移。具体表现为camera异常后,设备节点/dev/video0、/dev/video1突变为/dev/video1、/dev/video2,从而出现open /dev/vodeo0 failed的error,进而出现动态库camera.rk30board.so crash的问题。
解决:下面是我给出的补丁
diff --git a/CameraHal/CameraAdapter.cpp b/CameraHal/CameraAdapter.cpp
index b376e76..3d5890f 100755
--- a/CameraHal/CameraAdapter.cpp
+++ b/CameraHal/CameraAdapter.cpp
@@ -358,7 +358,18 @@ int CameraAdapter::cameraCreate(int cameraId)
iCamFd = open(cameraDevicePathCur, O_RDWR);
if (iCamFd < 0) {
LOGE("%s(%d): open camera%d(%s) is failed",__FUNCTION__,__LINE__,cameraId,cameraDevicePathCur);
- goto exit;
+ if(0 == cameraId)
+ {
+ iCamFd = open("/dev/video1", O_RDWR);
+ if (iCamFd < 0)
+ {
+ LOGE("%s(%d): open camera1(/dev/video1) is failed",__FUNCTION__,__LINE__);
+ goto exit;
+ }
+ }
+// goto exit;//modified by tommy
}
memset(&mCamDriverCapability, 0, sizeof(struct v4l2_capability));
diff --git a/CameraHal/CameraHal_Module.cpp b/CameraHal/CameraHal_Module.cpp
index a41e69a..05589c7 100755
--- a/CameraHal/CameraHal_Module.cpp
+++ b/CameraHal/CameraHal_Module.cpp
@@ -739,17 +739,27 @@ int camera_get_number_of_cameras(void)
i++;
}
- for (i=0; i<10; i++) {
+ for (i=0; i<10; i++) {
cam_path[0] = 0x00;
- unsigned int pix_format_tmp = V4L2_PIX_FMT_NV12;
+ unsigned int pix_format_tmp = V4L2_PIX_FMT_NV12;
strcat(cam_path, CAMERA_DEVICE_NAME);
sprintf(cam_num, "%d", i);
strcat(cam_path,cam_num);
fd = open(cam_path, O_RDONLY);
if (fd < 0) {
- LOGE("Open %s failed! strr: %s",cam_path,strerror(errno));
- break;
- }
+ // LOGE("Open %s failed! strr: %s",cam_path,strerror(errno));
+ // break;
+ LOGE("Open %s failed! strr: %s",cam_path,strerror(errno));
+ if(i ==9)
+ {
+ break;
+ }else
+ {
+ continue;
+ }
+ }
LOGD("Open %s success!",cam_path);
memset(&capability, 0, sizeof(struct v4l2_capability));
diff --git a/CameraHal/CameraUSBAdapter.cpp b/CameraHal/CameraUSBAdapter.cpp
index f207574..6cec256 100644
--- a/CameraHal/CameraUSBAdapter.cpp
+++ b/CameraHal/CameraUSBAdapter.cpp
@@ -60,7 +60,18 @@ int CameraUSBAdapter::cameraStop()
mCamFd = open(cameraDevicePathCur, O_RDWR);
if (mCamFd < 0) {
LOGE ("%s(%d): Could not open the camera device(%s): %s",__FUNCTION__,__LINE__, cameraDevicePathCur, strerror(errno) );
- return -1;
+ if(0 == mCamId)
+ {
+ mCamFd = open("/dev/video1", O_RDWR);
+ if (mCamFd < 0)
+ {
+ LOGE("%s(%d): open camera1(/dev/video1) is failed",__FUNCTION__,__LINE__);
+ return -1;
+ }
+ }
+// return -1;//commended by tommy
}
return 0;
}
@@ -121,6 +132,13 @@ void CameraUSBAdapter::initDefaultParameters(int camFd)
if (fival.type == V4L2_FRMIVAL_TYPE_DISCRETE) {
framerate[i++] = fival.discrete.denominator/fival.discrete.numerator;
//LOGD("%dx%d : %d %d/%d",fival.width,fival.height, framerate[i-1],fival.discrete.denominator,fival.discrete.numerator);
+ if(i == sizeof(framerate))
+ {
+ i = 0;
+ break;
+ }
} else if (fival.type == V4L2_FRMIVAL_TYPE_CONTINUOUS) {
break;
} else if (fival.type == V4L2_FRMIVAL_TYPE_STEPWISE) {
@@ -153,14 +171,21 @@ void CameraUSBAdapter::initDefaultParameters(int camFd)
while (framerate[i]) {
memset(str_element,0x00,sizeof(str_element));
sprintf((char*)(&str_element[strlen(str_element)]),"%d",framerate[i]);
- if (strstr(str,str_element)==NULL) {
- if (strlen(str)==0) {
- strcat(str,str_element);
- } else {
- strcat(str,",");
- strcat(str,str_element);
- }
- }
+ if(str_element != NULL)//added by tommy
+ {
+ if (strstr(str,str_element)==NULL)
+ {
+ if (strlen(str)==0){
+ strcat(str,str_element);
+ } else {
+ strcat(str,",");
+ strcat(str,str_element);
+ }
+ }
+ }else
+ {
+ LOGD("\r\n the str_element is NULL! \r\n");
+ }
if (fps_min>framerate[i])
fps_min = framerate[i];
@@ -168,6 +193,13 @@ void CameraUSBAdapter::initDefaultParameters(int camFd)
fps_max = framerate[i];
i++;
+ if(i == sizeof(framerate))
+ {
+ i = 0;
+ break;
+ }
}
memset(&setfps, 0, sizeof(struct v4l2_streamparm));