summaryrefslogtreecommitdiffstats
path: root/camera/libcameraservice/CameraService.cpp
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-02 22:54:33 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-02 22:54:33 -0800
commit3dec7d563a2f3e1eb967ce2054a00b6620e3558c (patch)
treeaa3b0365c47cb3c1607c0dc76c8d32b4046fc287 /camera/libcameraservice/CameraService.cpp
parent15ab3eae2ec3d73b3e8aa60b33ae41445bf83f4b (diff)
downloadframeworks_base-3dec7d563a2f3e1eb967ce2054a00b6620e3558c.zip
frameworks_base-3dec7d563a2f3e1eb967ce2054a00b6620e3558c.tar.gz
frameworks_base-3dec7d563a2f3e1eb967ce2054a00b6620e3558c.tar.bz2
auto import from //depot/cupcake/@137055
Diffstat (limited to 'camera/libcameraservice/CameraService.cpp')
-rw-r--r--camera/libcameraservice/CameraService.cpp48
1 files changed, 27 insertions, 21 deletions
diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp
index e5d4220..953e637 100644
--- a/camera/libcameraservice/CameraService.cpp
+++ b/camera/libcameraservice/CameraService.cpp
@@ -152,7 +152,7 @@ void CameraService::removeClient(const sp<ICameraClient>& cameraClient)
}
CameraService::Client::Client(const sp<CameraService>& cameraService,
- const sp<ICameraClient>& cameraClient, pid_t clientPid)
+ const sp<ICameraClient>& cameraClient, pid_t clientPid)
{
LOGD("Client E constructor");
mCameraService = cameraService;
@@ -429,7 +429,7 @@ status_t CameraService::Client::startPreviewMode()
ret = mHardware->startPreview(NULL, mCameraService.get());
if (ret != NO_ERROR)
LOGE("mHardware->startPreview() failed with status %d\n", ret);
-
+
} else {
ret = mHardware->startPreview(previewCallback,
mCameraService.get());
@@ -684,13 +684,33 @@ status_t CameraService::Client::takePicture()
return INVALID_OPERATION;
}
- if (mSurface != NULL && !mUseOverlay)
- mSurface->unregisterBuffers();
- return mHardware->takePicture(shutterCallback,
+ Mutex::Autolock buffer_lock(mBufferLock);
+ result = mHardware->takePicture(shutterCallback,
yuvPictureCallback,
jpegPictureCallback,
mCameraService.get());
+
+ // It takes quite some time before yuvPicture callback to be called.
+ // Register the buffer for raw image here to reduce latency.
+ // But yuvPictureCallback is called from libcamera. So do not call into a
+ // libcamera function here that gets another lock, which may cause deadlock.
+ if (mSurface != 0 && !mUseOverlay) {
+ int w, h;
+ CameraParameters params(mHardware->getParameters());
+ params.getPictureSize(&w, &h);
+ mSurface->unregisterBuffers();
+ uint32_t transform = 0;
+ if (params.getOrientation() == CameraParameters::CAMERA_ORIENTATION_PORTRAIT) {
+ LOGV("portrait mode");
+ transform = ISurface::BufferHeap::ROT_90;
+ }
+ ISurface::BufferHeap buffers(w, h, w, h,
+ PIXEL_FORMAT_YCbCr_420_SP, transform, 0, mHardware->getRawHeap());
+ mSurface->registerBuffers(buffers);
+ }
+
+ return result;
}
// picture callback - snapshot taken
@@ -732,23 +752,9 @@ void CameraService::Client::yuvPictureCallback(const sp<IMemory>& mem,
#endif
// Put the YUV version of the snapshot in the preview display.
- int w, h;
- CameraParameters params(client->mHardware->getParameters());
- params.getPictureSize(&w, &h);
-
-// Mutex::Autolock clientLock(client->mLock);
+ // Use lock to make sure buffer has been registered.
+ Mutex::Autolock clientLock(client->mBufferLock);
if (client->mSurface != 0 && !client->mUseOverlay) {
- client->mSurface->unregisterBuffers();
-
- uint32_t transform = 0;
- if (params.getOrientation() == CameraParameters::CAMERA_ORIENTATION_PORTRAIT) {
- LOGV("portrait mode");
- transform = ISurface::BufferHeap::ROT_90;
- }
- ISurface::BufferHeap buffers(w, h, w, h,
- PIXEL_FORMAT_YCbCr_420_SP, transform, 0, heap);
-
- client->mSurface->registerBuffers(buffers);
client->mSurface->postBuffer(offset);
}