From c073ba525404f3416c2824c435d3d926a9892f1b Mon Sep 17 00:00:00 2001 From: Igor Murashkin Date: Tue, 26 Feb 2013 14:32:34 -0800 Subject: camera_client: refactor Camera/ProCamera commonalities into BasicCamera Change-Id: Ie10a4094522d49683657665fe94ab0b7ccd280e9 --- camera/ProCamera.cpp | 153 ++++++++------------------------------------------- 1 file changed, 24 insertions(+), 129 deletions(-) (limited to 'camera/ProCamera.cpp') diff --git a/camera/ProCamera.cpp b/camera/ProCamera.cpp index 7c66d62..13ba07c 100644 --- a/camera/ProCamera.cpp +++ b/camera/ProCamera.cpp @@ -31,71 +31,19 @@ #include #include -#include #include namespace android { -// client singleton for camera service binder interface -Mutex ProCamera::mLock; -sp ProCamera::mCameraService; -sp ProCamera::mDeathNotifier; - -// establish binder interface to camera service -const sp& ProCamera::getCameraService() -{ - Mutex::Autolock _l(mLock); - if (mCameraService.get() == 0) { - sp sm = defaultServiceManager(); - sp binder; - do { - binder = sm->getService(String16("media.camera")); - if (binder != 0) - break; - ALOGW("CameraService not published, waiting..."); - usleep(500000); // 0.5 s - } while(true); - if (mDeathNotifier == NULL) { - mDeathNotifier = new DeathNotifier(); - } - binder->linkToDeath(mDeathNotifier); - mCameraService = interface_cast(binder); - } - ALOGE_IF(mCameraService==0, "no CameraService!?"); - return mCameraService; -} - sp ProCamera::connect(int cameraId) { - ALOGV("connect"); - sp c = new ProCamera(); - sp cl = c; - const sp& cs = getCameraService(); - if (cs != 0) { - c->mCamera = cs->connect(cl, cameraId); - } - if (c->mCamera != 0) { - c->mCamera->asBinder()->linkToDeath(c); - c->mStatus = NO_ERROR; - } else { - c.clear(); - } - return c; -} - -void ProCamera::disconnect() -{ - ALOGV("%s: disconnect", __FUNCTION__); - if (mCamera != 0) { - mCamera->disconnect(); - mCamera->asBinder()->unlinkToDeath(this); - mCamera = 0; - } - ALOGV("%s: disconnect (done)", __FUNCTION__); + return CameraBaseT::connect(cameraId, String16(), + ICameraService::USE_CALLING_UID); } -ProCamera::ProCamera() +ProCamera::ProCamera(int cameraId) + : CameraBase(cameraId) { } @@ -104,74 +52,28 @@ ProCamera::~ProCamera() } -sp ProCamera::remote() -{ - return mCamera; -} - -void ProCamera::binderDied(const wp& who) { - ALOGW("IProCameraUser died"); - notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_SERVER_DIED, 0); -} - -void ProCamera::DeathNotifier::binderDied(const wp& who) { - ALOGV("binderDied"); - Mutex::Autolock _l(ProCamera::mLock); - ProCamera::mCameraService.clear(); - ALOGW("Camera service died!"); -} - -void ProCamera::setListener(const sp& listener) -{ - Mutex::Autolock _l(mLock); - mListener = listener; -} - +/* IProCameraUser's implementation */ // callback from camera service void ProCamera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) { - sp listener; - { - Mutex::Autolock _l(mLock); - listener = mListener; - } - if (listener != NULL) { - listener->notify(msgType, ext1, ext2); - } + return CameraBaseT::notifyCallback(msgType, ext1, ext2); } // callback from camera service when frame or image is ready void ProCamera::dataCallback(int32_t msgType, const sp& dataPtr, camera_frame_metadata_t *metadata) { - sp listener; - { - Mutex::Autolock _l(mLock); - listener = mListener; - } - if (listener != NULL) { - listener->postData(msgType, dataPtr, metadata); - } + return CameraBaseT::dataCallback(msgType, dataPtr, metadata); } // callback from camera service when timestamped frame is ready void ProCamera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, - const sp& dataPtr) + const sp& dataPtr) { - sp listener; - { - Mutex::Autolock _l(mLock); - listener = mListener; - } - if (listener != NULL) { - listener->postDataTimestamp(timestamp, msgType, dataPtr); - } else { - ALOGW("No listener was set. Drop a recording frame."); - } + CameraBaseT::dataCallbackTimestamp(timestamp, msgType, dataPtr); } -/* IProCameraUser's implementation */ void ProCamera::onLockStatusChanged( IProCameraCallbacks::LockStatus newLockStatus) @@ -291,9 +193,9 @@ status_t ProCamera::deleteStream(int streamId) } status_t ProCamera::createStream(int width, int height, int format, - const sp& surface, - /*out*/ - int* streamId) + const sp& surface, + /*out*/ + int* streamId) { *streamId = -1; @@ -304,14 +206,15 @@ status_t ProCamera::createStream(int width, int height, int format, return BAD_VALUE; } - return createStream(width, height, format, surface->getIGraphicBufferProducer(), + return createStream(width, height, format, + surface->getIGraphicBufferProducer(), streamId); } status_t ProCamera::createStream(int width, int height, int format, - const sp& bufferProducer, - /*out*/ - int* streamId) { + const sp& bufferProducer, + /*out*/ + int* streamId) { *streamId = -1; ALOGV("%s: createStreamT %dx%d (fmt=0x%x)", __FUNCTION__, width, height, @@ -335,10 +238,10 @@ status_t ProCamera::createStream(int width, int height, int format, } status_t ProCamera::createStreamCpu(int width, int height, int format, - int heapCount, - /*out*/ - sp* cpuConsumer, - int* streamId) + int heapCount, + /*out*/ + sp* cpuConsumer, + int* streamId) { ALOGV("%s: createStreamW %dx%d (fmt=0x%x)", __FUNCTION__, width, height, format); @@ -354,8 +257,9 @@ status_t ProCamera::createStreamCpu(int width, int height, int format, sp stc = new Surface( cc->getProducerInterface()); - status_t s = createStream(width, height, format, stc->getIGraphicBufferProducer(), - streamId); + status_t s = createStream(width, height, format, + stc->getIGraphicBufferProducer(), + streamId); if (s != OK) { ALOGE("%s: Failure to create stream %dx%d (fmt=0x%x)", __FUNCTION__, @@ -379,15 +283,6 @@ status_t ProCamera::createStreamCpu(int width, int height, int format, return s; } -int ProCamera::getNumberOfCameras() { - const sp cs = getCameraService(); - - if (!cs.get()) { - return DEAD_OBJECT; - } - return cs->getNumberOfCameras(); -} - camera_metadata* ProCamera::getCameraInfo(int cameraId) { ALOGV("%s: cameraId = %d", __FUNCTION__, cameraId); -- cgit v1.1