mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 16:50:18 +00:00
Merge "Camera: Fix hotplug" am: d7a0f2984d am: 78d88380d3
am: 99aaf673c5
Change-Id: I3e9566c4960c9f11376c7b0c8f377f9ccc1ac1ac
This commit is contained in:
committed by
android-build-merger
commit
e56eafc61d
@@ -40,9 +40,11 @@ CameraDevice::CameraDevice(
|
||||
mCameraDeviceNames(cameraDeviceNames) {
|
||||
mCameraIdInt = atoi(mCameraId.c_str());
|
||||
// Should not reach here as provider also validate ID
|
||||
if (mCameraIdInt < 0 || mCameraIdInt >= module->getNumberOfCameras()) {
|
||||
if (mCameraIdInt < 0) {
|
||||
ALOGE("%s: Invalid camera id: %s", __FUNCTION__, mCameraId.c_str());
|
||||
mInitFail = true;
|
||||
} else if (mCameraIdInt >= mModule->getNumberOfCameras()) {
|
||||
ALOGI("%s: Adding a new camera id: %s", __FUNCTION__, mCameraId.c_str());
|
||||
}
|
||||
|
||||
mDeviceVersion = mModule->getDeviceVersion(mCameraIdInt);
|
||||
|
||||
@@ -66,6 +66,46 @@ bool matchDeviceName(const hidl_string& deviceName, std::string* deviceVersion,
|
||||
using ::android::hardware::camera::common::V1_0::CameraMetadataType;
|
||||
using ::android::hardware::camera::common::V1_0::Status;
|
||||
|
||||
void CameraProvider::addDeviceNames(int camera_id, CameraDeviceStatus status, bool cam_new)
|
||||
{
|
||||
char cameraId[kMaxCameraIdLen];
|
||||
snprintf(cameraId, sizeof(cameraId), "%d", camera_id);
|
||||
std::string cameraIdStr(cameraId);
|
||||
|
||||
mCameraIds.add(cameraIdStr);
|
||||
|
||||
// initialize mCameraDeviceNames and mOpenLegacySupported
|
||||
mOpenLegacySupported[cameraIdStr] = false;
|
||||
int deviceVersion = mModule->getDeviceVersion(camera_id);
|
||||
auto deviceNamePair = std::make_pair(cameraIdStr,
|
||||
getHidlDeviceName(cameraIdStr, deviceVersion));
|
||||
mCameraDeviceNames.add(deviceNamePair);
|
||||
if (cam_new) {
|
||||
mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, status);
|
||||
}
|
||||
if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_2 &&
|
||||
mModule->isOpenLegacyDefined()) {
|
||||
// try open_legacy to see if it actually works
|
||||
struct hw_device_t* halDev = nullptr;
|
||||
int ret = mModule->openLegacy(cameraId, CAMERA_DEVICE_API_VERSION_1_0, &halDev);
|
||||
if (ret == 0) {
|
||||
mOpenLegacySupported[cameraIdStr] = true;
|
||||
halDev->close(halDev);
|
||||
deviceNamePair = std::make_pair(cameraIdStr,
|
||||
getHidlDeviceName(cameraIdStr, CAMERA_DEVICE_API_VERSION_1_0));
|
||||
mCameraDeviceNames.add(deviceNamePair);
|
||||
if (cam_new) {
|
||||
mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, status);
|
||||
}
|
||||
} else if (ret == -EBUSY || ret == -EUSERS) {
|
||||
// Looks like this provider instance is not initialized during
|
||||
// system startup and there are other camera users already.
|
||||
// Not a good sign but not fatal.
|
||||
ALOGW("%s: open_legacy try failed!", __FUNCTION__);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* static callback forwarding methods from HAL to instance
|
||||
*/
|
||||
@@ -75,6 +115,7 @@ void CameraProvider::sCameraDeviceStatusChange(
|
||||
int new_status) {
|
||||
CameraProvider* cp = const_cast<CameraProvider*>(
|
||||
static_cast<const CameraProvider*>(callbacks));
|
||||
bool found = false;
|
||||
|
||||
if (cp == nullptr) {
|
||||
ALOGE("%s: callback ops is null", __FUNCTION__);
|
||||
@@ -92,8 +133,13 @@ void CameraProvider::sCameraDeviceStatusChange(
|
||||
if (cameraIdStr.compare(deviceNamePair.first) == 0) {
|
||||
cp->mCallbacks->cameraDeviceStatusChange(
|
||||
deviceNamePair.second, status);
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
cp->addDeviceNames(camera_id, status, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -251,32 +297,8 @@ bool CameraProvider::initialize() {
|
||||
snprintf(cameraId, sizeof(cameraId), "%d", i);
|
||||
std::string cameraIdStr(cameraId);
|
||||
mCameraStatusMap[cameraIdStr] = CAMERA_DEVICE_STATUS_PRESENT;
|
||||
mCameraIds.add(cameraIdStr);
|
||||
|
||||
// initialize mCameraDeviceNames and mOpenLegacySupported
|
||||
mOpenLegacySupported[cameraIdStr] = false;
|
||||
int deviceVersion = mModule->getDeviceVersion(i);
|
||||
mCameraDeviceNames.add(
|
||||
std::make_pair(cameraIdStr,
|
||||
getHidlDeviceName(cameraIdStr, deviceVersion)));
|
||||
if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_2 &&
|
||||
mModule->isOpenLegacyDefined()) {
|
||||
// try open_legacy to see if it actually works
|
||||
struct hw_device_t* halDev = nullptr;
|
||||
int ret = mModule->openLegacy(cameraId, CAMERA_DEVICE_API_VERSION_1_0, &halDev);
|
||||
if (ret == 0) {
|
||||
mOpenLegacySupported[cameraIdStr] = true;
|
||||
halDev->close(halDev);
|
||||
mCameraDeviceNames.add(
|
||||
std::make_pair(cameraIdStr,
|
||||
getHidlDeviceName(cameraIdStr, CAMERA_DEVICE_API_VERSION_1_0)));
|
||||
} else if (ret == -EBUSY || ret == -EUSERS) {
|
||||
// Looks like this provider instance is not initialized during
|
||||
// system startup and there are other camera users already.
|
||||
// Not a good sign but not fatal.
|
||||
ALOGW("%s: open_legacy try failed!", __FUNCTION__);
|
||||
}
|
||||
}
|
||||
addDeviceNames(i);
|
||||
}
|
||||
|
||||
return false; // mInitFailed
|
||||
|
||||
@@ -112,6 +112,9 @@ private:
|
||||
const struct camera_module_callbacks* callbacks,
|
||||
const char* camera_id,
|
||||
int new_status);
|
||||
|
||||
void addDeviceNames(int camera_id, CameraDeviceStatus status = CameraDeviceStatus::PRESENT,
|
||||
bool cam_new = false);
|
||||
};
|
||||
|
||||
extern "C" ICameraProvider* HIDL_FETCH_ICameraProvider(const char* name);
|
||||
|
||||
Reference in New Issue
Block a user