Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 99aaf673 authored by Guennadi Liakhovetski's avatar Guennadi Liakhovetski Committed by android-build-merger
Browse files

Merge "Camera: Fix hotplug" am: d7a0f298

am: 78d88380

Change-Id: I1900d086672c7541e1100321563079c675a5d55d
parents 55113b82 78d88380
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -40,9 +40,11 @@ CameraDevice::CameraDevice(
        mCameraDeviceNames(cameraDeviceNames) {
        mCameraDeviceNames(cameraDeviceNames) {
    mCameraIdInt = atoi(mCameraId.c_str());
    mCameraIdInt = atoi(mCameraId.c_str());
    // Should not reach here as provider also validate ID
    // 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());
        ALOGE("%s: Invalid camera id: %s", __FUNCTION__, mCameraId.c_str());
        mInitFail = true;
        mInitFail = true;
    } else if (mCameraIdInt >= mModule->getNumberOfCameras()) {
        ALOGI("%s: Adding a new camera id: %s", __FUNCTION__, mCameraId.c_str());
    }
    }


    mDeviceVersion = mModule->getDeviceVersion(mCameraIdInt);
    mDeviceVersion = mModule->getDeviceVersion(mCameraIdInt);
+48 −26
Original line number Original line Diff line number Diff line
@@ -64,6 +64,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::CameraMetadataType;
using ::android::hardware::camera::common::V1_0::Status;
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
 * static callback forwarding methods from HAL to instance
 */
 */
@@ -73,6 +113,7 @@ void CameraProvider::sCameraDeviceStatusChange(
        int new_status) {
        int new_status) {
    CameraProvider* cp = const_cast<CameraProvider*>(
    CameraProvider* cp = const_cast<CameraProvider*>(
            static_cast<const CameraProvider*>(callbacks));
            static_cast<const CameraProvider*>(callbacks));
    bool found = false;


    if (cp == nullptr) {
    if (cp == nullptr) {
        ALOGE("%s: callback ops is null", __FUNCTION__);
        ALOGE("%s: callback ops is null", __FUNCTION__);
@@ -90,8 +131,13 @@ void CameraProvider::sCameraDeviceStatusChange(
            if (cameraIdStr.compare(deviceNamePair.first) == 0) {
            if (cameraIdStr.compare(deviceNamePair.first) == 0) {
                cp->mCallbacks->cameraDeviceStatusChange(
                cp->mCallbacks->cameraDeviceStatusChange(
                        deviceNamePair.second, status);
                        deviceNamePair.second, status);
                found = true;
            }
            }
        }
        }

        if (!found) {
            cp->addDeviceNames(camera_id, status, true);
        }
    }
    }
}
}


@@ -244,32 +290,8 @@ bool CameraProvider::initialize() {
        snprintf(cameraId, sizeof(cameraId), "%d", i);
        snprintf(cameraId, sizeof(cameraId), "%d", i);
        std::string cameraIdStr(cameraId);
        std::string cameraIdStr(cameraId);
        mCameraStatusMap[cameraIdStr] = CAMERA_DEVICE_STATUS_PRESENT;
        mCameraStatusMap[cameraIdStr] = CAMERA_DEVICE_STATUS_PRESENT;
        mCameraIds.add(cameraIdStr);


        // initialize mCameraDeviceNames and mOpenLegacySupported
        addDeviceNames(i);
        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__);
            }
        }
    }
    }


    return false; // mInitFailed
    return false; // mInitFailed
+3 −0
Original line number Original line Diff line number Diff line
@@ -112,6 +112,9 @@ private:
        const struct camera_module_callbacks* callbacks,
        const struct camera_module_callbacks* callbacks,
        const char* camera_id,
        const char* camera_id,
        int new_status);
        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);
extern "C" ICameraProvider* HIDL_FETCH_ICameraProvider(const char* name);