Loading media/libstagefright/CameraSource.cpp +58 −41 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -718,7 +732,6 @@ status_t CameraSource::reset() { } } stopCameraRecording(); releaseCamera(); if (isTokenValid) { IPCThreadState::self()->restoreCallingIdentity(token); } Loading @@ -734,6 +747,10 @@ status_t CameraSource::reset() { } CHECK_EQ(mNumFramesReceived, mNumFramesEncoded + mNumFramesDropped); } releaseCamera(); ALOGD("reset: X"); return OK; } Loading Loading
media/libstagefright/CameraSource.cpp +58 −41 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -718,7 +732,6 @@ status_t CameraSource::reset() { } } stopCameraRecording(); releaseCamera(); if (isTokenValid) { IPCThreadState::self()->restoreCallingIdentity(token); } Loading @@ -734,6 +747,10 @@ status_t CameraSource::reset() { } CHECK_EQ(mNumFramesReceived, mNumFramesEncoded + mNumFramesDropped); } releaseCamera(); ALOGD("reset: X"); return OK; } Loading