blob: b3cbda14fb06fa11043f39b90f6c8d24df3cebb6 [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001/*
2**
3** Copyright (C) 2008, The Android Open Source Project
4** Copyright (C) 2008 HTC Inc.
5**
6** 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
9**
10** http://www.apache.org/licenses/LICENSE-2.0
11**
12** 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
16** limitations under the License.
17*/
18
19//#define LOG_NDEBUG 0
20#define LOG_TAG "Camera"
21#include <utils/Log.h>
22#include <utils/IServiceManager.h>
23#include <utils/threads.h>
24#include <utils/IMemory.h>
25#include <ui/Surface.h>
26#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()
63{
64 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 mPreviewCallback = 0;
88 mPreviewCallbackCookie = 0;
89 mRecordingCallback = 0;
90 mRecordingCallbackCookie = 0;
91 mErrorCallback = 0;
92 mErrorCallbackCookie = 0;
93 mAutoFocusCallback = 0;
94 mAutoFocusCallbackCookie = 0;
95}
96
97Camera::~Camera()
98{
99 disconnect();
100}
101
102sp<Camera> Camera::connect()
103{
104 LOGV("connect");
105 sp<Camera> c = new Camera();
106 const sp<ICameraService>& cs = getCameraService();
107 if (cs != 0) {
108 c->mCamera = cs->connect(c);
109 }
110 if (c->mCamera != 0) {
111 c->mCamera->asBinder()->linkToDeath(c);
112 c->mStatus = NO_ERROR;
113 } else {
114 c.clear();
115 }
116 return c;
117}
118
119void Camera::disconnect()
120{
121 LOGV("disconnect");
122 if (mCamera != 0) {
123 mErrorCallback = 0;
124 mCamera->disconnect();
125 mCamera = 0;
126 }
127}
128
129status_t Camera::reconnect()
130{
131 LOGV("reconnect");
132 sp <ICamera> c = mCamera;
133 if (c == 0) return NO_INIT;
134 return c->connect(this);
135}
136
137sp<ICamera> Camera::remote()
138{
139 return mCamera;
140}
141
142status_t Camera::lock()
143{
144 sp <ICamera> c = mCamera;
145 if (c == 0) return NO_INIT;
146 return c->lock();
147}
148
149status_t Camera::unlock()
150{
151 sp <ICamera> c = mCamera;
152 if (c == 0) return NO_INIT;
153 return c->unlock();
154}
155
156// pass the buffered ISurface to the camera service
157status_t Camera::setPreviewDisplay(const sp<Surface>& surface)
158{
159 LOGV("setPreviewDisplay");
160 if (surface == 0) {
161 LOGE("app passed NULL surface");
162 return NO_INIT;
163 }
164 sp <ICamera> c = mCamera;
165 if (c == 0) return NO_INIT;
166 return c->setPreviewDisplay(surface->getISurface());
167}
168
169status_t Camera::setPreviewDisplay(const sp<ISurface>& surface)
170{
171 LOGV("setPreviewDisplay");
172 if (surface == 0) {
173 LOGE("app passed NULL surface");
174 return NO_INIT;
175 }
176 sp <ICamera> c = mCamera;
177 if (c == 0) return NO_INIT;
178 return c->setPreviewDisplay(surface);
179}
180
181
182// start preview mode, must call setPreviewDisplay first
183status_t Camera::startPreview()
184{
185 LOGV("startPreview");
186 sp <ICamera> c = mCamera;
187 if (c == 0) return NO_INIT;
188 return c->startPreview();
189}
190
191// start recording mode, must call setPreviewDisplay first
192status_t Camera::startRecording()
193{
194 LOGV("startRecording");
195 sp <ICamera> c = mCamera;
196 if (c == 0) return NO_INIT;
197 return c->startRecording();
198}
199
200// stop preview mode
201void Camera::stopPreview()
202{
203 LOGV("stopPreview");
204 sp <ICamera> c = mCamera;
205 if (c == 0) return;
206 c->stopPreview();
207}
208
209// stop recording mode
210void Camera::stopRecording()
211{
212 LOGV("stopRecording");
213 sp <ICamera> c = mCamera;
214 if (c == 0) return;
215 c->stopRecording();
216}
217
218// release a recording frame
219void Camera::releaseRecordingFrame(const sp<IMemory>& mem)
220{
221 LOGV("releaseRecordingFrame");
222 sp <ICamera> c = mCamera;
223 if (c == 0) return;
224 c->releaseRecordingFrame(mem);
225}
226
227// get preview state
228bool Camera::previewEnabled()
229{
230 LOGV("previewEnabled");
231 sp <ICamera> c = mCamera;
232 if (c == 0) return false;
233 return c->previewEnabled();
234}
235
236// get recording state
237bool Camera::recordingEnabled()
238{
239 LOGV("recordingEnabled");
240 sp <ICamera> c = mCamera;
241 if (c == 0) return false;
242 return c->recordingEnabled();
243}
244
245status_t Camera::autoFocus()
246{
247 LOGV("autoFocus");
248 sp <ICamera> c = mCamera;
249 if (c == 0) return NO_INIT;
250 return c->autoFocus();
251}
252
253// take a picture
254status_t Camera::takePicture()
255{
256 LOGV("takePicture");
257 sp <ICamera> c = mCamera;
258 if (c == 0) return NO_INIT;
259 return c->takePicture();
260}
261
262// set preview/capture parameters - key/value pairs
263status_t Camera::setParameters(const String8& params)
264{
265 LOGV("setParameters");
266 sp <ICamera> c = mCamera;
267 if (c == 0) return NO_INIT;
268 return c->setParameters(params);
269}
270
271// get preview/capture parameters - key/value pairs
272String8 Camera::getParameters() const
273{
274 LOGV("getParameters");
275 String8 params;
276 sp <ICamera> c = mCamera;
277 if (c != 0) params = mCamera->getParameters();
278 return params;
279}
280
281void Camera::setAutoFocusCallback(autofocus_callback cb, void *cookie)
282{
283 LOGV("setAutoFocusCallback");
284 mAutoFocusCallback = cb;
285 mAutoFocusCallbackCookie = cookie;
286}
287
288void Camera::setShutterCallback(shutter_callback cb, void *cookie)
289{
290 LOGV("setShutterCallback");
291 mShutterCallback = cb;
292 mShutterCallbackCookie = cookie;
293}
294
295void Camera::setRawCallback(frame_callback cb, void *cookie)
296{
297 LOGV("setRawCallback");
298 mRawCallback = cb;
299 mRawCallbackCookie = cookie;
300}
301
302void Camera::setJpegCallback(frame_callback cb, void *cookie)
303{
304 LOGV("setJpegCallback");
305 mJpegCallback = cb;
306 mJpegCallbackCookie = cookie;
307}
308
309void Camera::setPreviewCallback(frame_callback cb, void *cookie, int flag)
310{
311 LOGV("setPreviewCallback");
312 mPreviewCallback = cb;
313 mPreviewCallbackCookie = cookie;
314 sp <ICamera> c = mCamera;
315 if (c == 0) return;
316 mCamera->setPreviewCallbackFlag(flag);
317}
318
319void Camera::setRecordingCallback(frame_callback cb, void *cookie)
320{
321 LOGV("setRecordingCallback");
322 mRecordingCallback = cb;
323 mRecordingCallbackCookie = cookie;
324}
325
326void Camera::setErrorCallback(error_callback cb, void *cookie)
327{
328 LOGV("setErrorCallback");
329 mErrorCallback = cb;
330 mErrorCallbackCookie = cookie;
331}
332
333void Camera::autoFocusCallback(bool focused)
334{
335 LOGV("autoFocusCallback");
336 if (mAutoFocusCallback) {
337 mAutoFocusCallback(focused, mAutoFocusCallbackCookie);
338 }
339}
340
341void Camera::shutterCallback()
342{
343 LOGV("shutterCallback");
344 if (mShutterCallback) {
345 mShutterCallback(mShutterCallbackCookie);
346 }
347}
348
349void Camera::rawCallback(const sp<IMemory>& picture)
350{
351 LOGV("rawCallback");
352 if (mRawCallback) {
353 mRawCallback(picture, mRawCallbackCookie);
354 }
355}
356
357// callback from camera service when image is ready
358void Camera::jpegCallback(const sp<IMemory>& picture)
359{
360 LOGV("jpegCallback");
361 if (mJpegCallback) {
362 mJpegCallback(picture, mJpegCallbackCookie);
363 }
364}
365
366// callback from camera service when preview frame is ready
367void Camera::previewCallback(const sp<IMemory>& frame)
368{
369 LOGV("frameCallback");
370 if (mPreviewCallback) {
371 mPreviewCallback(frame, mPreviewCallbackCookie);
372 }
373}
374
375// callback from camera service when a recording frame is ready
376void Camera::recordingCallback(const sp<IMemory>& frame)
377{
378 LOGV("recordingCallback");
379 if (mRecordingCallback) {
380 mRecordingCallback(frame, mRecordingCallbackCookie);
381 }
382}
383
384// callback from camera service when an error occurs in preview or takePicture
385void Camera::errorCallback(status_t error)
386{
387 LOGV("errorCallback");
388 if (mErrorCallback) {
389 mErrorCallback(error, mErrorCallbackCookie);
390 }
391}
392
393void Camera::binderDied(const wp<IBinder>& who) {
394 LOGW("ICamera died");
395 if (mErrorCallback) {
396 mErrorCallback(DEAD_OBJECT, mErrorCallbackCookie);
397 }
398}
399
400void Camera::DeathNotifier::binderDied(const wp<IBinder>& who) {
401 LOGV("binderDied");
402 Mutex::Autolock _l(Camera::mLock);
403 Camera::mCameraService.clear();
404 LOGW("Camera server died!");
405}
406
407}; // namespace android
408