From 8d19d3ae1e828e9189e2174e8ea88374af93f18e Mon Sep 17 00:00:00 2001 From: James Dong Date: Fri, 8 Jul 2011 17:59:29 -0700 Subject: [PATCH] Release camera if CameraSource::start() has not been called Change-Id: I2f7e4b8501db3d80b9aa6f99d896d778bec29e8c --- include/media/stagefright/CameraSource.h | 6 ++++++ media/libstagefright/CameraSource.cpp | 25 +++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/include/media/stagefright/CameraSource.h b/include/media/stagefright/CameraSource.h index 80b7c1cfb15e..8c1c59351e90 100644 --- a/include/media/stagefright/CameraSource.h +++ b/include/media/stagefright/CameraSource.h @@ -197,6 +197,12 @@ private: status_t init(const sp& camera, const sp& proxy, int32_t cameraId, Size videoSize, int32_t frameRate, bool storeMetaDataInVideoBuffers); + + status_t initWithCameraAccess( + const sp& camera, const sp& proxy, + int32_t cameraId, Size videoSize, int32_t frameRate, + bool storeMetaDataInVideoBuffers); + status_t isCameraAvailable(const sp& camera, const sp& proxy, int32_t cameraId); diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp index ed8149abbbd3..c7e7ced50bb9 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& camera, + const sp& 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); -- 2.11.0