diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-02 22:54:33 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-02 22:54:33 -0800 |
commit | 3dec7d563a2f3e1eb967ce2054a00b6620e3558c (patch) | |
tree | aa3b0365c47cb3c1607c0dc76c8d32b4046fc287 /camera/libcameraservice/CameraService.cpp | |
parent | 15ab3eae2ec3d73b3e8aa60b33ae41445bf83f4b (diff) | |
download | frameworks_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.cpp | 48 |
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); } |