diff options
author | Steve Kondik <shade@chemlab.org> | 2010-11-10 21:20:32 -0500 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2010-11-11 22:43:44 -0500 |
commit | 731adc40c1054583cd0d2cc32c7a905227dc4942 (patch) | |
tree | 0d53460a138799db6de2769c53795fbcefbbc7f9 | |
parent | 39215374a2b700082776d2cd64299f66c0ca68fc (diff) | |
download | frameworks_base-731adc40c1054583cd0d2cc32c7a905227dc4942.zip frameworks_base-731adc40c1054583cd0d2cc32c7a905227dc4942.tar.gz frameworks_base-731adc40c1054583cd0d2cc32c7a905227dc4942.tar.bz2 |
cameraservice: Changes for using overlay on 7X30
* Handle NULL instance of camera HAL
* Use YCbCr_420_SP overlay format
* Properly destroy overlay before starting new snapshot
Change-Id: Ie72552f508f1fdc818928bf5329640b3fb9f9673
-rw-r--r-- | camera/libcameraservice/CameraService.cpp | 72 | ||||
-rw-r--r-- | camera/libcameraservice/CameraService.h | 1 |
2 files changed, 47 insertions, 26 deletions
diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp index d74a1dd..43e92bc 100644 --- a/camera/libcameraservice/CameraService.cpp +++ b/camera/libcameraservice/CameraService.cpp @@ -158,6 +158,11 @@ sp<ICamera> CameraService::connect(const sp<ICameraClient>& cameraClient) // create a new Client object client = new Client(this, cameraClient, callingPid); mClient = client; + if (client->mHardware == NULL) { + client = NULL; + mClient = NULL; + return client; + } #if DEBUG_CLIENT_REFERENCES // Enable tracking for this object, and track increments and decrements of // the refcount. @@ -239,27 +244,29 @@ CameraService::Client::Client(const sp<CameraService>& cameraService, mCameraClient = cameraClient; mClientPid = clientPid; mHardware = openCameraHardware(); - mUseOverlay = mHardware->useOverlay(); - - mHardware->setCallbacks(notifyCallback, - dataCallback, - dataCallbackTimestamp, - mCameraService.get()); - - // Enable zoom, error, and focus messages by default - mHardware->enableMsgType(CAMERA_MSG_ERROR | - CAMERA_MSG_ZOOM | - CAMERA_MSG_FOCUS); - - mMediaPlayerClick = newMediaPlayer("/system/media/audio/ui/camera_click.ogg"); - mMediaPlayerBeep = newMediaPlayer("/system/media/audio/ui/VideoRecord.ogg"); - mOverlayW = 0; - mOverlayH = 0; - - // Callback is disabled by default - mPreviewCallbackFlag = FRAME_CALLBACK_FLAG_NOOP; - mOrientation = 0; - cameraService->incUsers(); + if (mHardware != NULL) { + mUseOverlay = mHardware->useOverlay(); + + mHardware->setCallbacks(notifyCallback, + dataCallback, + dataCallbackTimestamp, + mCameraService.get()); + + // Enable zoom, error, and focus messages by default + mHardware->enableMsgType(CAMERA_MSG_ERROR | + CAMERA_MSG_ZOOM | + CAMERA_MSG_FOCUS); + + mMediaPlayerClick = newMediaPlayer("/system/media/audio/ui/camera_click.ogg"); + mMediaPlayerBeep = newMediaPlayer("/system/media/audio/ui/VideoRecord.ogg"); + mOverlayW = 0; + mOverlayH = 0; + + // Callback is disabled by default + mPreviewCallbackFlag = FRAME_CALLBACK_FLAG_NOOP; + mOrientation = 0; + cameraService->incUsers(); + } LOGV("Client::Client X (pid %d)", callingPid); } @@ -439,6 +446,10 @@ void CameraService::Client::disconnect() // Release the held overlay resources. if (mUseOverlay) { + /* Release previous overlay handle */ + if (mOverlay != NULL) { + mOverlay->destroy(); + } mOverlayRef = 0; } mHardware.clear(); @@ -479,9 +490,11 @@ status_t CameraService::Client::setPreviewDisplay(const sp<ISurface>& surface) mOverlayRef = 0; // If preview has been already started, set overlay or register preview // buffers now. - if (mHardware->previewEnabled()) { + if (mHardware->previewEnabled() || mUseOverlay) { if (mUseOverlay) { - result = setOverlay(); + if (mSurface != NULL) { + result = setOverlay(); + } } else if (mSurface != 0) { result = registerPreviewBuffers(); } @@ -590,6 +603,9 @@ status_t CameraService::Client::setOverlay() sp<Overlay> dummy; mHardware->setOverlay( dummy ); mOverlayRef = 0; + if (mOverlay != NULL) { + mOverlay->destroy(); + } } status_t ret = NO_ERROR; @@ -603,7 +619,7 @@ status_t CameraService::Client::setOverlay() // wait in the createOverlay call if the previous overlay is in the // process of being destroyed. for (int retry = 0; retry < 50; ++retry) { - mOverlayRef = mSurface->createOverlay(w, h, OVERLAY_FORMAT_DEFAULT, + mOverlayRef = mSurface->createOverlay(w, h, OVERLAY_FORMAT_YCbCr_420_SP, mOrientation); if (mOverlayRef != NULL) break; LOGW("Overlay create failed - retrying"); @@ -614,7 +630,8 @@ status_t CameraService::Client::setOverlay() LOGE("Overlay Creation Failed!"); return -EINVAL; } - ret = mHardware->setOverlay(new Overlay(mOverlayRef)); + mOverlay = new Overlay(mOverlayRef); + ret = mHardware->setOverlay(mOverlay); } } else { ret = mHardware->setOverlay(NULL); @@ -676,8 +693,8 @@ status_t CameraService::Client::startPreviewMode() if (mSurface != 0) { ret = setOverlay(); } - if (ret != NO_ERROR) return ret; ret = mHardware->startPreview(); + if (ret != NO_ERROR) return ret; } else { mHardware->enableMsgType(CAMERA_MSG_PREVIEW_FRAME); ret = mHardware->startPreview(); @@ -740,6 +757,9 @@ void CameraService::Client::stopPreview() if (mSurface != 0 && !mUseOverlay) { mSurface->unregisterBuffers(); + } else { + mOverlayW = 0; + mOverlayH = 0; } } diff --git a/camera/libcameraservice/CameraService.h b/camera/libcameraservice/CameraService.h index 48cd861..2918b0e 100644 --- a/camera/libcameraservice/CameraService.h +++ b/camera/libcameraservice/CameraService.h @@ -199,6 +199,7 @@ private: bool mUseOverlay; sp<OverlayRef> mOverlayRef; + sp<Overlay> mOverlay; int mOverlayW; int mOverlayH; |