diff options
author | James Dong <jdong@google.com> | 2011-07-08 17:59:29 -0700 |
---|---|---|
committer | James Dong <jdong@google.com> | 2011-07-10 14:19:26 -0700 |
commit | 8d19d3ae1e828e9189e2174e8ea88374af93f18e (patch) | |
tree | 5060fcab1635721ce1a0d79b6cc038c4ccfb9e61 /media | |
parent | 6dabb63307a0b63f9386d61e8444aed29db2081e (diff) | |
download | frameworks_base-8d19d3ae1e828e9189e2174e8ea88374af93f18e.zip frameworks_base-8d19d3ae1e828e9189e2174e8ea88374af93f18e.tar.gz frameworks_base-8d19d3ae1e828e9189e2174e8ea88374af93f18e.tar.bz2 |
Release camera if CameraSource::start() has not been called
Change-Id: I2f7e4b8501db3d80b9aa6f99d896d778bec29e8c
Diffstat (limited to 'media')
-rw-r--r-- | media/libstagefright/CameraSource.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp index ed8149a..c7e7ced 100644 --- a/media/libstagefright/CameraSource.cpp +++ b/media/libstagefright/CameraSource.cpp @@ -158,12 +158,10 @@ CameraSource::CameraSource( mVideoSize.width = -1; mVideoSize.height = -1; - int64_t token = IPCThreadState::self()->clearCallingIdentity(); mInitCheck = init(camera, proxy, cameraId, videoSize, frameRate, storeMetaDataInVideoBuffers); if (mInitCheck != OK) releaseCamera(); - IPCThreadState::self()->restoreCallingIdentity(token); } status_t CameraSource::initCheck() const { @@ -463,6 +461,22 @@ status_t CameraSource::init( bool storeMetaDataInVideoBuffers) { status_t err = OK; + int64_t token = IPCThreadState::self()->clearCallingIdentity(); + err = initWithCameraAccess(camera, proxy, cameraId, + videoSize, frameRate, + storeMetaDataInVideoBuffers); + IPCThreadState::self()->restoreCallingIdentity(token); + return err; +} + +status_t CameraSource::initWithCameraAccess( + const sp<ICamera>& camera, + const sp<ICameraRecordingProxy>& proxy, + int32_t cameraId, + Size videoSize, + int32_t frameRate, + bool storeMetaDataInVideoBuffers) { + status_t err = OK; if ((err = isCameraAvailable(camera, proxy, cameraId)) != OK) { LOGE("Camera connection could not be established."); @@ -525,6 +539,11 @@ status_t CameraSource::init( CameraSource::~CameraSource() { if (mStarted) { stop(); + } else if (mInitCheck == OK) { + // Camera is initialized but because start() is never called, + // the lock on Camera is never released(). This makes sure + // Camera's lock is released in this case. + releaseCamera(); } } @@ -571,6 +590,7 @@ void CameraSource::stopCameraRecording() { void CameraSource::releaseCamera() { LOGV("releaseCamera"); if (mCamera != 0) { + int64_t token = IPCThreadState::self()->clearCallingIdentity(); if ((mCameraFlags & FLAGS_HOT_CAMERA) == 0) { LOGV("Camera was cold when we started, stopping preview"); mCamera->stopPreview(); @@ -580,6 +600,7 @@ void CameraSource::releaseCamera() { mCamera->unlock(); } mCamera.clear(); + IPCThreadState::self()->restoreCallingIdentity(token); } if (mCameraRecordingProxy != 0) { mCameraRecordingProxy->asBinder()->unlinkToDeath(mDeathNotifier); |