Merge "camera: add support for camera removal" am: cf99978291

am: 040c21f6c8

Change-Id: Ia77e1a72c0319eb17f08325d2f32d656c751f1ce
This commit is contained in:
Guennadi Liakhovetski
2018-01-23 02:35:50 +00:00
committed by android-build-merger
5 changed files with 51 additions and 2 deletions

View File

@@ -425,6 +425,13 @@ status_t CameraModule::filterOpenErrorCode(status_t err) {
return -ENODEV;
}
void CameraModule::removeCamera(int cameraId) {
free_camera_metadata(
const_cast<camera_metadata_t*>(mCameraInfoMap[cameraId].static_camera_characteristics));
mCameraInfoMap.removeItem(cameraId);
mDeviceVersionMap.removeItem(cameraId);
}
uint16_t CameraModule::getModuleApiVersion() const {
return mModule->common.module_api_version;
}

View File

@@ -0,0 +1,6 @@
cychen@google.com
epeev@google.com
etalvala@google.com
shuzhenwang@google.com
yinchiayeh@google.com
zhijunhe@google.com

View File

@@ -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

View File

@@ -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);
}
}
}
}

View File

@@ -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);