blob: 9527009575fabb9eebef48d81c7ddaaf75f013e2 [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 Project7c1b96a2008-10-21 07:00:00 -0700139// pass the buffered ISurface to the camera service
140status_t Camera::setPreviewDisplay(const sp<Surface>& surface)
141{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800142 LOGV("setPreviewDisplay");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700143 if (surface == 0) {
144 LOGE("app passed NULL surface");
145 return NO_INIT;
146 }
147 return mCamera->setPreviewDisplay(surface->getISurface());
148}
149
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800150status_t Camera::setPreviewDisplay(const sp<ISurface>& surface)
151{
152 LOGV("setPreviewDisplay");
153 if (surface == 0) {
154 LOGE("app passed NULL surface");
155 return NO_INIT;
156 }
157 return mCamera->setPreviewDisplay(surface);
158}
159
160
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700161// start preview mode, must call setPreviewDisplay first
162status_t Camera::startPreview()
163{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800164 LOGV("startPreview");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700165 return mCamera->startPreview();
166}
167
168// stop preview mode
169void Camera::stopPreview()
170{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800171 LOGV("stopPreview");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700172 mCamera->stopPreview();
173}
174
175status_t Camera::autoFocus()
176{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800177 LOGV("autoFocus");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700178 return mCamera->autoFocus();
179}
180
181// take a picture
182status_t Camera::takePicture()
183{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800184 LOGV("takePicture");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700185 return mCamera->takePicture();
186}
187
188// set preview/capture parameters - key/value pairs
189status_t Camera::setParameters(const String8& params)
190{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800191 LOGV("setParameters");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700192 return mCamera->setParameters(params);
193}
194
195// get preview/capture parameters - key/value pairs
196String8 Camera::getParameters() const
197{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800198 LOGV("getParameters");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700199 String8 params = mCamera->getParameters();
200 return params;
201}
202
203void Camera::setAutoFocusCallback(autofocus_callback cb, void *cookie)
204{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800205 LOGV("setAutoFocusCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700206 mAutoFocusCallback = cb;
207 mAutoFocusCallbackCookie = cookie;
208}
209
210void Camera::setShutterCallback(shutter_callback cb, void *cookie)
211{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800212 LOGV("setShutterCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700213 mShutterCallback = cb;
214 mShutterCallbackCookie = cookie;
215}
216
217void Camera::setRawCallback(frame_callback cb, void *cookie)
218{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800219 LOGV("setRawCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700220 mRawCallback = cb;
221 mRawCallbackCookie = cookie;
222}
223
224void Camera::setJpegCallback(frame_callback cb, void *cookie)
225{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800226 LOGV("setJpegCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700227 mJpegCallback = cb;
228 mJpegCallbackCookie = cookie;
229}
230
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800231void Camera::setFrameCallback(frame_callback cb, void *cookie, int frame_callback_flag)
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700232{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800233 LOGV("setFrameCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700234 mFrameCallback = cb;
235 mFrameCallbackCookie = cookie;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800236 mCamera->setFrameCallbackFlag(frame_callback_flag);
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700237}
238
239void Camera::setErrorCallback(error_callback cb, void *cookie)
240{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800241 LOGV("setErrorCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700242 mErrorCallback = cb;
243 mErrorCallbackCookie = cookie;
244}
245
246void Camera::autoFocusCallback(bool focused)
247{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800248 LOGV("autoFocusCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700249 if (mAutoFocusCallback) {
250 mAutoFocusCallback(focused, mAutoFocusCallbackCookie);
251 }
252}
253
254void Camera::shutterCallback()
255{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800256 LOGV("shutterCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700257 if (mShutterCallback) {
258 mShutterCallback(mShutterCallbackCookie);
259 }
260}
261
262void Camera::rawCallback(const sp<IMemory>& picture)
263{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800264 LOGV("rawCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700265 if (mRawCallback) {
266 mRawCallback(picture, mRawCallbackCookie);
267 }
268}
269
270// callback from camera service when image is ready
271void Camera::jpegCallback(const sp<IMemory>& picture)
272{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800273 LOGV("jpegCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700274 if (mJpegCallback) {
275 mJpegCallback(picture, mJpegCallbackCookie);
276 }
277}
278
279// callback from camera service when video frame is ready
280void Camera::frameCallback(const sp<IMemory>& frame)
281{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800282 LOGV("frameCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700283 if (mFrameCallback) {
284 mFrameCallback(frame, mFrameCallbackCookie);
285 }
286}
287
288// callback from camera service when an error occurs in preview or takePicture
289void Camera::errorCallback(status_t error)
290{
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800291 LOGV("errorCallback");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700292 if (mErrorCallback) {
293 mErrorCallback(error, mErrorCallbackCookie);
294 }
295}
296
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800297void Camera::binderDied(const wp<IBinder>& who) {
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700298 LOGW("ICamera died");
299 if (mErrorCallback) {
300 mErrorCallback(DEAD_OBJECT, mErrorCallbackCookie);
301 }
302}
303
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800304void Camera::DeathNotifier::binderDied(const wp<IBinder>& who) {
305 LOGV("binderDied");
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700306 Mutex::Autolock _l(Camera::mLock);
307 Camera::mCameraService.clear();
308 LOGW("Camera server died!");
309}
310
311}; // namespace android
312