Loading camera/ICameraService.cpp +9 −2 Original line number Diff line number Diff line Loading @@ -94,11 +94,18 @@ public: { } // get number of cameras available // get number of cameras available that support standard camera operations virtual int32_t getNumberOfCameras() { return getNumberOfCameras(CAMERA_TYPE_BACKWARD_COMPATIBLE); } // get number of cameras available of a given type virtual int32_t getNumberOfCameras(int type) { Parcel data, reply; data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); data.writeInt32(type); remote()->transact(BnCameraService::GET_NUMBER_OF_CAMERAS, data, &reply); if (readExceptionCode(reply)) return 0; Loading Loading @@ -337,7 +344,7 @@ status_t BnCameraService::onTransact( case GET_NUMBER_OF_CAMERAS: { CHECK_INTERFACE(ICameraService, data, reply); reply->writeNoException(); reply->writeInt32(getNumberOfCameras()); reply->writeInt32(getNumberOfCameras(data.readInt32())); return NO_ERROR; } break; case GET_CAMERA_INFO: { Loading include/camera/ICameraService.h +10 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,11 @@ public: API_VERSION_2 = 2, }; enum { CAMERA_TYPE_BACKWARD_COMPATIBLE = 0, CAMERA_TYPE_ALL = 1, }; enum { CAMERA_HAL_API_VERSION_UNSPECIFIED = -1 }; Loading @@ -81,7 +86,12 @@ public: public: DECLARE_META_INTERFACE(CameraService); // Get the number of cameras that support basic color camera operation // (type CAMERA_TYPE_BACKWARD_COMPATIBLE) virtual int32_t getNumberOfCameras() = 0; // Get the number of cameras of the specified type, one of CAMERA_TYPE_* // enums virtual int32_t getNumberOfCameras(int cameraType) = 0; virtual status_t getCameraInfo(int cameraId, /*out*/ struct CameraInfo* cameraInfo) = 0; Loading services/camera/libcameraservice/CameraService.cpp +88 −14 Original line number Diff line number Diff line Loading @@ -171,6 +171,7 @@ void CameraService::onFirstRef() } mNumberOfCameras = mModule->getNumberOfCameras(); mNumberOfNormalCameras = mNumberOfCameras; mFlashlight = new CameraFlashlight(*mModule, *this); status_t res = mFlashlight->findFlashUnits(); Loading @@ -179,27 +180,41 @@ void CameraService::onFirstRef() ALOGE("Failed to find flash units."); } int latestStrangeCameraId = INT_MAX; for (int i = 0; i < mNumberOfCameras; i++) { String8 cameraId = String8::format("%d", i); // Get camera info struct camera_info info; bool haveInfo = true; status_t rc = mModule->getCameraInfo(i, &info); if (rc != NO_ERROR) { ALOGE("%s: Received error loading camera info for device %d, cost and" " conflicting devices fields set to defaults for this device.", __FUNCTION__, i); haveInfo = false; } // Check for backwards-compatibility support if (haveInfo) { if (checkCameraCapabilities(i, info, &latestStrangeCameraId) != OK) { delete mModule; mModule = nullptr; return; } } // Defaults to use for cost and conflicting devices int cost = 100; char** conflicting_devices = nullptr; size_t conflicting_devices_length = 0; // If using post-2.4 module version, query the cost + conflicting devices from the HAL if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_4) { struct camera_info info; status_t rc = mModule->getCameraInfo(i, &info); if (rc == NO_ERROR) { if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_4 && haveInfo) { cost = info.resource_cost; conflicting_devices = info.conflicting_devices; conflicting_devices_length = info.conflicting_devices_length; } else { ALOGE("%s: Received error loading camera info for device %d, cost and" " conflicting devices fields set to defaults for this device.", __FUNCTION__, i); } } std::set<String8> conflicting; Loading Loading @@ -382,9 +397,21 @@ void CameraService::onTorchStatusChangedLocked(const String8& cameraId, } } int32_t CameraService::getNumberOfCameras() { return getNumberOfCameras(CAMERA_TYPE_BACKWARD_COMPATIBLE); } int32_t CameraService::getNumberOfCameras(int type) { switch (type) { case CAMERA_TYPE_BACKWARD_COMPATIBLE: return mNumberOfNormalCameras; case CAMERA_TYPE_ALL: return mNumberOfCameras; default: ALOGW("%s: Unknown camera type %d, returning 0", __FUNCTION__, type); return 0; } } status_t CameraService::getCameraInfo(int cameraId, Loading Loading @@ -1494,6 +1521,53 @@ bool CameraService::evictClientIdByRemote(const wp<IBinder>& remote) { } /** * Check camera capabilities, such as support for basic color operation */ int CameraService::checkCameraCapabilities(int id, camera_info info, int *latestStrangeCameraId) { // Assume all devices pre-v3.3 are backward-compatible bool isBackwardCompatible = true; if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_0 && info.device_version >= CAMERA_DEVICE_API_VERSION_3_3) { isBackwardCompatible = false; status_t res; camera_metadata_ro_entry_t caps; res = find_camera_metadata_ro_entry( info.static_camera_characteristics, ANDROID_REQUEST_AVAILABLE_CAPABILITIES, &caps); if (res != 0) { ALOGW("%s: Unable to find camera capabilities for camera device %d", __FUNCTION__, id); caps.count = 0; } for (size_t i = 0; i < caps.count; i++) { if (caps.data.u8[i] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) { isBackwardCompatible = true; break; } } } if (!isBackwardCompatible) { mNumberOfNormalCameras--; *latestStrangeCameraId = id; } else { if (id > *latestStrangeCameraId) { ALOGE("%s: Normal camera ID %d higher than strange camera ID %d. " "This is not allowed due backward-compatibility requirements", __FUNCTION__, id, *latestStrangeCameraId); logServiceError("Invalid order of camera devices", ENODEV); mNumberOfCameras = 0; mNumberOfNormalCameras = 0; return INVALID_OPERATION; } } return OK; } std::shared_ptr<CameraService::CameraState> CameraService::getCameraState( const String8& cameraId) const { std::shared_ptr<CameraState> state; Loading services/camera/libcameraservice/CameraService.h +8 −0 Original line number Diff line number Diff line Loading @@ -100,7 +100,9 @@ public: ///////////////////////////////////////////////////////////////////// // ICameraService virtual int32_t getNumberOfCameras(int type); virtual int32_t getNumberOfCameras(); virtual status_t getCameraInfo(int cameraId, struct CameraInfo* cameraInfo); virtual status_t getCameraCharacteristics(int cameraId, Loading Loading @@ -508,6 +510,11 @@ private: // Currently allowed user IDs std::set<userid_t> mAllowedUsers; /** * Check camera capabilities, such as support for basic color operation */ int checkCameraCapabilities(int id, camera_info info, int *latestStrangeCameraId); /** * Get the camera state for a given camera id. * Loading Loading @@ -610,6 +617,7 @@ private: void dumpEventLog(int fd); int mNumberOfCameras; int mNumberOfNormalCameras; // sounds MediaPlayer* newMediaPlayer(const char *file); Loading Loading
camera/ICameraService.cpp +9 −2 Original line number Diff line number Diff line Loading @@ -94,11 +94,18 @@ public: { } // get number of cameras available // get number of cameras available that support standard camera operations virtual int32_t getNumberOfCameras() { return getNumberOfCameras(CAMERA_TYPE_BACKWARD_COMPATIBLE); } // get number of cameras available of a given type virtual int32_t getNumberOfCameras(int type) { Parcel data, reply; data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); data.writeInt32(type); remote()->transact(BnCameraService::GET_NUMBER_OF_CAMERAS, data, &reply); if (readExceptionCode(reply)) return 0; Loading Loading @@ -337,7 +344,7 @@ status_t BnCameraService::onTransact( case GET_NUMBER_OF_CAMERAS: { CHECK_INTERFACE(ICameraService, data, reply); reply->writeNoException(); reply->writeInt32(getNumberOfCameras()); reply->writeInt32(getNumberOfCameras(data.readInt32())); return NO_ERROR; } break; case GET_CAMERA_INFO: { Loading
include/camera/ICameraService.h +10 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,11 @@ public: API_VERSION_2 = 2, }; enum { CAMERA_TYPE_BACKWARD_COMPATIBLE = 0, CAMERA_TYPE_ALL = 1, }; enum { CAMERA_HAL_API_VERSION_UNSPECIFIED = -1 }; Loading @@ -81,7 +86,12 @@ public: public: DECLARE_META_INTERFACE(CameraService); // Get the number of cameras that support basic color camera operation // (type CAMERA_TYPE_BACKWARD_COMPATIBLE) virtual int32_t getNumberOfCameras() = 0; // Get the number of cameras of the specified type, one of CAMERA_TYPE_* // enums virtual int32_t getNumberOfCameras(int cameraType) = 0; virtual status_t getCameraInfo(int cameraId, /*out*/ struct CameraInfo* cameraInfo) = 0; Loading
services/camera/libcameraservice/CameraService.cpp +88 −14 Original line number Diff line number Diff line Loading @@ -171,6 +171,7 @@ void CameraService::onFirstRef() } mNumberOfCameras = mModule->getNumberOfCameras(); mNumberOfNormalCameras = mNumberOfCameras; mFlashlight = new CameraFlashlight(*mModule, *this); status_t res = mFlashlight->findFlashUnits(); Loading @@ -179,27 +180,41 @@ void CameraService::onFirstRef() ALOGE("Failed to find flash units."); } int latestStrangeCameraId = INT_MAX; for (int i = 0; i < mNumberOfCameras; i++) { String8 cameraId = String8::format("%d", i); // Get camera info struct camera_info info; bool haveInfo = true; status_t rc = mModule->getCameraInfo(i, &info); if (rc != NO_ERROR) { ALOGE("%s: Received error loading camera info for device %d, cost and" " conflicting devices fields set to defaults for this device.", __FUNCTION__, i); haveInfo = false; } // Check for backwards-compatibility support if (haveInfo) { if (checkCameraCapabilities(i, info, &latestStrangeCameraId) != OK) { delete mModule; mModule = nullptr; return; } } // Defaults to use for cost and conflicting devices int cost = 100; char** conflicting_devices = nullptr; size_t conflicting_devices_length = 0; // If using post-2.4 module version, query the cost + conflicting devices from the HAL if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_4) { struct camera_info info; status_t rc = mModule->getCameraInfo(i, &info); if (rc == NO_ERROR) { if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_4 && haveInfo) { cost = info.resource_cost; conflicting_devices = info.conflicting_devices; conflicting_devices_length = info.conflicting_devices_length; } else { ALOGE("%s: Received error loading camera info for device %d, cost and" " conflicting devices fields set to defaults for this device.", __FUNCTION__, i); } } std::set<String8> conflicting; Loading Loading @@ -382,9 +397,21 @@ void CameraService::onTorchStatusChangedLocked(const String8& cameraId, } } int32_t CameraService::getNumberOfCameras() { return getNumberOfCameras(CAMERA_TYPE_BACKWARD_COMPATIBLE); } int32_t CameraService::getNumberOfCameras(int type) { switch (type) { case CAMERA_TYPE_BACKWARD_COMPATIBLE: return mNumberOfNormalCameras; case CAMERA_TYPE_ALL: return mNumberOfCameras; default: ALOGW("%s: Unknown camera type %d, returning 0", __FUNCTION__, type); return 0; } } status_t CameraService::getCameraInfo(int cameraId, Loading Loading @@ -1494,6 +1521,53 @@ bool CameraService::evictClientIdByRemote(const wp<IBinder>& remote) { } /** * Check camera capabilities, such as support for basic color operation */ int CameraService::checkCameraCapabilities(int id, camera_info info, int *latestStrangeCameraId) { // Assume all devices pre-v3.3 are backward-compatible bool isBackwardCompatible = true; if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_0 && info.device_version >= CAMERA_DEVICE_API_VERSION_3_3) { isBackwardCompatible = false; status_t res; camera_metadata_ro_entry_t caps; res = find_camera_metadata_ro_entry( info.static_camera_characteristics, ANDROID_REQUEST_AVAILABLE_CAPABILITIES, &caps); if (res != 0) { ALOGW("%s: Unable to find camera capabilities for camera device %d", __FUNCTION__, id); caps.count = 0; } for (size_t i = 0; i < caps.count; i++) { if (caps.data.u8[i] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) { isBackwardCompatible = true; break; } } } if (!isBackwardCompatible) { mNumberOfNormalCameras--; *latestStrangeCameraId = id; } else { if (id > *latestStrangeCameraId) { ALOGE("%s: Normal camera ID %d higher than strange camera ID %d. " "This is not allowed due backward-compatibility requirements", __FUNCTION__, id, *latestStrangeCameraId); logServiceError("Invalid order of camera devices", ENODEV); mNumberOfCameras = 0; mNumberOfNormalCameras = 0; return INVALID_OPERATION; } } return OK; } std::shared_ptr<CameraService::CameraState> CameraService::getCameraState( const String8& cameraId) const { std::shared_ptr<CameraState> state; Loading
services/camera/libcameraservice/CameraService.h +8 −0 Original line number Diff line number Diff line Loading @@ -100,7 +100,9 @@ public: ///////////////////////////////////////////////////////////////////// // ICameraService virtual int32_t getNumberOfCameras(int type); virtual int32_t getNumberOfCameras(); virtual status_t getCameraInfo(int cameraId, struct CameraInfo* cameraInfo); virtual status_t getCameraCharacteristics(int cameraId, Loading Loading @@ -508,6 +510,11 @@ private: // Currently allowed user IDs std::set<userid_t> mAllowedUsers; /** * Check camera capabilities, such as support for basic color operation */ int checkCameraCapabilities(int id, camera_info info, int *latestStrangeCameraId); /** * Get the camera state for a given camera id. * Loading Loading @@ -610,6 +617,7 @@ private: void dumpEventLog(int fd); int mNumberOfCameras; int mNumberOfNormalCameras; // sounds MediaPlayer* newMediaPlayer(const char *file); Loading