summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Kondik <shade@chemlab.org>2010-11-10 21:20:32 -0500
committerSteve Kondik <shade@chemlab.org>2010-11-11 22:43:44 -0500
commit731adc40c1054583cd0d2cc32c7a905227dc4942 (patch)
tree0d53460a138799db6de2769c53795fbcefbbc7f9
parent39215374a2b700082776d2cd64299f66c0ca68fc (diff)
downloadframeworks_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.cpp72
-rw-r--r--camera/libcameraservice/CameraService.h1
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;