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

Commit bad4358c authored by Eino-Ville Talvala's avatar Eino-Ville Talvala
Browse files

Camera: Add camera type to ICameraService.getNumberOfCameras.

Also determine the number of 'normal' cameras present on
camera service startup, and ensure that all normal cameras have
IDs lower than the 'strange' cameras.

Bug: 23194168
Change-Id: I1f7b14825cb52707de698a955f85da1eaa932663
parent 49f0246c
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -94,11 +94,18 @@ public:
    {
    }

    // get number of cameras available
    // get number of cameras available that support standard camera operations
    virtual int32_t getNumberOfCameras()
    {
        return getNumberOfCameras(CAMERA_TYPE_BACKWARD_COMPATIBLE);
    }

    // get number of cameras available of a given type
    virtual int32_t getNumberOfCameras(int type)
    {
        Parcel data, reply;
        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
        data.writeInt32(type);
        remote()->transact(BnCameraService::GET_NUMBER_OF_CAMERAS, data, &reply);

        if (readExceptionCode(reply)) return 0;
@@ -337,7 +344,7 @@ status_t BnCameraService::onTransact(
        case GET_NUMBER_OF_CAMERAS: {
            CHECK_INTERFACE(ICameraService, data, reply);
            reply->writeNoException();
            reply->writeInt32(getNumberOfCameras());
            reply->writeInt32(getNumberOfCameras(data.readInt32()));
            return NO_ERROR;
        } break;
        case GET_CAMERA_INFO: {
+10 −0
Original line number Diff line number Diff line
@@ -63,6 +63,11 @@ public:
        API_VERSION_2 = 2,
    };

    enum {
        CAMERA_TYPE_BACKWARD_COMPATIBLE = 0,
        CAMERA_TYPE_ALL = 1,
    };

    enum {
        CAMERA_HAL_API_VERSION_UNSPECIFIED = -1
    };
@@ -81,7 +86,12 @@ public:
public:
    DECLARE_META_INTERFACE(CameraService);

    // Get the number of cameras that support basic color camera operation
    // (type CAMERA_TYPE_BACKWARD_COMPATIBLE)
    virtual int32_t  getNumberOfCameras() = 0;
    // Get the number of cameras of the specified type, one of CAMERA_TYPE_*
    // enums
    virtual int32_t  getNumberOfCameras(int cameraType) = 0;
    virtual status_t getCameraInfo(int cameraId,
            /*out*/
            struct CameraInfo* cameraInfo) = 0;
+88 −14
Original line number Diff line number Diff line
@@ -171,6 +171,7 @@ void CameraService::onFirstRef()
    }

    mNumberOfCameras = mModule->getNumberOfCameras();
    mNumberOfNormalCameras = mNumberOfCameras;

    mFlashlight = new CameraFlashlight(*mModule, *this);
    status_t res = mFlashlight->findFlashUnits();
@@ -179,27 +180,41 @@ void CameraService::onFirstRef()
        ALOGE("Failed to find flash units.");
    }

    int latestStrangeCameraId = INT_MAX;
    for (int i = 0; i < mNumberOfCameras; i++) {
        String8 cameraId = String8::format("%d", i);

        // Get camera info

        struct camera_info info;
        bool haveInfo = true;
        status_t rc = mModule->getCameraInfo(i, &info);
        if (rc != NO_ERROR) {
            ALOGE("%s: Received error loading camera info for device %d, cost and"
                    " conflicting devices fields set to defaults for this device.",
                    __FUNCTION__, i);
            haveInfo = false;
        }

        // Check for backwards-compatibility support
        if (haveInfo) {
            if (checkCameraCapabilities(i, info, &latestStrangeCameraId) != OK) {
                delete mModule;
                mModule = nullptr;
                return;
            }
        }

        // Defaults to use for cost and conflicting devices
        int cost = 100;
        char** conflicting_devices = nullptr;
        size_t conflicting_devices_length = 0;

        // If using post-2.4 module version, query the cost + conflicting devices from the HAL
        if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_4) {
            struct camera_info info;
            status_t rc = mModule->getCameraInfo(i, &info);
            if (rc == NO_ERROR) {
        if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_4 && haveInfo) {
            cost = info.resource_cost;
            conflicting_devices = info.conflicting_devices;
            conflicting_devices_length = info.conflicting_devices_length;
            } else {
                ALOGE("%s: Received error loading camera info for device %d, cost and"
                        " conflicting devices fields set to defaults for this device.",
                        __FUNCTION__, i);
            }
        }

        std::set<String8> conflicting;
@@ -382,9 +397,21 @@ void CameraService::onTorchStatusChangedLocked(const String8& cameraId,
    }
}


int32_t CameraService::getNumberOfCameras() {
    return getNumberOfCameras(CAMERA_TYPE_BACKWARD_COMPATIBLE);
}

int32_t CameraService::getNumberOfCameras(int type) {
    switch (type) {
        case CAMERA_TYPE_BACKWARD_COMPATIBLE:
            return mNumberOfNormalCameras;
        case CAMERA_TYPE_ALL:
            return mNumberOfCameras;
        default:
            ALOGW("%s: Unknown camera type %d, returning 0",
                    __FUNCTION__, type);
            return 0;
    }
}

status_t CameraService::getCameraInfo(int cameraId,
@@ -1494,6 +1521,53 @@ bool CameraService::evictClientIdByRemote(const wp<IBinder>& remote) {
}


/**
 * Check camera capabilities, such as support for basic color operation
 */
int CameraService::checkCameraCapabilities(int id, camera_info info, int *latestStrangeCameraId) {

    // Assume all devices pre-v3.3 are backward-compatible
    bool isBackwardCompatible = true;
    if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_0
            && info.device_version >= CAMERA_DEVICE_API_VERSION_3_3) {
        isBackwardCompatible = false;
        status_t res;
        camera_metadata_ro_entry_t caps;
        res = find_camera_metadata_ro_entry(
            info.static_camera_characteristics,
            ANDROID_REQUEST_AVAILABLE_CAPABILITIES,
            &caps);
        if (res != 0) {
            ALOGW("%s: Unable to find camera capabilities for camera device %d",
                    __FUNCTION__, id);
            caps.count = 0;
        }
        for (size_t i = 0; i < caps.count; i++) {
            if (caps.data.u8[i] ==
                    ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) {
                isBackwardCompatible = true;
                break;
            }
        }
    }

    if (!isBackwardCompatible) {
        mNumberOfNormalCameras--;
        *latestStrangeCameraId = id;
    } else {
        if (id > *latestStrangeCameraId) {
            ALOGE("%s: Normal camera ID %d higher than strange camera ID %d. "
                    "This is not allowed due backward-compatibility requirements",
                    __FUNCTION__, id, *latestStrangeCameraId);
            logServiceError("Invalid order of camera devices", ENODEV);
            mNumberOfCameras = 0;
            mNumberOfNormalCameras = 0;
            return INVALID_OPERATION;
        }
    }
    return OK;
}

std::shared_ptr<CameraService::CameraState> CameraService::getCameraState(
        const String8& cameraId) const {
    std::shared_ptr<CameraState> state;
+8 −0
Original line number Diff line number Diff line
@@ -100,7 +100,9 @@ public:

    /////////////////////////////////////////////////////////////////////
    // ICameraService
    virtual int32_t     getNumberOfCameras(int type);
    virtual int32_t     getNumberOfCameras();

    virtual status_t    getCameraInfo(int cameraId,
                                      struct CameraInfo* cameraInfo);
    virtual status_t    getCameraCharacteristics(int cameraId,
@@ -508,6 +510,11 @@ private:
    // Currently allowed user IDs
    std::set<userid_t> mAllowedUsers;

    /**
     * Check camera capabilities, such as support for basic color operation
     */
    int checkCameraCapabilities(int id, camera_info info, int *latestStrangeCameraId);

    /**
     * Get the camera state for a given camera id.
     *
@@ -610,6 +617,7 @@ private:
    void dumpEventLog(int fd);

    int                 mNumberOfCameras;
    int                 mNumberOfNormalCameras;

    // sounds
    MediaPlayer*        newMediaPlayer(const char *file);