[rk3288+android5.1] USB camera工作状态下随机热插拔引起的camera.rk30board.so动态库crash问题

问题:打开安卓系统里的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));

猜你喜欢

转载自blog.csdn.net/u014689845/article/details/86678663