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

Commit 5fbe0ba2 authored by Emilian Peev's avatar Emilian Peev
Browse files

Camera: Add support for session parameters

The initial values of the session-wide capture parameters
should be passed along the stream list during stream
configuration. This could yield performance gains depending
on the Hal implementation and support.

Bug: 64450664
Test: Camera CTS
Change-Id: I2b0ec8916f027e7f34f81dc414c3ca649807e925
parent 3700e162
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -79,8 +79,9 @@ interface ICameraDeviceUser
     * <p>
     * @param operatingMode The kind of session to create; either NORMAL_MODE or
     *     CONSTRAINED_HIGH_SPEED_MODE. Must be a non-negative value.
     * @param sessionParams Session wide camera parameters
     */
    void endConfigure(int operatingMode);
    void endConfigure(int operatingMode, in CameraMetadataNative sessionParams);

    void deleteStream(int streamId);

+17 −1
Original line number Diff line number Diff line
@@ -220,5 +220,21 @@ camera_status_t ACameraDevice_createCaptureSession(
                __FUNCTION__, device, outputs, callbacks, session);
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }
    return device->createCaptureSession(outputs, callbacks, session);
    return device->createCaptureSession(outputs, nullptr, callbacks, session);
}

EXPORT
camera_status_t ACameraDevice_createCaptureSessionWithSessionParameters(
        ACameraDevice* device,
        const ACaptureSessionOutputContainer*       outputs,
        const ACaptureRequest* sessionParameters,
        const ACameraCaptureSession_stateCallbacks* callbacks,
        /*out*/ACameraCaptureSession** session) {
    ATRACE_CALL();
    if (device == nullptr || outputs == nullptr || callbacks == nullptr || session == nullptr) {
        ALOGE("%s: Error: invalid input: device %p, outputs %p, callbacks %p, session %p",
                __FUNCTION__, device, outputs, callbacks, session);
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }
    return device->createCaptureSession(outputs, sessionParameters, callbacks, session);
}
+10 −4
Original line number Diff line number Diff line
@@ -157,6 +157,7 @@ CameraDevice::createCaptureRequest(
camera_status_t
CameraDevice::createCaptureSession(
        const ACaptureSessionOutputContainer*       outputs,
        const ACaptureRequest* sessionParameters,
        const ACameraCaptureSession_stateCallbacks* callbacks,
        /*out*/ACameraCaptureSession** session) {
    sp<ACameraCaptureSession> currentSession = mCurrentSession.promote();
@@ -172,7 +173,7 @@ CameraDevice::createCaptureSession(
    }

    // Create new session
    ret = configureStreamsLocked(outputs);
    ret = configureStreamsLocked(outputs, sessionParameters);
    if (ret != ACAMERA_OK) {
        ALOGE("Fail to create new session. cannot configure streams");
        return ret;
@@ -434,7 +435,7 @@ CameraDevice::notifySessionEndOfLifeLocked(ACameraCaptureSession* session) {
    }

    // No new session, unconfigure now
    camera_status_t ret = configureStreamsLocked(nullptr);
    camera_status_t ret = configureStreamsLocked(nullptr, nullptr);
    if (ret != ACAMERA_OK) {
        ALOGE("Unconfigure stream failed. Device might still be configured! ret %d", ret);
    }
@@ -598,7 +599,8 @@ CameraDevice::getSurfaceFromANativeWindow(
}

camera_status_t
CameraDevice::configureStreamsLocked(const ACaptureSessionOutputContainer* outputs) {
CameraDevice::configureStreamsLocked(const ACaptureSessionOutputContainer* outputs,
        const ACaptureRequest* sessionParameters) {
    ACaptureSessionOutputContainer emptyOutput;
    if (outputs == nullptr) {
        outputs = &emptyOutput;
@@ -694,7 +696,11 @@ CameraDevice::configureStreamsLocked(const ACaptureSessionOutputContainer* outpu
        mConfiguredOutputs.insert(std::make_pair(streamId, outputPair));
    }

    remoteRet = mRemote->endConfigure(/*isConstrainedHighSpeed*/ false);
    CameraMetadata params;
    if ((sessionParameters != nullptr) && (sessionParameters->settings != nullptr)) {
        params.append(sessionParameters->settings->getInternalData());
    }
    remoteRet = mRemote->endConfigure(/*isConstrainedHighSpeed*/ false, params);
    if (remoteRet.serviceSpecificErrorCode() == hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) {
        ALOGE("Camera device %s cannnot support app output configuration: %s", getId(),
                remoteRet.toString8().string());
+5 −2
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ class CameraDevice final : public RefBase {

    camera_status_t createCaptureSession(
            const ACaptureSessionOutputContainer*       outputs,
            const ACaptureRequest* sessionParameters,
            const ACameraCaptureSession_stateCallbacks* callbacks,
            /*out*/ACameraCaptureSession** session);

@@ -139,7 +140,8 @@ class CameraDevice final : public RefBase {
    // For capture session to notify its end of life
    void notifySessionEndOfLifeLocked(ACameraCaptureSession* session);

    camera_status_t configureStreamsLocked(const ACaptureSessionOutputContainer* outputs);
    camera_status_t configureStreamsLocked(const ACaptureSessionOutputContainer* outputs,
           const ACaptureRequest* sessionParameters);

    // Input message will be posted and cleared after this returns
    void postSessionMsgAndCleanup(sp<AMessage>& msg);
@@ -309,9 +311,10 @@ struct ACameraDevice {

    camera_status_t createCaptureSession(
            const ACaptureSessionOutputContainer*       outputs,
            const ACaptureRequest* sessionParameters,
            const ACameraCaptureSession_stateCallbacks* callbacks,
            /*out*/ACameraCaptureSession** session) {
        return mDevice->createCaptureSession(outputs, callbacks, session);
        return mDevice->createCaptureSession(outputs, sessionParameters, callbacks, session);
    }

    /***********************
+1 −1
Original line number Diff line number Diff line
@@ -235,7 +235,7 @@ ACameraMetadata::getTags(/*out*/int32_t* numTags,
}

const CameraMetadata&
ACameraMetadata::getInternalData() {
ACameraMetadata::getInternalData() const {
    return mData;
}

Loading