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/Camera.cpp | 126 ++++-------------------------------------------------- 1 file changed, 8 insertions(+), 118 deletions(-) (limited to 'camera/Camera.cpp') diff --git a/camera/Camera.cpp b/camera/Camera.cpp index d8dc2a5..f417c90 100644 --- a/camera/Camera.cpp +++ b/camera/Camera.cpp @@ -27,46 +27,16 @@ #include #include #include +#include #include #include namespace android { -// client singleton for camera service binder interface -Mutex Camera::mLock; -sp Camera::mCameraService; -sp Camera::mDeathNotifier; - -// establish binder interface to camera service -const sp& Camera::getCameraService() +Camera::Camera(int cameraId) + : CameraBase(cameraId) { - 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; -} - -// --------------------------------------------------------------------------- - -Camera::Camera() -{ - init(); } // construct a camera client from an existing camera remote @@ -78,7 +48,7 @@ sp Camera::create(const sp& camera) return 0; } - sp c = new Camera(); + sp c = new Camera(-1); if (camera->connect(c) == NO_ERROR) { c->mStatus = NO_ERROR; c->mCamera = camera; @@ -88,11 +58,6 @@ sp Camera::create(const sp& camera) return 0; } -void Camera::init() -{ - mStatus = UNKNOWN_ERROR; -} - Camera::~Camera() { // We don't need to call disconnect() here because if the CameraService @@ -103,47 +68,10 @@ Camera::~Camera() // deadlock if we call any method of ICamera here. } -int32_t Camera::getNumberOfCameras() -{ - const sp& cs = getCameraService(); - if (cs == 0) return 0; - return cs->getNumberOfCameras(); -} - -status_t Camera::getCameraInfo(int cameraId, - struct CameraInfo* cameraInfo) { - const sp& cs = getCameraService(); - if (cs == 0) return UNKNOWN_ERROR; - return cs->getCameraInfo(cameraId, cameraInfo); -} - sp Camera::connect(int cameraId, const String16& clientPackageName, int clientUid) { - ALOGV("connect"); - sp c = new Camera(); - sp cl = c; - const sp& cs = getCameraService(); - if (cs != 0) { - c->mCamera = cs->connect(cl, cameraId, clientPackageName, clientUid); - } - if (c->mCamera != 0) { - c->mCamera->asBinder()->linkToDeath(c); - c->mStatus = NO_ERROR; - } else { - c.clear(); - } - return c; -} - -void Camera::disconnect() -{ - ALOGV("disconnect"); - if (mCamera != 0) { - mCamera->disconnect(); - mCamera->asBinder()->unlinkToDeath(this); - mCamera = 0; - } + return CameraBaseT::connect(cameraId, clientPackageName, clientUid); } status_t Camera::reconnect() @@ -154,11 +82,6 @@ status_t Camera::reconnect() return c->connect(this); } -sp Camera::remote() -{ - return mCamera; -} - status_t Camera::lock() { sp c = mCamera; @@ -353,28 +276,14 @@ void Camera::setPreviewCallbackFlags(int flag) // callback from camera service void Camera::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 Camera::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 @@ -393,31 +302,12 @@ void Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp< return; } - sp listener; - { - Mutex::Autolock _l(mLock); - listener = mListener; - } - if (listener != NULL) { - listener->postDataTimestamp(timestamp, msgType, dataPtr); - } else { + if (!CameraBaseT::dataCallbackTimestamp(timestamp, msgType, dataPtr)) { ALOGW("No listener was set. Drop a recording frame."); releaseRecordingFrame(dataPtr); } } -void Camera::binderDied(const wp& who) { - ALOGW("ICamera died"); - notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_SERVER_DIED, 0); -} - -void Camera::DeathNotifier::binderDied(const wp& who) { - ALOGV("binderDied"); - Mutex::Autolock _l(Camera::mLock); - Camera::mCameraService.clear(); - ALOGW("Camera server died!"); -} - sp Camera::getRecordingProxy() { ALOGV("getProxy"); return new RecordingProxy(this); -- cgit v1.1