From ceae1d5450522c01889ebc782a3b71c5d38eac07 Mon Sep 17 00:00:00 2001 From: Tyler Luu Date: Thu, 13 Oct 2011 20:52:48 -0500 Subject: CameraHal: Handle dynamic switch in setParameters Instead of stopping preview in start preview for a dynamic switch. Go ahead and stop preview in setParameters. Need to force stop preview so all the buffers will be unlocked in case application captures an image and switches to camcorder mode before it restarts preview. Otherwise, camera service will disconnect the window while we are still holding locks for the buffers. Error log: "gralloc_unregister_buffer: Cannot unregister a locked buffer" Change-Id: Ic252609e5fbcfde569e1dbd8614572df6392bade Signed-off-by: Tyler Luu --- camera/CameraHal.cpp | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) (limited to 'camera') diff --git a/camera/CameraHal.cpp b/camera/CameraHal.cpp index 73d16de..84c6da7 100644 --- a/camera/CameraHal.cpp +++ b/camera/CameraHal.cpp @@ -389,7 +389,7 @@ int CameraHal::setParameters(const CameraParameters& params) if ( ( oldWidth != w ) || ( oldHeight != h ) ) { - mDynamicPreviewSwitch = true; + restartPreviewRequired |= true; } CAMHAL_LOGDB("PreviewResolution by App %d x %d", w, h); @@ -403,7 +403,7 @@ int CameraHal::setParameters(const CameraParameters& params) { CAMHAL_LOGDB("Recording Hint is set to %s", valstr); mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr); - restartPreviewRequired = setVideoModeParameters(params); + restartPreviewRequired |= setVideoModeParameters(params); videoMode = true; int w, h; @@ -423,7 +423,7 @@ int CameraHal::setParameters(const CameraParameters& params) { CAMHAL_LOGDB("Recording Hint is set to %s", valstr); mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr); - restartPreviewRequired = resetVideoModeParameters(); + restartPreviewRequired |= resetVideoModeParameters(); params.getPreviewSize(&mVideoWidth, &mVideoHeight); } else @@ -440,7 +440,7 @@ int CameraHal::setParameters(const CameraParameters& params) // then Video Mode parameters may remain present in ImageCapture activity as well. CAMHAL_LOGDA("Recording Hint is set to NULL"); mParameters.set(CameraParameters::KEY_RECORDING_HINT, ""); - restartPreviewRequired = resetVideoModeParameters(); + restartPreviewRequired |= resetVideoModeParameters(); params.getPreviewSize(&mVideoWidth, &mVideoHeight); } @@ -1002,11 +1002,14 @@ int CameraHal::setParameters(const CameraParameters& params) // Restart Preview if needed by KEY_RECODING_HINT only if preview is already running. // If preview is not started yet, Video Mode parameters will take effect on next startPreview() - if(restartPreviewRequired && previewEnabled()) - { - CAMHAL_LOGDA("Restarting Preview as needed by KEY_RECODING_HINT"); + if (restartPreviewRequired && previewEnabled()) { + CAMHAL_LOGDA("Restarting Preview"); ret = restartPreview(); - } + } else if (restartPreviewRequired && !previewEnabled() && mDisplayPaused) { + CAMHAL_LOGDA("Stopping Preview"); + forceStopPreview(); + } + if (ret != NO_ERROR) { CAMHAL_LOGEA("Failed to restart Preview"); @@ -1459,15 +1462,7 @@ status_t CameraHal::startPreview() { mAppCallbackNotifier->enableMsgType (CAMERA_MSG_PREVIEW_FRAME); } - if ( mDynamicPreviewSwitch ) - { - forceStopPreview(); - mDynamicPreviewSwitch = false; - } - else - { - return ret; - } + return ret; } @@ -1620,7 +1615,6 @@ status_t CameraHal::startPreview() mPreviewEnabled = true; mPreviewStartInProgress = false; - mDynamicPreviewSwitch = false; return ret; error: @@ -2028,7 +2022,7 @@ status_t CameraHal::restartPreview() tmpvalstr[sizeof(tmpvalstr)-1] = 0; } - stopPreview(); + forceStopPreview(); { Mutex::Autolock lock(mLock); @@ -2795,7 +2789,6 @@ CameraHal::CameraHal(int cameraId) mRecordingEnabled = 0; mRecordEnabled = 0; mSensorListener = NULL; - mDynamicPreviewSwitch = false; mVideoWidth = 0; mVideoHeight = 0; -- cgit v1.2.3