From 91b6bc3187aacc54373c19d8eec1beff99ed3069 Mon Sep 17 00:00:00 2001 From: Yin-Chia Yeh Date: Tue, 27 Jun 2017 19:04:48 -0700 Subject: [PATCH] Camera: fix camera status after HAL crash When camera HAL dies and cameraserver is still alive, make sure we update camera status after HAL re-register itself. Test: kill hal process and run camera app, CTS Bug: 63058983 Merged-In: Iba7e6cbebb674994c905f7feb1776acc479b612f Change-Id: Iba7e6cbebb674994c905f7feb1776acc479b612f --- .../camera/libcameraservice/CameraService.cpp | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index c2b71a2372..c17525922c 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -231,29 +231,33 @@ status_t CameraService::enumerateProviders() { for (auto& cameraId : mCameraProviderManager->getCameraDeviceIds()) { String8 id8 = String8(cameraId.c_str()); + bool cameraFound = false; { + Mutex::Autolock lock(mCameraStatesLock); auto iter = mCameraStates.find(id8); if (iter != mCameraStates.end()) { - continue; + cameraFound = true; } } - hardware::camera::common::V1_0::CameraResourceCost cost; - res = mCameraProviderManager->getResourceCost(cameraId, &cost); - if (res != OK) { - ALOGE("Failed to query device resource cost: %s (%d)", strerror(-res), res); - continue; - } - std::set conflicting; - for (size_t i = 0; i < cost.conflictingDevices.size(); i++) { - conflicting.emplace(String8(cost.conflictingDevices[i].c_str())); - } + if (!cameraFound) { + hardware::camera::common::V1_0::CameraResourceCost cost; + res = mCameraProviderManager->getResourceCost(cameraId, &cost); + if (res != OK) { + ALOGE("Failed to query device resource cost: %s (%d)", strerror(-res), res); + continue; + } + std::set conflicting; + for (size_t i = 0; i < cost.conflictingDevices.size(); i++) { + conflicting.emplace(String8(cost.conflictingDevices[i].c_str())); + } - { - Mutex::Autolock lock(mCameraStatesLock); - mCameraStates.emplace(id8, - std::make_shared(id8, cost.resourceCost, conflicting)); + { + Mutex::Autolock lock(mCameraStatesLock); + mCameraStates.emplace(id8, + std::make_shared(id8, cost.resourceCost, conflicting)); + } } onDeviceStatusChanged(id8, CameraDeviceStatus::PRESENT);