From 1ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0 Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Wed, 21 Aug 2013 13:57:21 -0700 Subject: [PATCH] Camera1: Set preview to be asynchronous, and remove dead code - Use the controlledByApp flag to make sure application-bound preview buffer queue is asynchronous as before - Remove setPreviewDisplay in service, since it is no longer in the binder interface - Rename setPreviewTexture to setPreviewTarget, to make it clear it's the only game in town now. Rename only on the binder level and service for now. Bug: 10312644 Change-Id: Icd33a462022f9729a63dc65c69b755cb7969857e --- camera/Camera.cpp | 4 ++-- camera/ICamera.cpp | 18 ++++++++-------- include/camera/Camera.h | 4 ++-- include/camera/ICamera.h | 4 ++-- services/camera/libcameraservice/CameraService.h | 3 +-- .../camera/libcameraservice/api1/Camera2Client.cpp | 25 +++++----------------- .../camera/libcameraservice/api1/Camera2Client.h | 3 +-- .../camera/libcameraservice/api1/CameraClient.cpp | 20 ++++++----------- .../camera/libcameraservice/api1/CameraClient.h | 3 +-- 9 files changed, 30 insertions(+), 54 deletions(-) diff --git a/camera/Camera.cpp b/camera/Camera.cpp index 22016a9f22..bbc4aa48ea 100644 --- a/camera/Camera.cpp +++ b/camera/Camera.cpp @@ -106,7 +106,7 @@ status_t Camera::setPreviewTexture(const sp& bufferProdu sp c = mCamera; if (c == 0) return NO_INIT; ALOGD_IF(bufferProducer == 0, "app passed NULL surface"); - return c->setPreviewTexture(bufferProducer); + return c->setPreviewTarget(bufferProducer); } // start preview mode @@ -127,7 +127,7 @@ status_t Camera::storeMetaDataInBuffers(bool enabled) return c->storeMetaDataInBuffers(enabled); } -// start recording mode, must call setPreviewDisplay first +// start recording mode, must call setPreviewTexture first status_t Camera::startRecording() { ALOGV("startRecording"); diff --git a/camera/ICamera.cpp b/camera/ICamera.cpp index 12356f0cd2..8c6e1f7226 100644 --- a/camera/ICamera.cpp +++ b/camera/ICamera.cpp @@ -29,7 +29,7 @@ namespace android { enum { DISCONNECT = IBinder::FIRST_CALL_TRANSACTION, - SET_PREVIEW_TEXTURE, + SET_PREVIEW_TARGET, SET_PREVIEW_CALLBACK_FLAG, SET_PREVIEW_CALLBACK_TARGET, START_PREVIEW, @@ -70,14 +70,14 @@ public: } // pass the buffered IGraphicBufferProducer to the camera service - status_t setPreviewTexture(const sp& bufferProducer) + status_t setPreviewTarget(const sp& bufferProducer) { - ALOGV("setPreviewTexture"); + ALOGV("setPreviewTarget"); Parcel data, reply; data.writeInterfaceToken(ICamera::getInterfaceDescriptor()); sp b(bufferProducer->asBinder()); data.writeStrongBinder(b); - remote()->transact(SET_PREVIEW_TEXTURE, data, &reply); + remote()->transact(SET_PREVIEW_TARGET, data, &reply); return reply.readInt32(); } @@ -104,7 +104,7 @@ public: return reply.readInt32(); } - // start preview mode, must call setPreviewDisplay first + // start preview mode, must call setPreviewTarget first status_t startPreview() { ALOGV("startPreview"); @@ -114,7 +114,7 @@ public: return reply.readInt32(); } - // start recording mode, must call setPreviewDisplay first + // start recording mode, must call setPreviewTarget first status_t startRecording() { ALOGV("startRecording"); @@ -285,12 +285,12 @@ status_t BnCamera::onTransact( reply->writeNoException(); return NO_ERROR; } break; - case SET_PREVIEW_TEXTURE: { - ALOGV("SET_PREVIEW_TEXTURE"); + case SET_PREVIEW_TARGET: { + ALOGV("SET_PREVIEW_TARGET"); CHECK_INTERFACE(ICamera, data, reply); sp st = interface_cast(data.readStrongBinder()); - reply->writeInt32(setPreviewTexture(st)); + reply->writeInt32(setPreviewTarget(st)); return NO_ERROR; } break; case SET_PREVIEW_CALLBACK_FLAG: { diff --git a/include/camera/Camera.h b/include/camera/Camera.h index 81848b3ba1..b1b2e95b54 100644 --- a/include/camera/Camera.h +++ b/include/camera/Camera.h @@ -83,7 +83,7 @@ public: // pass the buffered IGraphicBufferProducer to the camera service status_t setPreviewTexture(const sp& bufferProducer); - // start preview mode, must call setPreviewDisplay first + // start preview mode, must call setPreviewTexture first status_t startPreview(); // stop preview mode @@ -92,7 +92,7 @@ public: // get preview state bool previewEnabled(); - // start recording mode, must call setPreviewDisplay first + // start recording mode, must call setPreviewTexture first status_t startRecording(); // stop recording mode diff --git a/include/camera/ICamera.h b/include/camera/ICamera.h index f3a186e3d3..b02573520a 100644 --- a/include/camera/ICamera.h +++ b/include/camera/ICamera.h @@ -50,7 +50,7 @@ public: virtual status_t unlock() = 0; // pass the buffered IGraphicBufferProducer to the camera service - virtual status_t setPreviewTexture( + virtual status_t setPreviewTarget( const sp& bufferProducer) = 0; // set the preview callback flag to affect how the received frames from @@ -64,7 +64,7 @@ public: virtual status_t setPreviewCallbackTarget( const sp& callbackProducer) = 0; - // start preview mode, must call setPreviewDisplay first + // start preview mode, must call setPreviewTarget first virtual status_t startPreview() = 0; // stop preview mode diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h index 3921cbd06c..b34a0f6422 100644 --- a/services/camera/libcameraservice/CameraService.h +++ b/services/camera/libcameraservice/CameraService.h @@ -212,8 +212,7 @@ public: virtual status_t connect(const sp& client) = 0; virtual status_t lock() = 0; virtual status_t unlock() = 0; - virtual status_t setPreviewDisplay(const sp& surface) = 0; - virtual status_t setPreviewTexture(const sp& bufferProducer)=0; + virtual status_t setPreviewTarget(const sp& bufferProducer)=0; virtual void setPreviewCallbackFlag(int flag) = 0; virtual status_t setPreviewCallbackTarget( const sp& callbackProducer) = 0; diff --git a/services/camera/libcameraservice/api1/Camera2Client.cpp b/services/camera/libcameraservice/api1/Camera2Client.cpp index 46aa60c3a0..3d9fe016ff 100644 --- a/services/camera/libcameraservice/api1/Camera2Client.cpp +++ b/services/camera/libcameraservice/api1/Camera2Client.cpp @@ -491,25 +491,7 @@ status_t Camera2Client::unlock() { return EBUSY; } -status_t Camera2Client::setPreviewDisplay( - const sp& surface) { - ATRACE_CALL(); - ALOGV("%s: E", __FUNCTION__); - Mutex::Autolock icl(mBinderSerializationLock); - status_t res; - if ( (res = checkPid(__FUNCTION__) ) != OK) return res; - - sp binder; - sp window; - if (surface != 0) { - binder = surface->getIGraphicBufferProducer()->asBinder(); - window = surface; - } - - return setPreviewWindowL(binder,window); -} - -status_t Camera2Client::setPreviewTexture( +status_t Camera2Client::setPreviewTarget( const sp& bufferProducer) { ATRACE_CALL(); ALOGV("%s: E", __FUNCTION__); @@ -521,7 +503,10 @@ status_t Camera2Client::setPreviewTexture( sp window; if (bufferProducer != 0) { binder = bufferProducer->asBinder(); - window = new Surface(bufferProducer); + // Using controlledByApp flag to ensure that the buffer queue remains in + // async mode for the old camera API, where many applications depend + // on that behavior. + window = new Surface(bufferProducer, /*controlledByApp*/ true); } return setPreviewWindowL(binder, window); } diff --git a/services/camera/libcameraservice/api1/Camera2Client.h b/services/camera/libcameraservice/api1/Camera2Client.h index ed448f3db6..53629a1be4 100644 --- a/services/camera/libcameraservice/api1/Camera2Client.h +++ b/services/camera/libcameraservice/api1/Camera2Client.h @@ -57,8 +57,7 @@ public: virtual status_t connect(const sp& client); virtual status_t lock(); virtual status_t unlock(); - virtual status_t setPreviewDisplay(const sp& surface); - virtual status_t setPreviewTexture( + virtual status_t setPreviewTarget( const sp& bufferProducer); virtual void setPreviewCallbackFlag(int flag); virtual status_t setPreviewCallbackTarget( diff --git a/services/camera/libcameraservice/api1/CameraClient.cpp b/services/camera/libcameraservice/api1/CameraClient.cpp index ad8856bb12..bd6805d149 100644 --- a/services/camera/libcameraservice/api1/CameraClient.cpp +++ b/services/camera/libcameraservice/api1/CameraClient.cpp @@ -308,26 +308,20 @@ status_t CameraClient::setPreviewWindow(const sp& binder, return result; } -// set the Surface that the preview will use -status_t CameraClient::setPreviewDisplay(const sp& surface) { - LOG1("setPreviewDisplay(%p) (pid %d)", surface.get(), getCallingPid()); - - sp binder(surface != 0 ? surface->getIGraphicBufferProducer()->asBinder() : 0); - sp window(surface); - return setPreviewWindow(binder, window); -} - -// set the SurfaceTextureClient that the preview will use -status_t CameraClient::setPreviewTexture( +// set the buffer consumer that the preview will use +status_t CameraClient::setPreviewTarget( const sp& bufferProducer) { - LOG1("setPreviewTexture(%p) (pid %d)", bufferProducer.get(), + LOG1("setPreviewTarget(%p) (pid %d)", bufferProducer.get(), getCallingPid()); sp binder; sp window; if (bufferProducer != 0) { binder = bufferProducer->asBinder(); - window = new Surface(bufferProducer); + // Using controlledByApp flag to ensure that the buffer queue remains in + // async mode for the old camera API, where many applications depend + // on that behavior. + window = new Surface(bufferProducer, /*controlledByApp*/ true); } return setPreviewWindow(binder, window); } diff --git a/services/camera/libcameraservice/api1/CameraClient.h b/services/camera/libcameraservice/api1/CameraClient.h index abde75a2ca..4b89564a07 100644 --- a/services/camera/libcameraservice/api1/CameraClient.h +++ b/services/camera/libcameraservice/api1/CameraClient.h @@ -37,8 +37,7 @@ public: virtual status_t connect(const sp& client); virtual status_t lock(); virtual status_t unlock(); - virtual status_t setPreviewDisplay(const sp& surface); - virtual status_t setPreviewTexture(const sp& bufferProducer); + virtual status_t setPreviewTarget(const sp& bufferProducer); virtual void setPreviewCallbackFlag(int flag); virtual status_t setPreviewCallbackTarget( const sp& callbackProducer); -- 2.11.0