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

Commit c4f54024 authored by Shuzhen Wang's avatar Shuzhen Wang Committed by Android (Google) Code Review
Browse files

Merge "Camera: Add support for physical camera characteristics query"

parents c98be0a2 d3feb3d6
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -319,6 +319,41 @@ int CameraModule::getCameraInfo(int cameraId, struct camera_info *info) {
    return OK;
}

int CameraModule::getPhysicalCameraInfo(int physicalCameraId, camera_metadata_t **physicalInfo) {
    ATRACE_CALL();
    Mutex::Autolock lock(mCameraInfoLock);
    if (physicalCameraId < 0) {
        ALOGE("%s: Invalid physical camera ID %d", __FUNCTION__, physicalCameraId);
        return -EINVAL;
    }

    // Only query physical camera info for 2.5 version for newer
    int apiVersion = mModule->common.module_api_version;
    if (apiVersion < CAMERA_MODULE_API_VERSION_2_5) {
        ALOGE("%s: Module version must be at least 2.5 to handle getPhysicalCameraInfo",
                __FUNCTION__);
        return -ENODEV;
    }

    ssize_t index = mPhysicalCameraInfoMap.indexOfKey(physicalCameraId);
    if (index == NAME_NOT_FOUND) {
        // Get physical camera characteristics, and cache it
        camera_metadata_t *info = nullptr;
        ATRACE_BEGIN("camera_module->get_physical_camera_info");
        int ret = mModule->get_physical_camera_info(physicalCameraId, &info);
        ATRACE_END();
        if (ret != 0) {
            return ret;
        }

        index = mPhysicalCameraInfoMap.add(physicalCameraId, info);
    }

    assert(index != NAME_NOT_FOUND);
    *physicalInfo = mPhysicalCameraInfoMap[index];
    return OK;
}

int CameraModule::getDeviceVersion(int cameraId) {
    ssize_t index = mDeviceVersionMap.indexOfKey(cameraId);
    if (index == NAME_NOT_FOUND) {
+2 −0
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ public:
    void *getDso();
    // Only used by CameraProvider
    void removeCamera(int cameraId);
    int getPhysicalCameraInfo(int physicalCameraId, camera_metadata_t **physicalInfo);

private:
    // Derive camera characteristics keys defined after HAL device version
@@ -76,6 +77,7 @@ private:
    camera_module_t *mModule;
    KeyedVector<int, camera_info> mCameraInfoMap;
    KeyedVector<int, int> mDeviceVersionMap;
    KeyedVector<int, camera_metadata_t*> mPhysicalCameraInfoMap;
    Mutex mCameraInfoLock;
};

+5 −3
Original line number Diff line number Diff line
@@ -101,7 +101,7 @@ Status CameraDevice::getHidlStatus(int status) {
}

// Methods from ::android::hardware::camera::device::V3_2::ICameraDevice follow.
Return<void> CameraDevice::getResourceCost(getResourceCost_cb _hidl_cb)  {
Return<void> CameraDevice::getResourceCost(ICameraDevice::getResourceCost_cb _hidl_cb)  {
    Status status = initStatus();
    CameraResourceCost resCost;
    if (status == Status::OK) {
@@ -141,7 +141,8 @@ Return<void> CameraDevice::getResourceCost(getResourceCost_cb _hidl_cb) {
    return Void();
}

Return<void> CameraDevice::getCameraCharacteristics(getCameraCharacteristics_cb _hidl_cb)  {
Return<void> CameraDevice::getCameraCharacteristics(
        ICameraDevice::getCameraCharacteristics_cb _hidl_cb)  {
    Status status = initStatus();
    CameraMetadata cameraCharacteristics;
    if (status == Status::OK) {
@@ -172,7 +173,8 @@ Return<Status> CameraDevice::setTorchMode(TorchMode mode) {
    return status;
}

Return<void> CameraDevice::open(const sp<ICameraDeviceCallback>& callback, open_cb _hidl_cb)  {
Return<void> CameraDevice::open(const sp<ICameraDeviceCallback>& callback,
        ICameraDevice::open_cb _hidl_cb)  {
    Status status = initStatus();
    sp<CameraDeviceSession> session = nullptr;

+47 −7
Original line number Diff line number Diff line
@@ -51,7 +51,7 @@ using ::android::Mutex;
/*
 * The camera device HAL implementation is opened lazily (via the open call)
 */
struct CameraDevice : public ICameraDevice {
struct CameraDevice : public virtual RefBase {
    // Called by provider HAL. Provider HAL must ensure the uniqueness of
    // CameraDevice object per cameraId, or there could be multiple CameraDevice
    // trying to access the same physical camera.
@@ -60,7 +60,14 @@ struct CameraDevice : public ICameraDevice {
    CameraDevice(sp<CameraModule> module,
                 const std::string& cameraId,
                 const SortedVector<std::pair<std::string, std::string>>& cameraDeviceNames);
    ~CameraDevice();
    virtual ~CameraDevice();

    // Retrieve the HIDL interface, split into its own class to avoid inheritance issues when
    // dealing with minor version revs and simultaneous implementation and interface inheritance
    virtual sp<ICameraDevice> getInterface() {
        return new TrampolineDeviceInterface_3_2(this);
    }

    // Caller must use this method to check if CameraDevice ctor failed
    bool isInitFailed() { return mInitFail; }
    // Used by provider HAL to signal external camera disconnected
@@ -68,16 +75,16 @@ struct CameraDevice : public ICameraDevice {

    /* Methods from ::android::hardware::camera::device::V3_2::ICameraDevice follow. */
    // The following method can be called without opening the actual camera device
    Return<void> getResourceCost(getResourceCost_cb _hidl_cb) override;
    Return<void> getCameraCharacteristics(getCameraCharacteristics_cb _hidl_cb) override;
    Return<Status> setTorchMode(TorchMode mode) override;
    Return<void> getResourceCost(ICameraDevice::getResourceCost_cb _hidl_cb);
    Return<void> getCameraCharacteristics(ICameraDevice::getCameraCharacteristics_cb _hidl_cb);
    Return<Status> setTorchMode(TorchMode mode);

    // Open the device HAL and also return a default capture session
    Return<void> open(const sp<ICameraDeviceCallback>& callback, open_cb _hidl_cb) override;
    Return<void> open(const sp<ICameraDeviceCallback>& callback, ICameraDevice::open_cb _hidl_cb);


    // Forward the dump call to the opened session, or do nothing
    Return<void> dumpState(const ::android::hardware::hidl_handle& fd) override;
    Return<void> dumpState(const ::android::hardware::hidl_handle& fd);
    /* End of Methods from ::android::hardware::camera::device::V3_2::ICameraDevice */

protected:
@@ -106,6 +113,39 @@ protected:
    static Status getHidlStatus(int);

    Status initStatus() const;

private:
    struct TrampolineDeviceInterface_3_2 : public ICameraDevice {
        TrampolineDeviceInterface_3_2(sp<CameraDevice> parent) :
            mParent(parent) {}

        virtual Return<void> getResourceCost(V3_2::ICameraDevice::getResourceCost_cb _hidl_cb)
                override {
            return mParent->getResourceCost(_hidl_cb);
        }

        virtual Return<void> getCameraCharacteristics(
                V3_2::ICameraDevice::getCameraCharacteristics_cb _hidl_cb) override {
            return mParent->getCameraCharacteristics(_hidl_cb);
        }

        virtual Return<Status> setTorchMode(TorchMode mode) override {
            return mParent->setTorchMode(mode);
        }

        virtual Return<void> open(const sp<V3_2::ICameraDeviceCallback>& callback,
                V3_2::ICameraDevice::open_cb _hidl_cb) override {
            return mParent->open(callback, _hidl_cb);
        }

        virtual Return<void> dumpState(const hidl_handle& fd) override {
            return mParent->dumpState(fd);
        }

    private:
        sp<CameraDevice> mParent;
    };

};

}  // namespace implementation
+23 −0
Original line number Diff line number Diff line
// This file is autogenerated by hidl-gen -Landroidbp.

hidl_interface {
    name: "android.hardware.camera.device@3.5",
    root: "android.hardware",
    vndk: {
        enabled: true,
    },
    srcs: [
        "ICameraDevice.hal",
        "ICameraDeviceSession.hal",
    ],
    interfaces: [
        "android.hardware.camera.common@1.0",
        "android.hardware.camera.device@3.2",
        "android.hardware.camera.device@3.3",
        "android.hardware.camera.device@3.4",
        "android.hardware.graphics.common@1.0",
        "android.hidl.base@1.0",
    ],
    gen_java: false,
}
Loading