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

Commit 3bead5f9 authored by Emilian Peev's avatar Emilian Peev
Browse files

Camera: Don't mark request thread as IDLE in configured state

Marking the request thread as IDLE in any state different from
ACTIVE is not necessary. In configured state the device can
immediately reconfigure the streams and will not wait
for the status tracker notification.

Bug: 157451818
Test: Camera CTS

Change-Id: I22e357ab13d016404cfc939ca595d48fb08cf686
parent b4a3b65d
Loading
Loading
Loading
Loading
+19 −24
Original line number Diff line number Diff line
@@ -1777,13 +1777,6 @@ void Camera3Device::internalUpdateStatusLocked(Status status) {
    mStatusChanged.broadcast();
}

void Camera3Device::pauseStateNotify(bool enable) {
    Mutex::Autolock il(mInterfaceLock);
    Mutex::Autolock l(mLock);

    mPauseStateNotify = enable;
}

// Pause to reconfigure
status_t Camera3Device::internalPauseAndWaitLocked(nsecs_t maxExpectedDuration) {
    if (mRequestThread.get() != nullptr) {
@@ -2359,7 +2352,7 @@ bool Camera3Device::checkAbandonedStreamsLocked() {
    return false;
}

bool Camera3Device::reconfigureCamera(const CameraMetadata& sessionParams) {
bool Camera3Device::reconfigureCamera(const CameraMetadata& sessionParams, int clientStatusId) {
    ATRACE_CALL();
    bool ret = false;

@@ -2373,7 +2366,16 @@ bool Camera3Device::reconfigureCamera(const CameraMetadata& sessionParams) {
        return true;
    }

    auto rc = internalPauseAndWaitLocked(maxExpectedDuration);
    status_t rc = NO_ERROR;
    bool markClientActive = false;
    if (mStatus == STATUS_ACTIVE) {
        markClientActive = true;
        mPauseStateNotify = true;
        mStatusTracker->markComponentIdle(clientStatusId, Fence::NO_FENCE);

        rc = internalPauseAndWaitLocked(maxExpectedDuration);
    }

    if (rc == NO_ERROR) {
        mNeedConfig = true;
        rc = configureStreamsLocked(mOperatingMode, sessionParams, /*notifyRequestThread*/ false);
@@ -2401,6 +2403,10 @@ bool Camera3Device::reconfigureCamera(const CameraMetadata& sessionParams) {
        ALOGE("%s: Failed to pause streaming: %d", __FUNCTION__, rc);
    }

    if (markClientActive) {
        mStatusTracker->markComponentActive(clientStatusId);
    }

    return ret;
}

@@ -4277,22 +4283,11 @@ bool Camera3Device::RequestThread::threadLoop() {
        }

        if (res == OK) {
            sp<StatusTracker> statusTracker = mStatusTracker.promote();
            if (statusTracker != 0) {
            sp<Camera3Device> parent = mParent.promote();
            if (parent != nullptr) {
                    parent->pauseStateNotify(true);
                }

                statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE);

                if (parent != nullptr) {
                    mReconfigured |= parent->reconfigureCamera(mLatestSessionParams);
                mReconfigured |= parent->reconfigureCamera(mLatestSessionParams, mStatusId);
            }

                statusTracker->markComponentActive(mStatusId);
            setPaused(false);
            }

            if (mNextRequests[0].captureRequest->mInputStream != nullptr) {
                mNextRequests[0].captureRequest->mInputStream->restoreConfiguredState();
+2 −9
Original line number Diff line number Diff line
@@ -637,18 +637,11 @@ class Camera3Device :
    sp<CaptureRequest> createCaptureRequest(const PhysicalCameraSettingsList &request,
                                            const SurfaceMap &surfaceMap);

    /**
     * Pause state updates to the client application.  Needed to mask out idle/active
     * transitions during internal reconfigure
     */
    void pauseStateNotify(bool enable);

    /**
     * Internally re-configure camera device using new session parameters.
     * This will get triggered by the request thread. Be sure to call
     * pauseStateNotify(true) before going idle in the requesting location.
     * This will get triggered by the request thread.
     */
    bool reconfigureCamera(const CameraMetadata& sessionParams);
    bool reconfigureCamera(const CameraMetadata& sessionParams, int clientStatusId);

    /**
     * Return true in case of any output or input abandoned streams,