blob: 1528e6ed204e60617ad25811a6aad03cbbb19ab0 [file] [log] [blame]
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -07001/*
2**
3** Copyright 2008, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18#define LOG_TAG "Camera"
19#include <utils/Log.h>
20
21#include <utils/IServiceManager.h>
22#include <utils/threads.h>
23#include <utils/IMemory.h>
24#include <ui/Surface.h>
25
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 : mStatus(UNKNOWN_ERROR),
64 mShutterCallback(0),
65 mShutterCallbackCookie(0),
66 mRawCallback(0),
67 mRawCallbackCookie(0),
68 mJpegCallback(0),
69 mJpegCallbackCookie(0),
70 mFrameCallback(0),
71 mFrameCallbackCookie(0),
72 mErrorCallback(0),
73 mErrorCallbackCookie(0),
74 mAutoFocusCallback(0),
75 mAutoFocusCallbackCookie(0)
76{
77}
78
79Camera::~Camera()
80{
81 disconnect();
82}
83
84sp<Camera> Camera::connect()
85{
86 sp<Camera> c = new Camera();
87 const sp<ICameraService>& cs = getCameraService();
88 if (cs != 0) {
89 c->mCamera = cs->connect(c);
90 }
91 if (c->mCamera != 0) {
92 c->mCamera->asBinder()->linkToDeath(c);
93 c->mStatus = NO_ERROR;
94 }
95 return c;
96}
97
98void Camera::disconnect()
99{
100 if (mCamera != 0) {
101 mErrorCallback = 0;
102 mCamera->disconnect();
103 mCamera = 0;
104 }
105}
106
107// pass the buffered ISurface to the camera service
108status_t Camera::setPreviewDisplay(const sp<Surface>& surface)
109{
110 if (surface == 0) {
111 LOGE("app passed NULL surface");
112 return NO_INIT;
113 }
114 return mCamera->setPreviewDisplay(surface->getISurface());
115}
116
117// start preview mode, must call setPreviewDisplay first
118status_t Camera::startPreview()
119{
120 return mCamera->startPreview();
121}
122
123// stop preview mode
124void Camera::stopPreview()
125{
126 mCamera->stopPreview();
127}
128
129status_t Camera::autoFocus()
130{
131 return mCamera->autoFocus();
132}
133
134// take a picture
135status_t Camera::takePicture()
136{
137 return mCamera->takePicture();
138}
139
140// set preview/capture parameters - key/value pairs
141status_t Camera::setParameters(const String8& params)
142{
143 return mCamera->setParameters(params);
144}
145
146// get preview/capture parameters - key/value pairs
147String8 Camera::getParameters() const
148{
149 String8 params = mCamera->getParameters();
150 return params;
151}
152
153void Camera::setAutoFocusCallback(autofocus_callback cb, void *cookie)
154{
155 mAutoFocusCallback = cb;
156 mAutoFocusCallbackCookie = cookie;
157}
158
159void Camera::setShutterCallback(shutter_callback cb, void *cookie)
160{
161 mShutterCallback = cb;
162 mShutterCallbackCookie = cookie;
163}
164
165void Camera::setRawCallback(frame_callback cb, void *cookie)
166{
167 mRawCallback = cb;
168 mRawCallbackCookie = cookie;
169}
170
171void Camera::setJpegCallback(frame_callback cb, void *cookie)
172{
173 mJpegCallback = cb;
174 mJpegCallbackCookie = cookie;
175}
176
177void Camera::setFrameCallback(frame_callback cb, void *cookie)
178{
179 mFrameCallback = cb;
180 mFrameCallbackCookie = cookie;
181 mCamera->setHasFrameCallback(cb != NULL);
182}
183
184void Camera::setErrorCallback(error_callback cb, void *cookie)
185{
186 mErrorCallback = cb;
187 mErrorCallbackCookie = cookie;
188}
189
190void Camera::autoFocusCallback(bool focused)
191{
192 if (mAutoFocusCallback) {
193 mAutoFocusCallback(focused, mAutoFocusCallbackCookie);
194 }
195}
196
197void Camera::shutterCallback()
198{
199 if (mShutterCallback) {
200 mShutterCallback(mShutterCallbackCookie);
201 }
202}
203
204void Camera::rawCallback(const sp<IMemory>& picture)
205{
206 if (mRawCallback) {
207 mRawCallback(picture, mRawCallbackCookie);
208 }
209}
210
211// callback from camera service when image is ready
212void Camera::jpegCallback(const sp<IMemory>& picture)
213{
214 if (mJpegCallback) {
215 mJpegCallback(picture, mJpegCallbackCookie);
216 }
217}
218
219// callback from camera service when video frame is ready
220void Camera::frameCallback(const sp<IMemory>& frame)
221{
222 if (mFrameCallback) {
223 mFrameCallback(frame, mFrameCallbackCookie);
224 }
225}
226
227// callback from camera service when an error occurs in preview or takePicture
228void Camera::errorCallback(status_t error)
229{
230 if (mErrorCallback) {
231 mErrorCallback(error, mErrorCallbackCookie);
232 }
233}
234
235void Camera::binderDied(const wp<IBinder>& who) {
236 LOGW("ICamera died");
237 if (mErrorCallback) {
238 mErrorCallback(DEAD_OBJECT, mErrorCallbackCookie);
239 }
240}
241
242void Camera::DeathNotifier::binderDied(const wp<IBinder>& who) {
243 Mutex::Autolock _l(Camera::mLock);
244 Camera::mCameraService.clear();
245 LOGW("Camera server died!");
246}
247
248}; // namespace android
249