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

Commit c3ddddbd authored by Chong Zhang's avatar Chong Zhang Committed by android-build-merger
Browse files

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

automerge: 168799c3

* commit '168799c3':
  release camera without holding CameraSource mutex
  move audio sink open/close to NuPlayerRenderer
  Fix freed memory references
  audio policy: move intializations to onFirstRef()
  Fix VideoFrame class layout for 64/32 bit
  NuPlayer: wait for renderer flush before decoder shutdown
  Fix uncertainty of one normal mix buffer in AudioTrack::getTimestamp
  send available codec buffer count with codec notification
  mediarecorder: set level if setting default profile
  stagefright: move math templates into AUtils.h
  NuPlayer: Fix flush mode decoder error handling
  Revert "Fix uncertainty of one normal mix buffer in AudioTrack::getTimestamp"
  GenericSource: support disconnect before NuCachedSource2 is created
  mediaplayer: make frame-accurate avsync configurable
parents f04e8b5e 168799c3
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;
}