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

Commit 6dddeb7d authored by Bharatt Kukreja's avatar Bharatt Kukreja Committed by Shuzhen Wang
Browse files

Camera: Add getSessionCharacteristics API

Test: Build
Bug: 303645857
Change-Id: I251f244f8e24bd4c874f54f7c8c7215a4c3a50b3
parent 6fb9605c
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -99,6 +99,15 @@ interface ICameraDeviceUser
      */
      */
    boolean isSessionConfigurationSupported(in SessionConfiguration sessionConfiguration);
    boolean isSessionConfigurationSupported(in SessionConfiguration sessionConfiguration);


    /**
     * Get the camera characteristics for a particular session configuration
     *
     * @param sessionConfiguration Specific session configuration for which the characteristics
     * are fetched.
     * @return - characteristics associated with the given session.
     */
    CameraMetadataNative getSessionCharacteristics(in SessionConfiguration sessionConfiguration);

    void deleteStream(int streamId);
    void deleteStream(int streamId);


    /**
    /**
+54 −0
Original line number Original line Diff line number Diff line
@@ -777,6 +777,60 @@ binder::Status CameraDeviceClient::isSessionConfigurationSupported(
    return res;
    return res;
}
}


binder::Status CameraDeviceClient::getSessionCharacteristics(
        const SessionConfiguration& sessionConfiguration,
        /*out*/
        hardware::camera2::impl::CameraMetadataNative* sessionCharacteristics) {
    ATRACE_CALL();
    binder::Status res;
    status_t ret = OK;
    if (!(res = checkPidStatus(__FUNCTION__)).isOk()) return res;

    Mutex::Autolock icl(mBinderSerializationLock);

    if (!mDevice.get()) {
        return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive");
    }

    auto operatingMode = sessionConfiguration.getOperatingMode();
    res = SessionConfigurationUtils::checkOperatingMode(operatingMode, mDevice->info(),
            mCameraIdStr);
    if (!res.isOk()) {
        return res;
    }

    camera3::metadataGetter getMetadata = [this](const std::string &id,
            bool /*overrideForPerfClass*/) {
          return mDevice->infoPhysical(id);};
    ret = mProviderManager->getSessionCharacteristics(mCameraIdStr.c_str(),
            sessionConfiguration, mOverrideForPerfClass, getMetadata,
            sessionCharacteristics);

    switch (ret) {
        case OK:
            // Expected, do nothing.
            break;
        case INVALID_OPERATION: {
                std::string msg = fmt::sprintf(
                        "Camera %s: Session characteristics query not supported!",
                        mCameraIdStr.c_str());
                ALOGD("%s: %s", __FUNCTION__, msg.c_str());
                res = STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION, msg.c_str());
            }

            break;
        default: {
                std::string msg = fmt::sprintf( "Camera %s: Error: %s (%d)", mCameraIdStr.c_str(),
                        strerror(-ret), ret);
                ALOGE("%s: %s", __FUNCTION__, msg.c_str());
                res = STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT,
                        msg.c_str());
            }
    }

    return res;
}

binder::Status CameraDeviceClient::deleteStream(int streamId) {
binder::Status CameraDeviceClient::deleteStream(int streamId) {
    ATRACE_CALL();
    ATRACE_CALL();
    ALOGV("%s (streamId = 0x%x)", __FUNCTION__, streamId);
    ALOGV("%s (streamId = 0x%x)", __FUNCTION__, streamId);
+5 −0
Original line number Original line Diff line number Diff line
@@ -109,6 +109,11 @@ public:
            /*out*/
            /*out*/
            bool* streamStatus) override;
            bool* streamStatus) override;


    virtual binder::Status getSessionCharacteristics(
            const SessionConfiguration& sessionConfiguration,
            /*out*/
            hardware::camera2::impl::CameraMetadataNative* sessionCharacteristics) override;

    // Returns -EBUSY if device is not idle or in error state
    // Returns -EBUSY if device is not idle or in error state
    virtual binder::Status deleteStream(int streamId) override;
    virtual binder::Status deleteStream(int streamId) override;


+17 −0
Original line number Original line Diff line number Diff line
@@ -442,6 +442,23 @@ status_t CameraProviderManager::createDefaultRequest(const std::string& cameraI
    return OK;
    return OK;
}
}


status_t CameraProviderManager::getSessionCharacteristics(const std::string& id,
        const SessionConfiguration &configuration, bool overrideForPerfClass,
        metadataGetter getMetadata,
        CameraMetadata* sessionCharacteristics /*out*/) const {
    if (!flags::feature_combination_query()) {
        return INVALID_OPERATION;
    }
    std::lock_guard<std::mutex> lock(mInterfaceMutex);
    auto deviceInfo = findDeviceInfoLocked(id);
    if (deviceInfo == nullptr) {
        return NAME_NOT_FOUND;
    }

    return deviceInfo->getSessionCharacteristics(configuration,
            overrideForPerfClass, getMetadata, sessionCharacteristics);
}

status_t CameraProviderManager::getCameraIdIPCTransport(const std::string &id,
status_t CameraProviderManager::getCameraIdIPCTransport(const std::string &id,
        IPCTransport *providerTransport) const {
        IPCTransport *providerTransport) const {
    std::lock_guard<std::mutex> lock(mInterfaceMutex);
    std::lock_guard<std::mutex> lock(mInterfaceMutex);
+17 −0
Original line number Original line Diff line number Diff line
@@ -316,6 +316,14 @@ public:
            bool overrideForPerfClass, bool checkSessionParams,
            bool overrideForPerfClass, bool checkSessionParams,
            bool *status /*out*/) const;
            bool *status /*out*/) const;


    /**
     * Get session characteristics for a particular session.
     */
     status_t getSessionCharacteristics(const std::string& id,
            const SessionConfiguration &configuration,
            bool overrideForPerfClass, camera3::metadataGetter getMetadata,
            CameraMetadata* sessionCharacteristics /*out*/) const;

    /**
    /**
     * Return the highest supported device interface version for this ID
     * Return the highest supported device interface version for this ID
     */
     */
@@ -632,6 +640,15 @@ private:
                    bool * /*status*/) {
                    bool * /*status*/) {
                return INVALID_OPERATION;
                return INVALID_OPERATION;
            }
            }

            virtual status_t getSessionCharacteristics(
                    const SessionConfiguration &/*configuration*/,
                    bool /*overrideForPerfClass*/,
                    camera3::metadataGetter /*getMetadata*/,
                    CameraMetadata* /*sessionCharacteristics*/) {
                return INVALID_OPERATION;
            }

            virtual status_t filterSmallJpegSizes() = 0;
            virtual status_t filterSmallJpegSizes() = 0;
            virtual void notifyDeviceStateChange(int64_t /*newState*/) {}
            virtual void notifyDeviceStateChange(int64_t /*newState*/) {}
            virtual status_t createDefaultRequest(
            virtual status_t createDefaultRequest(
Loading