blob: 4a325ac2e0f353984df195e72606e0bbeb606c37 [file] [log] [blame]
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -07001/*
2**
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -08003** Copyright (C) 2008, The Android Open Source Project
4** Copyright (C) 2008 HTC Inc.
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -07005**
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -08006** Licensed under the Apache License, Version 2.0 (the "License");
7** you may not use this file except in compliance with the License.
8** You may obtain a copy of the License at
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -07009**
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080010** http://www.apache.org/licenses/LICENSE-2.0
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070011**
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080012** Unless required by applicable law or agreed to in writing, software
13** distributed under the License is distributed on an "AS IS" BASIS,
14** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15** See the License for the specific language governing permissions and
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070016** limitations under the License.
17*/
18
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080019//#define LOG_NDEBUG 0
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070020#define LOG_TAG "Camera"
21#include <utils/Log.h>
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070022#include <utils/IServiceManager.h>
23#include <utils/threads.h>
24#include <utils/IMemory.h>
25#include <ui/Surface.h>
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070026#include <ui/Camera.h>
27#include <ui/ICameraService.h>
28
29namespace android {
30
31// client singleton for camera service binder interface
32Mutex Camera::mLock;
33sp<ICameraService> Camera::mCameraService;
34sp<Camera::DeathNotifier> Camera::mDeathNotifier;
35
36// establish binder interface to camera service
37const sp<ICameraService>& Camera::getCameraService()
38{
39 Mutex::Autolock _l(mLock);
40 if (mCameraService.get() == 0) {
41 sp<IServiceManager> sm = defaultServiceManager();
42 sp<IBinder> binder;
43 do {
44 binder = sm->getService(String16("media.camera"));
45 if (binder != 0)
46 break;
47 LOGW("CameraService not published, waiting...");
48 usleep(500000); // 0.5 s
49 } while(true);
50 if (mDeathNotifier == NULL) {
51 mDeathNotifier = new DeathNotifier();
52 }
53 binder->linkToDeath(mDeathNotifier);
54 mCameraService = interface_cast<ICameraService>(binder);
55 }
56 LOGE_IF(mCameraService==0, "no CameraService!?");
57 return mCameraService;
58}
59
60// ---------------------------------------------------------------------------
61
62Camera::Camera()
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070063{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080064 init();
65}
66
67Camera::Camera(const sp<ICamera>& camera)
68{
69 init();
70 // connect this client to existing camera remote
71 if (camera->connect(this) == NO_ERROR) {
72 mStatus = NO_ERROR;
73 mCamera = camera;
74 camera->asBinder()->linkToDeath(this);
75 }
76}
77
78void Camera::init()
79{
80 mStatus = UNKNOWN_ERROR;
81 mShutterCallback = 0;
82 mShutterCallbackCookie = 0;
83 mRawCallback = 0;
84 mRawCallbackCookie = 0;
85 mJpegCallback = 0;
86 mJpegCallbackCookie = 0;
87 mFrameCallback = 0;
88 mFrameCallbackCookie = 0;
89 mErrorCallback = 0;
90 mErrorCallbackCookie = 0;
91 mAutoFocusCallback = 0;
92 mAutoFocusCallbackCookie = 0;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070093}
94
95Camera::~Camera()
96{
97 disconnect();
98}
99
100sp<Camera> Camera::connect()
101{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800102 LOGV("connect");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700103 sp<Camera> c = new Camera();
104 const sp<ICameraService>& cs = getCameraService();
105 if (cs != 0) {
106 c->mCamera = cs->connect(c);
107 }
108 if (c->mCamera != 0) {
109 c->mCamera->asBinder()->linkToDeath(c);
110 c->mStatus = NO_ERROR;
111 }
112 return c;
113}
114
115void Camera::disconnect()
116{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800117 LOGV("disconnect");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700118 if (mCamera != 0) {
119 mErrorCallback = 0;
120 mCamera->disconnect();
121 mCamera = 0;
122 }
123}
124
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800125status_t Camera::reconnect()
126{
127 LOGV("reconnect");
128 if (mCamera != 0) {
129 return mCamera->connect(this);
130 }
131 return NO_INIT;
132}
133
134sp<ICamera> Camera::remote()
135{
136 return mCamera;
137}
138
The Android Open Source Project27629322009-01-09 17:51:23 -0800139status_t Camera::lock()
140{
141 if (mCamera != 0) return mCamera->lock();
142 return NO_INIT;
143}
144
145status_t Camera::unlock()
146{
147 if (mCamera != 0) return mCamera->unlock();
148 return NO_INIT;
149}
150
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700151// pass the buffered ISurface to the camera service
152status_t Camera::setPreviewDisplay(const sp<Surface>& surface)
153{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800154 LOGV("setPreviewDisplay");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700155 if (surface == 0) {
156 LOGE("app passed NULL surface");
157 return NO_INIT;
158 }
159 return mCamera->setPreviewDisplay(surface->getISurface());
160}
161
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800162status_t Camera::setPreviewDisplay(const sp<ISurface>& surface)
163{
164 LOGV("setPreviewDisplay");
165 if (surface == 0) {
166 LOGE("app passed NULL surface");
167 return NO_INIT;
168 }
169 return mCamera->setPreviewDisplay(surface);
170}
171
172
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700173// start preview mode, must call setPreviewDisplay first
174status_t Camera::startPreview()
175{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800176 LOGV("startPreview");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700177 return mCamera->startPreview();
178}
179
180// stop preview mode
181void Camera::stopPreview()
182{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800183 LOGV("stopPreview");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700184 mCamera->stopPreview();
185}
186
The Android Open Source Project27629322009-01-09 17:51:23 -0800187// get preview state
188bool Camera::previewEnabled()
189{
190 LOGV("previewEnabled");
191 return mCamera->previewEnabled();
192}
193
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700194status_t Camera::autoFocus()
195{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800196 LOGV("autoFocus");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700197 return mCamera->autoFocus();
198}
199
200// take a picture
201status_t Camera::takePicture()
202{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800203 LOGV("takePicture");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700204 return mCamera->takePicture();
205}
206
207// set preview/capture parameters - key/value pairs
208status_t Camera::setParameters(const String8& params)
209{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800210 LOGV("setParameters");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700211 return mCamera->setParameters(params);
212}
213
214// get preview/capture parameters - key/value pairs
215String8 Camera::getParameters() const
216{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800217 LOGV("getParameters");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700218 String8 params = mCamera->getParameters();
219 return params;
220}
221
222void Camera::setAutoFocusCallback(autofocus_callback cb, void *cookie)
223{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800224 LOGV("setAutoFocusCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700225 mAutoFocusCallback = cb;
226 mAutoFocusCallbackCookie = cookie;
227}
228
229void Camera::setShutterCallback(shutter_callback cb, void *cookie)
230{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800231 LOGV("setShutterCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700232 mShutterCallback = cb;
233 mShutterCallbackCookie = cookie;
234}
235
236void Camera::setRawCallback(frame_callback cb, void *cookie)
237{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800238 LOGV("setRawCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700239 mRawCallback = cb;
240 mRawCallbackCookie = cookie;
241}
242
243void Camera::setJpegCallback(frame_callback cb, void *cookie)
244{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800245 LOGV("setJpegCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700246 mJpegCallback = cb;
247 mJpegCallbackCookie = cookie;
248}
249
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800250void Camera::setFrameCallback(frame_callback cb, void *cookie, int frame_callback_flag)
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700251{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800252 LOGV("setFrameCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700253 mFrameCallback = cb;
254 mFrameCallbackCookie = cookie;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800255 mCamera->setFrameCallbackFlag(frame_callback_flag);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700256}
257
258void Camera::setErrorCallback(error_callback cb, void *cookie)
259{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800260 LOGV("setErrorCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700261 mErrorCallback = cb;
262 mErrorCallbackCookie = cookie;
263}
264
265void Camera::autoFocusCallback(bool focused)
266{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800267 LOGV("autoFocusCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700268 if (mAutoFocusCallback) {
269 mAutoFocusCallback(focused, mAutoFocusCallbackCookie);
270 }
271}
272
273void Camera::shutterCallback()
274{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800275 LOGV("shutterCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700276 if (mShutterCallback) {
277 mShutterCallback(mShutterCallbackCookie);
278 }
279}
280
281void Camera::rawCallback(const sp<IMemory>& picture)
282{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800283 LOGV("rawCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700284 if (mRawCallback) {
285 mRawCallback(picture, mRawCallbackCookie);
286 }
287}
288
289// callback from camera service when image is ready
290void Camera::jpegCallback(const sp<IMemory>& picture)
291{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800292 LOGV("jpegCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700293 if (mJpegCallback) {
294 mJpegCallback(picture, mJpegCallbackCookie);
295 }
296}
297
298// callback from camera service when video frame is ready
299void Camera::frameCallback(const sp<IMemory>& frame)
300{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800301 LOGV("frameCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700302 if (mFrameCallback) {
303 mFrameCallback(frame, mFrameCallbackCookie);
304 }
305}
306
307// callback from camera service when an error occurs in preview or takePicture
308void Camera::errorCallback(status_t error)
309{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800310 LOGV("errorCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700311 if (mErrorCallback) {
312 mErrorCallback(error, mErrorCallbackCookie);
313 }
314}
315
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800316void Camera::binderDied(const wp<IBinder>& who) {
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700317 LOGW("ICamera died");
318 if (mErrorCallback) {
319 mErrorCallback(DEAD_OBJECT, mErrorCallbackCookie);
320 }
321}
322
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800323void Camera::DeathNotifier::binderDied(const wp<IBinder>& who) {
324 LOGV("binderDied");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700325 Mutex::Autolock _l(Camera::mLock);
326 Camera::mCameraService.clear();
327 LOGW("Camera server died!");
328}
329
330}; // namespace android
331