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

Commit 4e7fa273 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Camera: Don't mark request thread as IDLE in configured state" into rvc-dev am: ccfd5262

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/av/+/11692381

Change-Id: Ibfb166ac359809b8339ae6f4815c816c1f65d0fc
parents 8565bf27 ccfd5262
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,