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

Commit b09b4b17 authored by Eino-Ville Talvala's avatar Eino-Ville Talvala Committed by Android Git Automerger
Browse files

am 580bd181: am e4dfac0e: am bad4358c: Camera: Add camera type to...

am 580bd181: am e4dfac0e: am bad4358c: Camera: Add camera type to ICameraService.getNumberOfCameras.

* commit '580bd181':
  Camera: Add camera type to ICameraService.getNumberOfCameras.
parents ca049655 580bd181
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);