Loading services/camera/libcameraservice/CameraService.cpp +15 −3 Original line number Diff line number Diff line Loading @@ -3274,9 +3274,21 @@ void CameraService::updateStatus(StatusInternal status, const String8& cameraId, return; } bool isHidden = isPublicallyHiddenSecureCamera(cameraId); bool supportsHAL3 = false; // supportsCameraApi also holds mInterfaceMutex, we can't call it in the // HIDL onStatusChanged wrapper call (we'll hold mStatusListenerLock and // mInterfaceMutex together, which can lead to deadlocks) binder::Status sRet = supportsCameraApi(String16(cameraId), hardware::ICameraService::API_VERSION_2, &supportsHAL3); if (!sRet.isOk()) { ALOGW("%s: Failed to determine if device supports HAL3 %s, supportsCameraApi call failed", __FUNCTION__, cameraId.string()); return; } // Update the status for this camera state, then send the onStatusChangedCallbacks to each // of the listeners with both the mStatusStatus and mStatusListenerLock held state->updateStatus(status, cameraId, rejectSourceStates, [this,&isHidden] state->updateStatus(status, cameraId, rejectSourceStates, [this, &isHidden, &supportsHAL3] (const String8& cameraId, StatusInternal status) { if (status != StatusInternal::ENUMERATING) { Loading @@ -3298,8 +3310,8 @@ void CameraService::updateStatus(StatusInternal status, const String8& cameraId, Mutex::Autolock lock(mStatusListenerLock); for (auto& listener : mListenerList) { if (!listener.first && isHidden) { ALOGV("Skipping camera discovery callback for system-only camera %s", if (!listener.first && (isHidden || !supportsHAL3)) { ALOGV("Skipping camera discovery callback for system-only / HAL1 camera %s", cameraId.c_str()); continue; } Loading services/camera/libcameraservice/hidl/HidlCameraService.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -191,6 +191,14 @@ Return<void> HidlCameraService::addListener(const sp<HCameraServiceListener>& hC _hidl_cb(status, {}); return Void(); } cameraStatusAndIds.erase(std::remove_if(cameraStatusAndIds.begin(), cameraStatusAndIds.end(), [this](const hardware::CameraStatus& s) { bool supportsHAL3 = false; binder::Status sRet = mAidlICameraService->supportsCameraApi(String16(s.cameraId), hardware::ICameraService::API_VERSION_2, &supportsHAL3); return !sRet.isOk() || !supportsHAL3; }), cameraStatusAndIds.end()); hidl_vec<HCameraStatusAndId> hCameraStatusAndIds; //Convert cameraStatusAndIds to HIDL and call callback convertToHidl(cameraStatusAndIds, &hCameraStatusAndIds); Loading Loading
services/camera/libcameraservice/CameraService.cpp +15 −3 Original line number Diff line number Diff line Loading @@ -3274,9 +3274,21 @@ void CameraService::updateStatus(StatusInternal status, const String8& cameraId, return; } bool isHidden = isPublicallyHiddenSecureCamera(cameraId); bool supportsHAL3 = false; // supportsCameraApi also holds mInterfaceMutex, we can't call it in the // HIDL onStatusChanged wrapper call (we'll hold mStatusListenerLock and // mInterfaceMutex together, which can lead to deadlocks) binder::Status sRet = supportsCameraApi(String16(cameraId), hardware::ICameraService::API_VERSION_2, &supportsHAL3); if (!sRet.isOk()) { ALOGW("%s: Failed to determine if device supports HAL3 %s, supportsCameraApi call failed", __FUNCTION__, cameraId.string()); return; } // Update the status for this camera state, then send the onStatusChangedCallbacks to each // of the listeners with both the mStatusStatus and mStatusListenerLock held state->updateStatus(status, cameraId, rejectSourceStates, [this,&isHidden] state->updateStatus(status, cameraId, rejectSourceStates, [this, &isHidden, &supportsHAL3] (const String8& cameraId, StatusInternal status) { if (status != StatusInternal::ENUMERATING) { Loading @@ -3298,8 +3310,8 @@ void CameraService::updateStatus(StatusInternal status, const String8& cameraId, Mutex::Autolock lock(mStatusListenerLock); for (auto& listener : mListenerList) { if (!listener.first && isHidden) { ALOGV("Skipping camera discovery callback for system-only camera %s", if (!listener.first && (isHidden || !supportsHAL3)) { ALOGV("Skipping camera discovery callback for system-only / HAL1 camera %s", cameraId.c_str()); continue; } Loading
services/camera/libcameraservice/hidl/HidlCameraService.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -191,6 +191,14 @@ Return<void> HidlCameraService::addListener(const sp<HCameraServiceListener>& hC _hidl_cb(status, {}); return Void(); } cameraStatusAndIds.erase(std::remove_if(cameraStatusAndIds.begin(), cameraStatusAndIds.end(), [this](const hardware::CameraStatus& s) { bool supportsHAL3 = false; binder::Status sRet = mAidlICameraService->supportsCameraApi(String16(s.cameraId), hardware::ICameraService::API_VERSION_2, &supportsHAL3); return !sRet.isOk() || !supportsHAL3; }), cameraStatusAndIds.end()); hidl_vec<HCameraStatusAndId> hCameraStatusAndIds; //Convert cameraStatusAndIds to HIDL and call callback convertToHidl(cameraStatusAndIds, &hCameraStatusAndIds); Loading