From 54298b338cf9f782f2ac681a15e6cbbb99649350 Mon Sep 17 00:00:00 2001 From: Yin-Chia Yeh Date: Tue, 24 Mar 2015 16:51:41 -0700 Subject: Camera: fix metadata assertion Bug: 19897963 Change-Id: I6b383c4750f31691a1c02e927bbeb0c1998a9eff --- camera/CameraMetadata.cpp | 2 +- include/camera/CameraMetadata.h | 4 ++-- services/camera/libcameraservice/common/CameraModule.cpp | 13 +++++++------ services/camera/libcameraservice/common/CameraModule.h | 8 ++------ 4 files changed, 12 insertions(+), 15 deletions(-) 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 @@ CameraMetadata::~CameraMetadata() { 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 @@ class CameraMetadata { * 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 @@ class CameraMetadata { 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 @@ int CameraModule::getCameraInfo(int cameraId, struct camera_info *info) { 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 @@ private: 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 mCameraInfoMap; + KeyedVector mCameraInfoMap; + KeyedVector mCameraCharacteristicsMap; Mutex mCameraInfoLock; }; -- cgit v1.1