Camera: fix metadata assertion

Bug: 19897963
Change-Id: I6b383c4750f31691a1c02e927bbeb0c1998a9eff
diff --git a/camera/CameraMetadata.cpp b/camera/CameraMetadata.cpp
index 043437f..e216d26 100644
--- a/camera/CameraMetadata.cpp
+++ b/camera/CameraMetadata.cpp
@@ -74,7 +74,7 @@
     clear();
 }
 
-const camera_metadata_t* CameraMetadata::getAndLock() {
+const camera_metadata_t* CameraMetadata::getAndLock() const {
     mLocked = true;
     return mBuffer;
 }
diff --git a/include/camera/CameraMetadata.h b/include/camera/CameraMetadata.h
index 1254d3c..953d711 100644
--- a/include/camera/CameraMetadata.h
+++ b/include/camera/CameraMetadata.h
@@ -56,7 +56,7 @@
      * thread-safety, it simply prevents the camera_metadata_t pointer returned
      * here from being accidentally invalidated by CameraMetadata operations.
      */
-    const camera_metadata_t* getAndLock();
+    const camera_metadata_t* getAndLock() const;
 
     /**
      * Unlock the CameraMetadata for use again. After this unlock, the pointer
@@ -208,7 +208,7 @@
 
   private:
     camera_metadata_t *mBuffer;
-    bool               mLocked;
+    mutable bool       mLocked;
 
     /**
      * Check if tag has a given type
diff --git a/services/camera/libcameraservice/common/CameraModule.cpp b/services/camera/libcameraservice/common/CameraModule.cpp
index 50cece4..e5b12ae 100644
--- a/services/camera/libcameraservice/common/CameraModule.cpp
+++ b/services/camera/libcameraservice/common/CameraModule.cpp
@@ -73,24 +73,25 @@
     ssize_t index = mCameraInfoMap.indexOfKey(cameraId);
     if (index == NAME_NOT_FOUND) {
         // Get camera info from raw module and cache it
-        CameraInfo cameraInfo;
-        camera_info rawInfo;
+        camera_info rawInfo, cameraInfo;
         int ret = mModule->get_camera_info(cameraId, &rawInfo);
         if (ret != 0) {
             return ret;
         }
-        CameraMetadata &m = cameraInfo.cameraCharacteristics;
+        CameraMetadata m;
         m = rawInfo.static_camera_characteristics;
         deriveCameraCharacteristicsKeys(rawInfo.device_version, m);
-        cameraInfo.cameraInfo = rawInfo;
-        cameraInfo.cameraInfo.static_camera_characteristics = m.getAndLock();
+        mCameraCharacteristicsMap.add(cameraId, m);
+        cameraInfo = rawInfo;
+        cameraInfo.static_camera_characteristics =
+                mCameraCharacteristicsMap.valueFor(cameraId).getAndLock();
         mCameraInfoMap.add(cameraId, cameraInfo);
         index = mCameraInfoMap.indexOfKey(cameraId);
     }
 
     assert(index != NAME_NOT_FOUND);
     // return the cached camera info
-    *info = mCameraInfoMap[index].cameraInfo;
+    *info = mCameraInfoMap[index];
     return 0;
 }
 
diff --git a/services/camera/libcameraservice/common/CameraModule.h b/services/camera/libcameraservice/common/CameraModule.h
index ecc5b2d..e285b21 100644
--- a/services/camera/libcameraservice/common/CameraModule.h
+++ b/services/camera/libcameraservice/common/CameraModule.h
@@ -54,13 +54,9 @@
     static void deriveCameraCharacteristicsKeys(uint32_t deviceVersion, CameraMetadata &chars);
     status_t filterOpenErrorCode(status_t err);
 
-    struct CameraInfo {
-        CameraMetadata cameraCharacteristics;
-        camera_info    cameraInfo;
-    };
-
     camera_module_t *mModule;
-    KeyedVector<int, CameraInfo> mCameraInfoMap;
+    KeyedVector<int, camera_info> mCameraInfoMap;
+    KeyedVector<int, CameraMetadata> mCameraCharacteristicsMap;
     Mutex mCameraInfoLock;
 };