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

Commit 168799c3 authored by Chong Zhang's avatar Chong Zhang Committed by Android (Google) Code Review
Browse files

Merge "release camera without holding CameraSource mutex" into lmp-dev

parents 25842048 121969b7
Loading
Loading
Loading
Loading
+58 −41
Original line number Diff line number Diff line
@@ -677,27 +677,41 @@ void CameraSource::stopCameraRecording() {

void CameraSource::releaseCamera() {
    ALOGV("releaseCamera");
    if (mCamera != 0) {
    sp<Camera> camera;
    bool coldCamera = false;
    {
        Mutex::Autolock autoLock(mLock);
        // get a local ref and clear ref to mCamera now
        camera = mCamera;
        mCamera.clear();
        coldCamera = (mCameraFlags & FLAGS_HOT_CAMERA) == 0;
    }

    if (camera != 0) {
        int64_t token = IPCThreadState::self()->clearCallingIdentity();
        if ((mCameraFlags & FLAGS_HOT_CAMERA) == 0) {
        if (coldCamera) {
            ALOGV("Camera was cold when we started, stopping preview");
            mCamera->stopPreview();
            mCamera->disconnect();
            camera->stopPreview();
            camera->disconnect();
        }
        mCamera->unlock();
        mCamera.clear();
        mCamera = 0;
        camera->unlock();
        IPCThreadState::self()->restoreCallingIdentity(token);
    }

    {
        Mutex::Autolock autoLock(mLock);
        if (mCameraRecordingProxy != 0) {
            mCameraRecordingProxy->asBinder()->unlinkToDeath(mDeathNotifier);
            mCameraRecordingProxy.clear();
        }
        mCameraFlags = 0;
    }
}

status_t CameraSource::reset() {
    ALOGD("reset: E");

    {
        Mutex::Autolock autoLock(mLock);
        mStarted = false;
        mFrameAvailableCondition.signal();
@@ -718,7 +732,6 @@ status_t CameraSource::reset() {
            }
        }
        stopCameraRecording();
    releaseCamera();
        if (isTokenValid) {
            IPCThreadState::self()->restoreCallingIdentity(token);
        }
@@ -734,6 +747,10 @@ status_t CameraSource::reset() {
        }

        CHECK_EQ(mNumFramesReceived, mNumFramesEncoded + mNumFramesDropped);
    }

    releaseCamera();

    ALOGD("reset: X");
    return OK;
}