diff options
Diffstat (limited to 'libs/ui/Camera.cpp')
-rw-r--r-- | libs/ui/Camera.cpp | 119 |
1 files changed, 91 insertions, 28 deletions
diff --git a/libs/ui/Camera.cpp b/libs/ui/Camera.cpp index 1528e6e..9527009 100644 --- a/libs/ui/Camera.cpp +++ b/libs/ui/Camera.cpp @@ -1,28 +1,28 @@ /* ** -** Copyright 2008, The Android Open Source Project +** Copyright (C) 2008, The Android Open Source Project +** Copyright (C) 2008 HTC Inc. ** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at ** -** http://www.apache.org/licenses/LICENSE-2.0 +** http://www.apache.org/licenses/LICENSE-2.0 ** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and ** limitations under the License. */ +//#define LOG_NDEBUG 0 #define LOG_TAG "Camera" #include <utils/Log.h> - #include <utils/IServiceManager.h> #include <utils/threads.h> #include <utils/IMemory.h> #include <ui/Surface.h> - #include <ui/Camera.h> #include <ui/ICameraService.h> @@ -60,20 +60,36 @@ const sp<ICameraService>& Camera::getCameraService() // --------------------------------------------------------------------------- Camera::Camera() - : mStatus(UNKNOWN_ERROR), - mShutterCallback(0), - mShutterCallbackCookie(0), - mRawCallback(0), - mRawCallbackCookie(0), - mJpegCallback(0), - mJpegCallbackCookie(0), - mFrameCallback(0), - mFrameCallbackCookie(0), - mErrorCallback(0), - mErrorCallbackCookie(0), - mAutoFocusCallback(0), - mAutoFocusCallbackCookie(0) { + init(); +} + +Camera::Camera(const sp<ICamera>& camera) +{ + init(); + // connect this client to existing camera remote + if (camera->connect(this) == NO_ERROR) { + mStatus = NO_ERROR; + mCamera = camera; + camera->asBinder()->linkToDeath(this); + } +} + +void Camera::init() +{ + mStatus = UNKNOWN_ERROR; + mShutterCallback = 0; + mShutterCallbackCookie = 0; + mRawCallback = 0; + mRawCallbackCookie = 0; + mJpegCallback = 0; + mJpegCallbackCookie = 0; + mFrameCallback = 0; + mFrameCallbackCookie = 0; + mErrorCallback = 0; + mErrorCallbackCookie = 0; + mAutoFocusCallback = 0; + mAutoFocusCallbackCookie = 0; } Camera::~Camera() @@ -83,6 +99,7 @@ Camera::~Camera() sp<Camera> Camera::connect() { + LOGV("connect"); sp<Camera> c = new Camera(); const sp<ICameraService>& cs = getCameraService(); if (cs != 0) { @@ -97,6 +114,7 @@ sp<Camera> Camera::connect() void Camera::disconnect() { + LOGV("disconnect"); if (mCamera != 0) { mErrorCallback = 0; mCamera->disconnect(); @@ -104,9 +122,24 @@ void Camera::disconnect() } } +status_t Camera::reconnect() +{ + LOGV("reconnect"); + if (mCamera != 0) { + return mCamera->connect(this); + } + return NO_INIT; +} + +sp<ICamera> Camera::remote() +{ + return mCamera; +} + // pass the buffered ISurface to the camera service status_t Camera::setPreviewDisplay(const sp<Surface>& surface) { + LOGV("setPreviewDisplay"); if (surface == 0) { LOGE("app passed NULL surface"); return NO_INIT; @@ -114,81 +147,105 @@ status_t Camera::setPreviewDisplay(const sp<Surface>& surface) return mCamera->setPreviewDisplay(surface->getISurface()); } +status_t Camera::setPreviewDisplay(const sp<ISurface>& surface) +{ + LOGV("setPreviewDisplay"); + if (surface == 0) { + LOGE("app passed NULL surface"); + return NO_INIT; + } + return mCamera->setPreviewDisplay(surface); +} + + // start preview mode, must call setPreviewDisplay first status_t Camera::startPreview() { + LOGV("startPreview"); return mCamera->startPreview(); } // stop preview mode void Camera::stopPreview() { + LOGV("stopPreview"); mCamera->stopPreview(); } status_t Camera::autoFocus() { + LOGV("autoFocus"); return mCamera->autoFocus(); } // take a picture status_t Camera::takePicture() { + LOGV("takePicture"); return mCamera->takePicture(); } // set preview/capture parameters - key/value pairs status_t Camera::setParameters(const String8& params) { + LOGV("setParameters"); return mCamera->setParameters(params); } // get preview/capture parameters - key/value pairs String8 Camera::getParameters() const { + LOGV("getParameters"); String8 params = mCamera->getParameters(); return params; } void Camera::setAutoFocusCallback(autofocus_callback cb, void *cookie) { + LOGV("setAutoFocusCallback"); mAutoFocusCallback = cb; mAutoFocusCallbackCookie = cookie; } void Camera::setShutterCallback(shutter_callback cb, void *cookie) { + LOGV("setShutterCallback"); mShutterCallback = cb; mShutterCallbackCookie = cookie; } void Camera::setRawCallback(frame_callback cb, void *cookie) { + LOGV("setRawCallback"); mRawCallback = cb; mRawCallbackCookie = cookie; } void Camera::setJpegCallback(frame_callback cb, void *cookie) { + LOGV("setJpegCallback"); mJpegCallback = cb; mJpegCallbackCookie = cookie; } -void Camera::setFrameCallback(frame_callback cb, void *cookie) +void Camera::setFrameCallback(frame_callback cb, void *cookie, int frame_callback_flag) { + LOGV("setFrameCallback"); mFrameCallback = cb; mFrameCallbackCookie = cookie; - mCamera->setHasFrameCallback(cb != NULL); + mCamera->setFrameCallbackFlag(frame_callback_flag); } void Camera::setErrorCallback(error_callback cb, void *cookie) { + LOGV("setErrorCallback"); mErrorCallback = cb; mErrorCallbackCookie = cookie; } void Camera::autoFocusCallback(bool focused) { + LOGV("autoFocusCallback"); if (mAutoFocusCallback) { mAutoFocusCallback(focused, mAutoFocusCallbackCookie); } @@ -196,6 +253,7 @@ void Camera::autoFocusCallback(bool focused) void Camera::shutterCallback() { + LOGV("shutterCallback"); if (mShutterCallback) { mShutterCallback(mShutterCallbackCookie); } @@ -203,6 +261,7 @@ void Camera::shutterCallback() void Camera::rawCallback(const sp<IMemory>& picture) { + LOGV("rawCallback"); if (mRawCallback) { mRawCallback(picture, mRawCallbackCookie); } @@ -211,6 +270,7 @@ void Camera::rawCallback(const sp<IMemory>& picture) // callback from camera service when image is ready void Camera::jpegCallback(const sp<IMemory>& picture) { + LOGV("jpegCallback"); if (mJpegCallback) { mJpegCallback(picture, mJpegCallbackCookie); } @@ -219,6 +279,7 @@ void Camera::jpegCallback(const sp<IMemory>& picture) // callback from camera service when video frame is ready void Camera::frameCallback(const sp<IMemory>& frame) { + LOGV("frameCallback"); if (mFrameCallback) { mFrameCallback(frame, mFrameCallbackCookie); } @@ -227,19 +288,21 @@ void Camera::frameCallback(const sp<IMemory>& frame) // callback from camera service when an error occurs in preview or takePicture void Camera::errorCallback(status_t error) { + LOGV("errorCallback"); if (mErrorCallback) { mErrorCallback(error, mErrorCallbackCookie); } } -void Camera::binderDied(const wp<IBinder>& who) { +void Camera::binderDied(const wp<IBinder>& who) { LOGW("ICamera died"); if (mErrorCallback) { mErrorCallback(DEAD_OBJECT, mErrorCallbackCookie); } } -void Camera::DeathNotifier::binderDied(const wp<IBinder>& who) { +void Camera::DeathNotifier::binderDied(const wp<IBinder>& who) { + LOGV("binderDied"); Mutex::Autolock _l(Camera::mLock); Camera::mCameraService.clear(); LOGW("Camera server died!"); |