diff --git a/camera/common/1.0/default/CameraModule.cpp b/camera/common/1.0/default/CameraModule.cpp index 3a4bc9c6a8..9217a823b7 100644 --- a/camera/common/1.0/default/CameraModule.cpp +++ b/camera/common/1.0/default/CameraModule.cpp @@ -425,6 +425,13 @@ status_t CameraModule::filterOpenErrorCode(status_t err) { return -ENODEV; } +void CameraModule::removeCamera(int cameraId) { + free_camera_metadata( + const_cast(mCameraInfoMap[cameraId].static_camera_characteristics)); + mCameraInfoMap.removeItem(cameraId); + mDeviceVersionMap.removeItem(cameraId); +} + uint16_t CameraModule::getModuleApiVersion() const { return mModule->common.module_api_version; } diff --git a/camera/common/1.0/default/OWNERS b/camera/common/1.0/default/OWNERS new file mode 100644 index 0000000000..18acfee145 --- /dev/null +++ b/camera/common/1.0/default/OWNERS @@ -0,0 +1,6 @@ +cychen@google.com +epeev@google.com +etalvala@google.com +shuzhenwang@google.com +yinchiayeh@google.com +zhijunhe@google.com diff --git a/camera/common/1.0/default/include/CameraModule.h b/camera/common/1.0/default/include/CameraModule.h index 9fbfbd527b..deebd09480 100644 --- a/camera/common/1.0/default/include/CameraModule.h +++ b/camera/common/1.0/default/include/CameraModule.h @@ -63,6 +63,8 @@ public: const char* getModuleAuthor() const; // Only used by CameraModuleFixture native test. Do NOT use elsewhere. void *getDso(); + // Only used by CameraProvider + void removeCamera(int cameraId); private: // Derive camera characteristics keys defined after HAL device version diff --git a/camera/provider/2.4/default/CameraProvider.cpp b/camera/provider/2.4/default/CameraProvider.cpp index 3a113def25..8c5af8e26c 100644 --- a/camera/provider/2.4/default/CameraProvider.cpp +++ b/camera/provider/2.4/default/CameraProvider.cpp @@ -104,6 +104,30 @@ void CameraProvider::addDeviceNames(int camera_id, CameraDeviceStatus status, bo } } +void CameraProvider::removeDeviceNames(int camera_id) +{ + std::string cameraIdStr = std::to_string(camera_id); + + mCameraIds.remove(cameraIdStr); + + int deviceVersion = mModule->getDeviceVersion(camera_id); + auto deviceNamePair = std::make_pair(cameraIdStr, + getHidlDeviceName(cameraIdStr, deviceVersion)); + mCameraDeviceNames.remove(deviceNamePair); + mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, CameraDeviceStatus::NOT_PRESENT); + if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_2 && + mModule->isOpenLegacyDefined() && mOpenLegacySupported[cameraIdStr]) { + + deviceNamePair = std::make_pair(cameraIdStr, + getHidlDeviceName(cameraIdStr, CAMERA_DEVICE_API_VERSION_1_0)); + mCameraDeviceNames.remove(deviceNamePair); + mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, + CameraDeviceStatus::NOT_PRESENT); + } + + mModule->removeCamera(camera_id); +} + /** * static callback forwarding methods from HAL to instance */ @@ -135,8 +159,17 @@ void CameraProvider::sCameraDeviceStatusChange( } } - if (!found) { - cp->addDeviceNames(camera_id, status, true); + switch (status) { + case CameraDeviceStatus::PRESENT: + case CameraDeviceStatus::ENUMERATING: + if (!found) { + cp->addDeviceNames(camera_id, status, true); + } + break; + case CameraDeviceStatus::NOT_PRESENT: + if (found) { + cp->removeDeviceNames(camera_id); + } } } } diff --git a/camera/provider/2.4/default/CameraProvider.h b/camera/provider/2.4/default/CameraProvider.h index 2cf251ec4b..0f0959f1f0 100644 --- a/camera/provider/2.4/default/CameraProvider.h +++ b/camera/provider/2.4/default/CameraProvider.h @@ -115,6 +115,7 @@ private: void addDeviceNames(int camera_id, CameraDeviceStatus status = CameraDeviceStatus::PRESENT, bool cam_new = false); + void removeDeviceNames(int camera_id); }; extern "C" ICameraProvider* HIDL_FETCH_ICameraProvider(const char* name);