blob: 32005c15c088af7cc94f74264de47e877cc1a816 [file] [log] [blame]
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "Camera2Client"
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070018#define ATRACE_TAG ATRACE_TAG_CAMERA
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070019//#define LOG_NDEBUG 0
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070020
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070021#include <utils/Log.h>
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070022#include <utils/Trace.h>
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070023
24#include <cutils/properties.h>
25#include <gui/SurfaceTextureClient.h>
26#include <gui/Surface.h>
27
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070028#include <math.h>
29
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070030#include "Camera2Client.h"
31
32namespace android {
33
34#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
35#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
36
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070037static int getCallingPid() {
38 return IPCThreadState::self()->getCallingPid();
39}
40
41static int getCallingUid() {
42 return IPCThreadState::self()->getCallingUid();
43}
44
45// Interface used by CameraService
46
47Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
48 const sp<ICameraClient>& cameraClient,
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070049 int cameraId,
50 int cameraFacing,
51 int clientPid):
52 Client(cameraService, cameraClient,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070053 cameraId, cameraFacing, clientPid),
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -070054 mState(NOT_INITIALIZED),
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -070055 mPreviewStreamId(NO_STREAM),
56 mPreviewRequest(NULL),
57 mCaptureStreamId(NO_STREAM),
58 mCaptureRequest(NULL)
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070059{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070060 ATRACE_CALL();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070061
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070062 mDevice = new Camera2Device(cameraId);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070063}
64
65status_t Camera2Client::initialize(camera_module_t *module)
66{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070067 ATRACE_CALL();
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070068 status_t res;
69
70 res = mDevice->initialize(module);
71 if (res != OK) {
72 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
73 __FUNCTION__, mCameraId, strerror(-res), res);
74 return NO_INIT;
75 }
76
77 res = buildDefaultParameters();
78 if (res != OK) {
79 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
80 __FUNCTION__, mCameraId, strerror(-res), res);
81 return NO_INIT;
82 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -070083
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070084 if (gLogLevel >= 1) {
85 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
86 mCameraId);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -070087 ALOGD("%s", mParamsFlattened.string());
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070088 }
89
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -070090 mState = STOPPED;
91
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070092 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070093}
94
95Camera2Client::~Camera2Client() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070096 ATRACE_CALL();
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -070097 ALOGV("%s: Camera %d: Shutting down", __FUNCTION__, mCameraId);
98
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070099 mDestructionStarted = true;
100
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700101 disconnect();
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700102
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700103}
104
105status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700106 String8 result;
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700107 result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700108 mCameraId,
109 getCameraClient()->asBinder().get(),
110 mClientPid);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700111 result.append(" State: ");
112#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
113
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700114 result.append(getStateName(mState));
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700115
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700116 result.append("\n Current parameters:\n");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700117 result.appendFormat(" Preview size: %d x %d\n",
118 mParameters.previewWidth, mParameters.previewHeight);
119 result.appendFormat(" Preview FPS range: %d - %d\n",
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700120 mParameters.previewFpsRange[0], mParameters.previewFpsRange[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700121 result.appendFormat(" Preview HAL pixel format: 0x%x\n",
122 mParameters.previewFormat);
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700123 result.appendFormat(" Preview transform: %x\n",
124 mParameters.previewTransform);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700125 result.appendFormat(" Picture size: %d x %d\n",
126 mParameters.pictureWidth, mParameters.pictureHeight);
127 result.appendFormat(" Jpeg thumbnail size: %d x %d\n",
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700128 mParameters.jpegThumbSize[0], mParameters.jpegThumbSize[1]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700129 result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n",
130 mParameters.jpegQuality, mParameters.jpegThumbQuality);
131 result.appendFormat(" Jpeg rotation: %d\n", mParameters.jpegRotation);
132 result.appendFormat(" GPS tags %s\n",
133 mParameters.gpsEnabled ? "enabled" : "disabled");
134 if (mParameters.gpsEnabled) {
135 result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n",
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700136 mParameters.gpsCoordinates[0], mParameters.gpsCoordinates[1],
137 mParameters.gpsCoordinates[2]);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700138 result.appendFormat(" GPS timestamp: %lld\n",
139 mParameters.gpsTimestamp);
140 result.appendFormat(" GPS processing method: %s\n",
141 mParameters.gpsProcessingMethod.string());
142 }
143
144 result.append(" White balance mode: ");
145 switch (mParameters.wbMode) {
146 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
147 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
148 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
149 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
150 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
151 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
152 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
153 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
154 default: result.append("UNKNOWN\n");
155 }
156
157 result.append(" Effect mode: ");
158 switch (mParameters.effectMode) {
159 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
160 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
161 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
162 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
163 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
164 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
165 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
166 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
167 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
168 default: result.append("UNKNOWN\n");
169 }
170
171 result.append(" Antibanding mode: ");
172 switch (mParameters.antibandingMode) {
173 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
174 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
175 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
176 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
177 default: result.append("UNKNOWN\n");
178 }
179
180 result.append(" Scene mode: ");
181 switch (mParameters.sceneMode) {
182 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
183 result.append("AUTO\n"); break;
184 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
185 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
186 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
187 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
188 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
189 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
190 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
191 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
192 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
193 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
194 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
195 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
196 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
197 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
198 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
199 default: result.append("UNKNOWN\n");
200 }
201
202 result.append(" Flash mode: ");
203 switch (mParameters.flashMode) {
204 CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
205 CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
206 CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
207 CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
208 CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
209 CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
210 default: result.append("UNKNOWN\n");
211 }
212
213 result.append(" Focus mode: ");
214 switch (mParameters.focusMode) {
215 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
216 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
217 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
218 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
219 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
220 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
221 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
222 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
223 default: result.append("UNKNOWN\n");
224 }
225
226 result.append(" Focusing areas:\n");
227 for (size_t i = 0; i < mParameters.focusingAreas.size(); i++) {
228 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
229 mParameters.focusingAreas[i].left,
230 mParameters.focusingAreas[i].top,
231 mParameters.focusingAreas[i].right,
232 mParameters.focusingAreas[i].bottom,
233 mParameters.focusingAreas[i].weight);
234 }
235
236 result.appendFormat(" Exposure compensation index: %d\n",
237 mParameters.exposureCompensation);
238
239 result.appendFormat(" AE lock %s, AWB lock %s\n",
240 mParameters.autoExposureLock ? "enabled" : "disabled",
241 mParameters.autoWhiteBalanceLock ? "enabled" : "disabled" );
242
243 result.appendFormat(" Metering areas:\n");
244 for (size_t i = 0; i < mParameters.meteringAreas.size(); i++) {
245 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
246 mParameters.meteringAreas[i].left,
247 mParameters.meteringAreas[i].top,
248 mParameters.meteringAreas[i].right,
249 mParameters.meteringAreas[i].bottom,
250 mParameters.meteringAreas[i].weight);
251 }
252
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700253 result.appendFormat(" Zoom index: %d\n", mParameters.zoom);
254 result.appendFormat(" Video size: %d x %d\n", mParameters.videoWidth,
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700255 mParameters.videoHeight);
256
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700257 result.appendFormat(" Recording hint is %s\n",
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700258 mParameters.recordingHint ? "set" : "not set");
259
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700260 result.appendFormat(" Video stabilization is %s\n",
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700261 mParameters.videoStabilization ? "enabled" : "disabled");
262
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700263 result.append(" Current streams:\n");
264 result.appendFormat(" Preview stream ID: %d\n", mPreviewStreamId);
265 result.appendFormat(" Capture stream ID: %d\n", mCaptureStreamId);
266
267 result.append(" Current requests:\n");
268 if (mPreviewRequest != NULL) {
269 result.append(" Preview request:\n");
270 write(fd, result.string(), result.size());
271 dump_camera_metadata(mPreviewRequest, fd, 2);
272 } else {
273 result.append(" Preview request: undefined\n");
274 write(fd, result.string(), result.size());
275 }
276
277 if (mCaptureRequest != NULL) {
278 result = " Capture request:\n";
279 write(fd, result.string(), result.size());
280 dump_camera_metadata(mCaptureRequest, fd, 2);
281 } else {
282 result = " Capture request: undefined\n";
283 write(fd, result.string(), result.size());
284 }
285
286 result = " Device dump:\n";
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700287 write(fd, result.string(), result.size());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700288
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700289 status_t res = mDevice->dump(fd, args);
290 if (res != OK) {
291 result = String8::format(" Error dumping device: %s (%d)",
292 strerror(-res), res);
293 write(fd, result.string(), result.size());
294 }
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700295
296#undef CASE_APPEND_ENUM
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700297 return NO_ERROR;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700298}
299
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700300const char* Camera2Client::getStateName(State state) {
301#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
302 switch(state) {
303 CASE_ENUM_TO_CHAR(NOT_INITIALIZED)
304 CASE_ENUM_TO_CHAR(STOPPED)
305 CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
306 CASE_ENUM_TO_CHAR(PREVIEW)
307 CASE_ENUM_TO_CHAR(RECORD)
308 CASE_ENUM_TO_CHAR(STILL_CAPTURE)
309 CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
310 default:
311 return "Unknown state!";
312 break;
313 }
314#undef CASE_ENUM_TO_CHAR
315}
316
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700317// ICamera interface
318
319void Camera2Client::disconnect() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700320 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700321 Mutex::Autolock icl(mICameraLock);
322
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700323 if (mDevice == 0) return;
324
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700325 stopPreviewLocked();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700326
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700327 mDevice->waitUntilDrained();
328
329 if (mPreviewStreamId != NO_STREAM) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700330 mDevice->deleteStream(mPreviewStreamId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700331 mPreviewStreamId = NO_STREAM;
332 }
333
334 if (mCaptureStreamId != NO_STREAM) {
335 mDevice->deleteStream(mCaptureStreamId);
336 mCaptureStreamId = NO_STREAM;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700337 }
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700338
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700339 CameraService::Client::disconnect();
340}
341
342status_t Camera2Client::connect(const sp<ICameraClient>& client) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700343 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700344 Mutex::Autolock icl(mICameraLock);
345
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700346 return BAD_VALUE;
347}
348
349status_t Camera2Client::lock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700350 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700351 Mutex::Autolock icl(mICameraLock);
352
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700353 return BAD_VALUE;
354}
355
356status_t Camera2Client::unlock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700357 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700358 Mutex::Autolock icl(mICameraLock);
359
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700360 return BAD_VALUE;
361}
362
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700363status_t Camera2Client::setPreviewDisplay(
364 const sp<Surface>& surface) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700365 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700366 Mutex::Autolock icl(mICameraLock);
367
368 if (mState >= PREVIEW) return INVALID_OPERATION;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700369
370 sp<IBinder> binder;
371 sp<ANativeWindow> window;
372 if (surface != 0) {
373 binder = surface->asBinder();
374 window = surface;
375 }
376
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700377 return setPreviewWindowLocked(binder,window);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700378}
379
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700380status_t Camera2Client::setPreviewTexture(
381 const sp<ISurfaceTexture>& surfaceTexture) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700382 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700383 Mutex::Autolock icl(mICameraLock);
384
385 if (mState >= PREVIEW) return INVALID_OPERATION;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700386
387 sp<IBinder> binder;
388 sp<ANativeWindow> window;
389 if (surfaceTexture != 0) {
390 binder = surfaceTexture->asBinder();
391 window = new SurfaceTextureClient(surfaceTexture);
392 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700393 return setPreviewWindowLocked(binder, window);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700394}
395
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700396status_t Camera2Client::setPreviewWindowLocked(const sp<IBinder>& binder,
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700397 const sp<ANativeWindow>& window) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700398 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700399 status_t res;
400
401 if (binder == mPreviewSurface) {
402 return NO_ERROR;
403 }
404
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700405 // TODO: Should wait until HAL has no remaining requests
406
407 if (mPreviewStreamId != NO_STREAM) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700408 res = mDevice->deleteStream(mPreviewStreamId);
409 if (res != OK) {
410 return res;
411 }
412 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700413 res = mDevice->createStream(window,
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700414 mParameters.previewWidth, mParameters.previewHeight,
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700415 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700416 &mPreviewStreamId);
417 if (res != OK) {
418 return res;
419 }
420
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700421 mPreviewSurface = binder;
422
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700423 if (mState == WAITING_FOR_PREVIEW_WINDOW) {
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700424 return startPreviewLocked();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700425 }
426
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700427 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700428}
429
430void Camera2Client::setPreviewCallbackFlag(int flag) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700431 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700432 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700433}
434
435status_t Camera2Client::startPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700436 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700437 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700438 return startPreviewLocked();
439}
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700440
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700441status_t Camera2Client::startPreviewLocked() {
442 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700443 status_t res;
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700444 if (mState >= PREVIEW) {
445 ALOGE("%s: Can't start preview in state %s",
446 __FUNCTION__, getStateName(mState));
447 return INVALID_OPERATION;
448 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700449
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700450 if (mPreviewStreamId == NO_STREAM) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700451 mState = WAITING_FOR_PREVIEW_WINDOW;
452 return OK;
453 }
454
455 if (mPreviewRequest == NULL) {
456 updatePreviewRequest();
457 }
458
459 uint8_t outputStream = mPreviewStreamId;
460
461 camera_metadata_entry_t outputStreams;
462 res = find_camera_metadata_entry(mPreviewRequest,
463 ANDROID_REQUEST_OUTPUT_STREAMS,
464 &outputStreams);
465 if (res == NAME_NOT_FOUND) {
466 res = add_camera_metadata_entry(mPreviewRequest,
467 ANDROID_REQUEST_OUTPUT_STREAMS,
468 &outputStream, 1);
469 } else if (res == OK) {
470 res = update_camera_metadata_entry(mPreviewRequest,
471 outputStreams.index, &outputStream, 1, NULL);
472 }
473
474 if (res != OK) {
475 ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
476 __FUNCTION__, mCameraId, strerror(-res), res);
477 mState = STOPPED;
478 return res;
479 }
480
481 res = mDevice->setStreamingRequest(mPreviewRequest);
482 if (res != OK) {
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700483 ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
484 "%s (%d)",
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700485 __FUNCTION__, mCameraId, strerror(-res), res);
486 mState = STOPPED;
487 return res;
488 }
489 mState = PREVIEW;
490
491 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700492}
493
494void Camera2Client::stopPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700495 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700496 Mutex::Autolock icl(mICameraLock);
497 stopPreviewLocked();
498}
499
500void Camera2Client::stopPreviewLocked() {
501 ATRACE_CALL();
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700502 switch (mState) {
503 case NOT_INITIALIZED:
504 ALOGE("%s: Camera %d: Call before initialized",
505 __FUNCTION__, mCameraId);
506 break;
507 case STOPPED:
508 break;
509 case STILL_CAPTURE:
510 ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
511 __FUNCTION__, mCameraId);
512 break;
513 case RECORD:
514 // TODO: Handle record stop here
515 case PREVIEW:
516 mDevice->setStreamingRequest(NULL);
517 case WAITING_FOR_PREVIEW_WINDOW:
518 mState = STOPPED;
519 break;
520 default:
521 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
522 mState);
523 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700524}
525
526bool Camera2Client::previewEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700527 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700528 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700529 return mState == PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700530}
531
532status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700533 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700534 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700535 return BAD_VALUE;
536}
537
538status_t Camera2Client::startRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700539 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700540 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700541 return BAD_VALUE;
542}
543
544void Camera2Client::stopRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700545 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700546 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700547}
548
549bool Camera2Client::recordingEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700550 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700551 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700552 return BAD_VALUE;
553}
554
555void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700556 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700557 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700558}
559
560status_t Camera2Client::autoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700561 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700562 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700563 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700564}
565
566status_t Camera2Client::cancelAutoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700567 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700568 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700569 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700570}
571
572status_t Camera2Client::takePicture(int msgType) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700573 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700574 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700575 status_t res;
576
577 switch (mState) {
578 case NOT_INITIALIZED:
579 case STOPPED:
580 case WAITING_FOR_PREVIEW_WINDOW:
581 ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
582 __FUNCTION__, mCameraId);
583 return INVALID_OPERATION;
584 case PREVIEW:
585 case RECORD:
586 // Good to go for takePicture
587 break;
588 case STILL_CAPTURE:
589 case VIDEO_SNAPSHOT:
590 ALOGE("%s: Camera %d: Already taking a picture",
591 __FUNCTION__, mCameraId);
592 return INVALID_OPERATION;
593 }
594
595 Mutex::Autolock pl(mParamsLock);
596
597 res = updateCaptureStream();
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700598 if (res != OK) {
599 ALOGE("%s: Can't set up still image stream: %s (%d)",
600 __FUNCTION__, strerror(-res), res);
601 return res;
602 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700603
604 if (mCaptureRequest == NULL) {
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700605 res = updateCaptureRequest();
606 if (res != OK) {
607 ALOGE("%s: Can't set up still image capture request: %s (%d)",
608 __FUNCTION__, strerror(-res), res);
609 return res;
610 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700611 }
612
613 // TODO: For video snapshot, need 3 streams here
614 camera_metadata_entry_t outputStreams;
615 uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId };
616 res = find_camera_metadata_entry(mCaptureRequest,
617 ANDROID_REQUEST_OUTPUT_STREAMS,
618 &outputStreams);
619 if (res == NAME_NOT_FOUND) {
620 res = add_camera_metadata_entry(mCaptureRequest,
621 ANDROID_REQUEST_OUTPUT_STREAMS,
622 streamIds, 2);
623 } else if (res == OK) {
624 res = update_camera_metadata_entry(mCaptureRequest,
625 outputStreams.index, streamIds, 2, NULL);
626 }
627
628 if (res != OK) {
629 ALOGE("%s: Camera %d: Unable to set up still image capture request: "
630 "%s (%d)",
631 __FUNCTION__, mCameraId, strerror(-res), res);
632 return res;
633 }
634
635 camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest);
636 if (captureCopy == NULL) {
637 ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
638 __FUNCTION__, mCameraId);
639 return NO_MEMORY;
640 }
641
642 if (mState == PREVIEW) {
643 res = mDevice->setStreamingRequest(NULL);
644 if (res != OK) {
645 ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
646 "%s (%d)",
647 __FUNCTION__, mCameraId, strerror(-res), res);
648 return res;
649 }
650 }
651
652 res = mDevice->capture(captureCopy);
653 if (res != OK) {
654 ALOGE("%s: Camera %d: Unable to submit still image capture request: "
655 "%s (%d)",
656 __FUNCTION__, mCameraId, strerror(-res), res);
657 return res;
658 }
659
660 switch (mState) {
661 case PREVIEW:
662 mState = STILL_CAPTURE;
663 break;
664 case RECORD:
665 mState = VIDEO_SNAPSHOT;
666 break;
667 default:
668 ALOGE("%s: Camera %d: Unknown state for still capture!",
669 __FUNCTION__, mCameraId);
670 return INVALID_OPERATION;
671 }
672
673 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700674}
675
676status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700677 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700678 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700679 Mutex::Autolock pl(mParamsLock);
680 status_t res;
681
682 CameraParameters newParams(params);
683
684 // TODO: Currently ignoring any changes to supposedly read-only
685 // parameters such as supported preview sizes, etc. Should probably
686 // produce an error if they're changed.
687
688 /** Extract and verify new parameters */
689
690 size_t i;
691
692 // PREVIEW_SIZE
693 int previewWidth, previewHeight;
694 newParams.getPreviewSize(&previewWidth, &previewHeight);
695
696 if (previewWidth != mParameters.previewWidth ||
697 previewHeight != mParameters.previewHeight) {
698 if (mState >= PREVIEW) {
699 ALOGE("%s: Preview size cannot be updated when preview "
700 "is active!", __FUNCTION__);
701 return BAD_VALUE;
702 }
703 camera_metadata_entry_t availablePreviewSizes =
704 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
705 for (i = 0; i < availablePreviewSizes.count; i += 2 ) {
706 if (availablePreviewSizes.data.i32[i] == previewWidth &&
707 availablePreviewSizes.data.i32[i+1] == previewHeight) break;
708 }
709 if (i == availablePreviewSizes.count) {
710 ALOGE("%s: Requested preview size %d x %d is not supported",
711 __FUNCTION__, previewWidth, previewHeight);
712 return BAD_VALUE;
713 }
714 }
715
716 // PREVIEW_FPS_RANGE
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700717 int previewFpsRange[2];
718 int previewFps = 0;
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700719 bool fpsRangeChanged = false;
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700720 newParams.getPreviewFpsRange(&previewFpsRange[0], &previewFpsRange[1]);
721 if (previewFpsRange[0] != mParameters.previewFpsRange[0] ||
722 previewFpsRange[1] != mParameters.previewFpsRange[1]) {
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700723 fpsRangeChanged = true;
724 camera_metadata_entry_t availablePreviewFpsRanges =
725 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
726 for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
727 if ((availablePreviewFpsRanges.data.i32[i] ==
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700728 previewFpsRange[0]) &&
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700729 (availablePreviewFpsRanges.data.i32[i+1] ==
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700730 previewFpsRange[1]) ) {
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700731 break;
732 }
733 }
734 if (i == availablePreviewFpsRanges.count) {
735 ALOGE("%s: Requested preview FPS range %d - %d is not supported",
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700736 __FUNCTION__, previewFpsRange[0], previewFpsRange[1]);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700737 return BAD_VALUE;
738 }
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700739 previewFps = previewFpsRange[0];
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700740 }
741
742 // PREVIEW_FORMAT
743 int previewFormat = formatStringToEnum(newParams.getPreviewFormat());
744 if (previewFormat != mParameters.previewFormat) {
745 if (mState >= PREVIEW) {
746 ALOGE("%s: Preview format cannot be updated when preview "
747 "is active!", __FUNCTION__);
748 return BAD_VALUE;
749 }
750 camera_metadata_entry_t availableFormats =
751 staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
752 for (i = 0; i < availableFormats.count; i++) {
753 if (availableFormats.data.i32[i] == previewFormat) break;
754 }
755 if (i == availableFormats.count) {
756 ALOGE("%s: Requested preview format %s (0x%x) is not supported",
757 __FUNCTION__, newParams.getPreviewFormat(), previewFormat);
758 return BAD_VALUE;
759 }
760 }
761
762 // PREVIEW_FRAME_RATE
763 // Deprecated, only use if the preview fps range is unchanged this time.
764 // The single-value FPS is the same as the minimum of the range.
765 if (!fpsRangeChanged) {
766 previewFps = newParams.getPreviewFrameRate();
767 if (previewFps != mParameters.previewFps) {
768 camera_metadata_entry_t availableFrameRates =
769 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
770 for (i = 0; i < availableFrameRates.count; i+=2) {
771 if (availableFrameRates.data.i32[i] == previewFps) break;
772 }
773 if (i == availableFrameRates.count) {
774 ALOGE("%s: Requested preview frame rate %d is not supported",
775 __FUNCTION__, previewFps);
776 return BAD_VALUE;
777 }
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700778 previewFpsRange[0] = availableFrameRates.data.i32[i];
779 previewFpsRange[1] = availableFrameRates.data.i32[i+1];
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700780 }
781 }
782
783 // PICTURE_SIZE
784 int pictureWidth, pictureHeight;
785 newParams.getPictureSize(&pictureWidth, &pictureHeight);
786 if (pictureWidth == mParameters.pictureWidth ||
787 pictureHeight == mParameters.pictureHeight) {
788 camera_metadata_entry_t availablePictureSizes =
789 staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
790 for (i = 0; i < availablePictureSizes.count; i+=2) {
791 if (availablePictureSizes.data.i32[i] == pictureWidth &&
792 availablePictureSizes.data.i32[i+1] == pictureHeight) break;
793 }
794 if (i == availablePictureSizes.count) {
795 ALOGE("%s: Requested picture size %d x %d is not supported",
796 __FUNCTION__, pictureWidth, pictureHeight);
797 return BAD_VALUE;
798 }
799 }
800
801 // JPEG_THUMBNAIL_WIDTH/HEIGHT
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700802 int jpegThumbSize[2];
803 jpegThumbSize[0] =
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700804 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700805 jpegThumbSize[1] =
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700806 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700807 if (jpegThumbSize[0] != mParameters.jpegThumbSize[0] ||
808 jpegThumbSize[1] != mParameters.jpegThumbSize[1]) {
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700809 camera_metadata_entry_t availableJpegThumbSizes =
810 staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
811 for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700812 if (availableJpegThumbSizes.data.i32[i] == jpegThumbSize[0] &&
813 availableJpegThumbSizes.data.i32[i+1] == jpegThumbSize[1]) {
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700814 break;
815 }
816 }
817 if (i == availableJpegThumbSizes.count) {
818 ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700819 __FUNCTION__, jpegThumbSize[0], jpegThumbSize[1]);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700820 return BAD_VALUE;
821 }
822 }
823
824 // JPEG_THUMBNAIL_QUALITY
825 int jpegThumbQuality =
826 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
827 if (jpegThumbQuality < 0 || jpegThumbQuality > 100) {
828 ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
829 __FUNCTION__, jpegThumbQuality);
830 return BAD_VALUE;
831 }
832
833 // JPEG_QUALITY
834 int jpegQuality =
835 newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
836 if (jpegQuality < 0 || jpegQuality > 100) {
837 ALOGE("%s: Requested JPEG quality %d is not supported",
838 __FUNCTION__, jpegQuality);
839 return BAD_VALUE;
840 }
841
842 // ROTATION
843 int jpegRotation =
844 newParams.getInt(CameraParameters::KEY_ROTATION);
845 if (jpegRotation != 0 &&
846 jpegRotation != 90 &&
847 jpegRotation != 180 &&
848 jpegRotation != 270) {
849 ALOGE("%s: Requested picture rotation angle %d is not supported",
850 __FUNCTION__, jpegRotation);
851 return BAD_VALUE;
852 }
853
854 // GPS
855 bool gpsEnabled = false;
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700856 double gpsCoordinates[3] = {0,0,0};
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700857 int64_t gpsTimestamp = 0;
858 String8 gpsProcessingMethod;
859 const char *gpsLatStr =
860 newParams.get(CameraParameters::KEY_GPS_LATITUDE);
861 if (gpsLatStr != NULL) {
862 const char *gpsLongStr =
863 newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
864 const char *gpsAltitudeStr =
865 newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
866 const char *gpsTimeStr =
867 newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
868 const char *gpsProcMethodStr =
869 newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
870 if (gpsLongStr == NULL ||
871 gpsAltitudeStr == NULL ||
872 gpsTimeStr == NULL ||
873 gpsProcMethodStr == NULL) {
874 ALOGE("%s: Incomplete set of GPS parameters provided",
875 __FUNCTION__);
876 return BAD_VALUE;
877 }
878 char *endPtr;
879 errno = 0;
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700880 gpsCoordinates[0] = strtod(gpsLatStr, &endPtr);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700881 if (errno || endPtr == gpsLatStr) {
882 ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
883 return BAD_VALUE;
884 }
885 errno = 0;
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700886 gpsCoordinates[1] = strtod(gpsLongStr, &endPtr);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700887 if (errno || endPtr == gpsLongStr) {
888 ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
889 return BAD_VALUE;
890 }
891 errno = 0;
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -0700892 gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700893 if (errno || endPtr == gpsAltitudeStr) {
894 ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
895 gpsAltitudeStr);
896 return BAD_VALUE;
897 }
898 errno = 0;
899 gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
900 if (errno || endPtr == gpsTimeStr) {
901 ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
902 return BAD_VALUE;
903 }
904 gpsProcessingMethod = gpsProcMethodStr;
905
906 gpsEnabled = true;
907 }
908
909 // WHITE_BALANCE
910 int wbMode = wbModeStringToEnum(
911 newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
912 if (wbMode != mParameters.wbMode) {
913 camera_metadata_entry_t availableWbModes =
914 staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
915 for (i = 0; i < availableWbModes.count; i++) {
916 if (wbMode == availableWbModes.data.u8[i]) break;
917 }
918 if (i == availableWbModes.count) {
919 ALOGE("%s: Requested white balance mode %s is not supported",
920 __FUNCTION__,
921 newParams.get(CameraParameters::KEY_WHITE_BALANCE));
922 return BAD_VALUE;
923 }
924 }
925
926 // EFFECT
927 int effectMode = effectModeStringToEnum(
928 newParams.get(CameraParameters::KEY_EFFECT) );
929 if (effectMode != mParameters.effectMode) {
930 camera_metadata_entry_t availableEffectModes =
931 staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
932 for (i = 0; i < availableEffectModes.count; i++) {
933 if (effectMode == availableEffectModes.data.u8[i]) break;
934 }
935 if (i == availableEffectModes.count) {
936 ALOGE("%s: Requested effect mode \"%s\" is not supported",
937 __FUNCTION__,
938 newParams.get(CameraParameters::KEY_EFFECT) );
939 return BAD_VALUE;
940 }
941 }
942
943 // ANTIBANDING
944 int antibandingMode = abModeStringToEnum(
945 newParams.get(CameraParameters::KEY_ANTIBANDING) );
946 if (antibandingMode != mParameters.antibandingMode) {
947 camera_metadata_entry_t availableAbModes =
948 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
949 for (i = 0; i < availableAbModes.count; i++) {
950 if (antibandingMode == availableAbModes.data.u8[i]) break;
951 }
952 if (i == availableAbModes.count) {
953 ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
954 __FUNCTION__,
955 newParams.get(CameraParameters::KEY_ANTIBANDING));
956 return BAD_VALUE;
957 }
958 }
959
960 // SCENE_MODE
961 int sceneMode = sceneModeStringToEnum(
962 newParams.get(CameraParameters::KEY_SCENE_MODE) );
963 if (sceneMode != mParameters.sceneMode) {
964 camera_metadata_entry_t availableSceneModes =
965 staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
966 for (i = 0; i < availableSceneModes.count; i++) {
967 if (sceneMode == availableSceneModes.data.u8[i]) break;
968 }
969 if (i == availableSceneModes.count) {
970 ALOGE("%s: Requested scene mode \"%s\" is not supported",
971 __FUNCTION__,
972 newParams.get(CameraParameters::KEY_SCENE_MODE));
973 return BAD_VALUE;
974 }
975 }
976
977 // FLASH_MODE
978 Parameters::flashMode_t flashMode = flashModeStringToEnum(
979 newParams.get(CameraParameters::KEY_FLASH_MODE) );
980 if (flashMode != mParameters.flashMode) {
981 camera_metadata_entry_t flashAvailable =
982 staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
983 if (!flashAvailable.data.u8[0] &&
984 flashMode != Parameters::FLASH_MODE_OFF) {
985 ALOGE("%s: Requested flash mode \"%s\" is not supported: "
986 "No flash on device", __FUNCTION__,
987 newParams.get(CameraParameters::KEY_FLASH_MODE));
988 return BAD_VALUE;
989 } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) {
990 camera_metadata_entry_t availableAeModes =
991 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
992 for (i = 0; i < availableAeModes.count; i++) {
993 if (flashMode == availableAeModes.data.u8[i]) break;
994 }
995 if (i == availableAeModes.count) {
996 ALOGE("%s: Requested flash mode \"%s\" is not supported",
997 __FUNCTION__,
998 newParams.get(CameraParameters::KEY_FLASH_MODE));
999 return BAD_VALUE;
1000 }
1001 } else if (flashMode == -1) {
1002 ALOGE("%s: Requested flash mode \"%s\" is unknown",
1003 __FUNCTION__,
1004 newParams.get(CameraParameters::KEY_FLASH_MODE));
1005 return BAD_VALUE;
1006 }
1007 }
1008
1009 // FOCUS_MODE
1010 Parameters::focusMode_t focusMode = focusModeStringToEnum(
1011 newParams.get(CameraParameters::KEY_FOCUS_MODE));
1012 if (focusMode != mParameters.focusMode) {
1013 if (focusMode != Parameters::FOCUS_MODE_FIXED) {
1014 camera_metadata_entry_t minFocusDistance =
1015 staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE);
1016 if (minFocusDistance.data.f[0] == 0) {
1017 ALOGE("%s: Requested focus mode \"%s\" is not available: "
1018 "fixed focus lens",
1019 __FUNCTION__,
1020 newParams.get(CameraParameters::KEY_FOCUS_MODE));
1021 return BAD_VALUE;
1022 } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) {
1023 camera_metadata_entry_t availableFocusModes =
1024 staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
1025 for (i = 0; i < availableFocusModes.count; i++) {
1026 if (focusMode == availableFocusModes.data.u8[i]) break;
1027 }
1028 if (i == availableFocusModes.count) {
1029 ALOGE("%s: Requested focus mode \"%s\" is not supported",
1030 __FUNCTION__,
1031 newParams.get(CameraParameters::KEY_FOCUS_MODE));
1032 return BAD_VALUE;
1033 }
1034 }
1035 }
1036 }
1037
1038 // FOCUS_AREAS
1039 Vector<Parameters::Area> focusingAreas;
1040 res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
1041 &focusingAreas);
1042 size_t max3aRegions =
1043 (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0];
1044 if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
1045 if (res != OK) {
1046 ALOGE("%s: Requested focus areas are malformed: %s",
1047 __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
1048 return BAD_VALUE;
1049 }
1050
1051 // EXPOSURE_COMPENSATION
1052 int exposureCompensation =
1053 newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
1054 camera_metadata_entry_t exposureCompensationRange =
1055 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE);
1056 if (exposureCompensation < exposureCompensationRange.data.i32[0] ||
1057 exposureCompensation > exposureCompensationRange.data.i32[1]) {
1058 ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
1059 __FUNCTION__, exposureCompensation);
1060 return BAD_VALUE;
1061 }
1062
1063 // AUTO_EXPOSURE_LOCK (always supported)
1064 bool autoExposureLock = boolFromString(
1065 newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
1066
1067 // AUTO_WHITEBALANCE_LOCK (always supported)
1068 bool autoWhiteBalanceLock = boolFromString(
1069 newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
1070
1071 // METERING_AREAS
1072 Vector<Parameters::Area> meteringAreas;
1073 res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
1074 &meteringAreas);
1075 if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
1076 if (res != OK) {
1077 ALOGE("%s: Requested metering areas are malformed: %s",
1078 __FUNCTION__,
1079 newParams.get(CameraParameters::KEY_METERING_AREAS));
1080 return BAD_VALUE;
1081 }
1082
1083 // ZOOM
1084 int zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
1085 if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) {
1086 ALOGE("%s: Requested zoom level %d is not supported",
1087 __FUNCTION__, zoom);
1088 return BAD_VALUE;
1089 }
1090
1091 // VIDEO_SIZE
1092 int videoWidth, videoHeight;
1093 newParams.getVideoSize(&videoWidth, &videoHeight);
1094 if (videoWidth != mParameters.videoWidth ||
1095 videoHeight != mParameters.videoHeight) {
1096 if (mState == RECORD) {
1097 ALOGE("%s: Video size cannot be updated when recording is active!",
1098 __FUNCTION__);
1099 return BAD_VALUE;
1100 }
1101 camera_metadata_entry_t availableVideoSizes =
1102 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
1103 for (i = 0; i < availableVideoSizes.count; i += 2 ) {
1104 if (availableVideoSizes.data.i32[i] == videoWidth &&
1105 availableVideoSizes.data.i32[i+1] == videoHeight) break;
1106 }
1107 if (i == availableVideoSizes.count) {
1108 ALOGE("%s: Requested video size %d x %d is not supported",
1109 __FUNCTION__, videoWidth, videoHeight);
1110 return BAD_VALUE;
1111 }
1112 }
1113
1114 // RECORDING_HINT (always supported)
1115 bool recordingHint = boolFromString(
1116 newParams.get(CameraParameters::KEY_RECORDING_HINT) );
1117
1118 // VIDEO_STABILIZATION
1119 bool videoStabilization = boolFromString(
1120 newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
1121 camera_metadata_entry_t availableVideoStabilizationModes =
1122 staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
1123 if (videoStabilization && availableVideoStabilizationModes.count == 1) {
1124 ALOGE("%s: Video stabilization not supported", __FUNCTION__);
1125 }
1126
1127 /** Update internal parameters */
1128 mParameters.previewWidth = previewWidth;
1129 mParameters.previewHeight = previewHeight;
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -07001130 mParameters.previewFpsRange[0] = previewFpsRange[0];
1131 mParameters.previewFpsRange[1] = previewFpsRange[1];
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001132 mParameters.previewFps = previewFps;
1133 mParameters.previewFormat = previewFormat;
1134
1135 mParameters.pictureWidth = pictureWidth;
1136 mParameters.pictureHeight = pictureHeight;
1137
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -07001138 mParameters.jpegThumbSize[0] = jpegThumbSize[0];
1139 mParameters.jpegThumbSize[1] = jpegThumbSize[1];
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001140 mParameters.jpegQuality = jpegQuality;
1141 mParameters.jpegThumbQuality = jpegThumbQuality;
1142
1143 mParameters.gpsEnabled = gpsEnabled;
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -07001144 mParameters.gpsCoordinates[0] = gpsCoordinates[0];
1145 mParameters.gpsCoordinates[1] = gpsCoordinates[1];
1146 mParameters.gpsCoordinates[2] = gpsCoordinates[2];
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001147 mParameters.gpsTimestamp = gpsTimestamp;
1148 mParameters.gpsProcessingMethod = gpsProcessingMethod;
1149
1150 mParameters.wbMode = wbMode;
1151 mParameters.effectMode = effectMode;
1152 mParameters.antibandingMode = antibandingMode;
1153 mParameters.sceneMode = sceneMode;
1154
1155 mParameters.flashMode = flashMode;
1156 mParameters.focusMode = focusMode;
1157
1158 mParameters.focusingAreas = focusingAreas;
1159 mParameters.exposureCompensation = exposureCompensation;
1160 mParameters.autoExposureLock = autoExposureLock;
1161 mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock;
1162 mParameters.meteringAreas = meteringAreas;
1163 mParameters.zoom = zoom;
1164
1165 mParameters.videoWidth = videoWidth;
1166 mParameters.videoHeight = videoHeight;
1167
1168 mParameters.recordingHint = recordingHint;
1169 mParameters.videoStabilization = videoStabilization;
1170
1171 updatePreviewRequest();
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001172 updateCaptureRequest();
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001173
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001174 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001175}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001176
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001177String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001178 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001179 Mutex::Autolock icl(mICameraLock);
1180
1181 Mutex::Autolock pl(mParamsLock);
1182
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001183 // TODO: Deal with focus distances
1184 return mParamsFlattened;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001185}
1186
1187status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001188 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001189 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001190 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001191}
1192
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001193/** Device-related methods */
1194
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001195void Camera2Client::onCaptureAvailable() {
1196 ATRACE_CALL();
1197 status_t res;
1198 sp<ICameraClient> currentClient;
1199 CpuConsumer::LockedBuffer imgBuffer;
1200 {
1201 Mutex::Autolock icl(mICameraLock);
1202
1203 // TODO: Signal errors here upstream
1204 if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) {
1205 ALOGE("%s: Camera %d: Still image produced unexpectedly!",
1206 __FUNCTION__, mCameraId);
1207 return;
1208 }
1209
1210 res = mCaptureConsumer->lockNextBuffer(&imgBuffer);
1211 if (res != OK) {
1212 ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)",
1213 __FUNCTION__, mCameraId, strerror(-res), res);
1214 return;
1215 }
1216
1217 if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) {
1218 ALOGE("%s: Camera %d: Unexpected format for still image: "
1219 "%x, expected %x", __FUNCTION__, mCameraId,
1220 imgBuffer.format,
1221 HAL_PIXEL_FORMAT_BLOB);
1222 mCaptureConsumer->unlockBuffer(imgBuffer);
1223 return;
1224 }
1225
1226 // TODO: Optimize this to avoid memcopy
1227 void* captureMemory = mCaptureHeap->getBase();
1228 size_t size = mCaptureHeap->getSize();
1229 memcpy(captureMemory, imgBuffer.data, size);
1230
1231 mCaptureConsumer->unlockBuffer(imgBuffer);
1232
1233 currentClient = mCameraClient;
1234 switch (mState) {
1235 case STILL_CAPTURE:
1236 mState = STOPPED;
1237 break;
1238 case VIDEO_SNAPSHOT:
1239 mState = RECORD;
1240 break;
1241 default:
1242 ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__,
1243 mCameraId, mState);
1244 break;
1245 }
1246 }
1247 // Call outside mICameraLock to allow re-entrancy from notification
1248 if (currentClient != 0) {
1249 currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
1250 mCaptureMemory, NULL);
1251 }
1252}
1253
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001254camera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag,
1255 size_t minCount, size_t maxCount) {
1256 status_t res;
1257 camera_metadata_entry_t entry;
1258 res = find_camera_metadata_entry(mDevice->info(),
1259 tag,
1260 &entry);
1261 if (CC_UNLIKELY( res != OK )) {
1262 const char* tagSection = get_camera_metadata_section_name(tag);
1263 if (tagSection == NULL) tagSection = "<unknown>";
1264 const char* tagName = get_camera_metadata_tag_name(tag);
1265 if (tagName == NULL) tagName = "<unknown>";
1266
1267 ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)",
1268 tagSection, tagName, tag, strerror(-res), res);
1269 entry.count = 0;
1270 entry.data.u8 = NULL;
1271 } else if (CC_UNLIKELY(
1272 (minCount != 0 && entry.count < minCount) ||
1273 (maxCount != 0 && entry.count > maxCount) ) ) {
1274 const char* tagSection = get_camera_metadata_section_name(tag);
1275 if (tagSection == NULL) tagSection = "<unknown>";
1276 const char* tagName = get_camera_metadata_tag_name(tag);
1277 if (tagName == NULL) tagName = "<unknown>";
1278 ALOGE("Malformed static metadata entry '%s.%s' (%x):"
1279 "Expected between %d and %d values, but got %d values",
1280 tagSection, tagName, tag, minCount, maxCount, entry.count);
1281 entry.count = 0;
1282 entry.data.u8 = NULL;
1283 }
1284
1285 return entry;
1286}
1287
1288/** Utility methods */
1289
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001290
1291status_t Camera2Client::buildDefaultParameters() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001292 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001293 Mutex::Autolock pl(mParamsLock);
1294
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001295 status_t res;
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001296 CameraParameters params;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001297
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001298 camera_metadata_entry_t availableProcessedSizes =
1299 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
1300 if (!availableProcessedSizes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001301
1302 // TODO: Pick more intelligently
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001303 mParameters.previewWidth = availableProcessedSizes.data.i32[0];
1304 mParameters.previewHeight = availableProcessedSizes.data.i32[1];
1305 mParameters.videoWidth = mParameters.previewWidth;
1306 mParameters.videoHeight = mParameters.previewHeight;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001307
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001308 params.setPreviewSize(mParameters.previewWidth, mParameters.previewHeight);
1309 params.setVideoSize(mParameters.videoWidth, mParameters.videoHeight);
1310 params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
1311 String8::format("%dx%d",
1312 mParameters.previewWidth, mParameters.previewHeight));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001313 {
1314 String8 supportedPreviewSizes;
1315 for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
1316 if (i != 0) supportedPreviewSizes += ",";
1317 supportedPreviewSizes += String8::format("%dx%d",
1318 availableProcessedSizes.data.i32[i],
1319 availableProcessedSizes.data.i32[i+1]);
1320 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001321 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001322 supportedPreviewSizes);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001323 params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001324 supportedPreviewSizes);
1325 }
1326
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001327 camera_metadata_entry_t availableFpsRanges =
1328 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
1329 if (!availableFpsRanges.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001330
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -07001331 mParameters.previewFpsRange[0] = availableFpsRanges.data.i32[0];
1332 mParameters.previewFpsRange[1] = availableFpsRanges.data.i32[1];
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001333
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001334 params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
1335 String8::format("%d,%d",
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -07001336 mParameters.previewFpsRange[0],
1337 mParameters.previewFpsRange[1]));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001338
1339 {
1340 String8 supportedPreviewFpsRange;
1341 for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1342 if (i != 0) supportedPreviewFpsRange += ",";
1343 supportedPreviewFpsRange += String8::format("(%d,%d)",
1344 availableFpsRanges.data.i32[i],
1345 availableFpsRanges.data.i32[i+1]);
1346 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001347 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001348 supportedPreviewFpsRange);
1349 }
1350
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001351 mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1352 params.set(CameraParameters::KEY_PREVIEW_FORMAT,
1353 formatEnumToString(mParameters.previewFormat)); // NV21
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001354
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001355 camera_metadata_entry_t availableFormats =
1356 staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
1357
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001358 {
1359 String8 supportedPreviewFormats;
1360 bool addComma = false;
1361 for (size_t i=0; i < availableFormats.count; i++) {
1362 if (addComma) supportedPreviewFormats += ",";
1363 addComma = true;
1364 switch (availableFormats.data.i32[i]) {
1365 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001366 supportedPreviewFormats +=
1367 CameraParameters::PIXEL_FORMAT_YUV422SP;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001368 break;
1369 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001370 supportedPreviewFormats +=
1371 CameraParameters::PIXEL_FORMAT_YUV420SP;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001372 break;
1373 case HAL_PIXEL_FORMAT_YCbCr_422_I:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001374 supportedPreviewFormats +=
1375 CameraParameters::PIXEL_FORMAT_YUV422I;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001376 break;
1377 case HAL_PIXEL_FORMAT_YV12:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001378 supportedPreviewFormats +=
1379 CameraParameters::PIXEL_FORMAT_YUV420P;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001380 break;
1381 case HAL_PIXEL_FORMAT_RGB_565:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001382 supportedPreviewFormats +=
1383 CameraParameters::PIXEL_FORMAT_RGB565;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001384 break;
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -07001385 case HAL_PIXEL_FORMAT_RGBA_8888:
1386 supportedPreviewFormats +=
1387 CameraParameters::PIXEL_FORMAT_RGBA8888;
1388 break;
1389 // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001390 case HAL_PIXEL_FORMAT_RAW_SENSOR:
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -07001391 case HAL_PIXEL_FORMAT_BLOB:
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001392 addComma = false;
1393 break;
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -07001394
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001395 default:
1396 ALOGW("%s: Camera %d: Unknown preview format: %x",
1397 __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
1398 addComma = false;
1399 break;
1400 }
1401 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001402 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001403 supportedPreviewFormats);
1404 }
1405
1406 // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
1407 // still have to do something sane for them
1408
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001409 params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -07001410 mParameters.previewFpsRange[0]);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001411
1412 {
1413 String8 supportedPreviewFrameRates;
1414 for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1415 if (i != 0) supportedPreviewFrameRates += ",";
1416 supportedPreviewFrameRates += String8::format("%d",
1417 availableFpsRanges.data.i32[i]);
1418 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001419 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001420 supportedPreviewFrameRates);
1421 }
1422
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001423 camera_metadata_entry_t availableJpegSizes =
1424 staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
1425 if (!availableJpegSizes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001426
1427 // TODO: Pick maximum
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001428 mParameters.pictureWidth = availableJpegSizes.data.i32[0];
1429 mParameters.pictureHeight = availableJpegSizes.data.i32[1];
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001430
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001431 params.setPictureSize(mParameters.pictureWidth,
1432 mParameters.pictureHeight);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001433
1434 {
1435 String8 supportedPictureSizes;
1436 for (size_t i=0; i < availableJpegSizes.count; i += 2) {
1437 if (i != 0) supportedPictureSizes += ",";
1438 supportedPictureSizes += String8::format("%dx%d",
1439 availableJpegSizes.data.i32[i],
1440 availableJpegSizes.data.i32[i+1]);
1441 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001442 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001443 supportedPictureSizes);
1444 }
1445
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001446 params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
1447 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
1448 CameraParameters::PIXEL_FORMAT_JPEG);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001449
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001450 camera_metadata_entry_t availableJpegThumbnailSizes =
1451 staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2);
1452 if (!availableJpegThumbnailSizes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001453
1454 // TODO: Pick default thumbnail size sensibly
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -07001455 mParameters.jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0];
1456 mParameters.jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1];
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001457
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001458 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -07001459 mParameters.jpegThumbSize[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001460 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
Eino-Ville Talvala11b7cde2012-06-15 12:37:35 -07001461 mParameters.jpegThumbSize[1]);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001462
1463 {
1464 String8 supportedJpegThumbSizes;
1465 for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
1466 if (i != 0) supportedJpegThumbSizes += ",";
1467 supportedJpegThumbSizes += String8::format("%dx%d",
1468 availableJpegThumbnailSizes.data.i32[i],
1469 availableJpegThumbnailSizes.data.i32[i+1]);
1470 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001471 params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001472 supportedJpegThumbSizes);
1473 }
1474
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001475 mParameters.jpegThumbQuality = 90;
1476 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
1477 mParameters.jpegThumbQuality);
1478 mParameters.jpegQuality = 90;
1479 params.set(CameraParameters::KEY_JPEG_QUALITY,
1480 mParameters.jpegQuality);
1481 mParameters.jpegRotation = 0;
1482 params.set(CameraParameters::KEY_ROTATION,
1483 mParameters.jpegRotation);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001484
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001485 mParameters.gpsEnabled = false;
1486 mParameters.gpsProcessingMethod = "unknown";
1487 // GPS fields in CameraParameters are not set by implementation
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001488
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001489 mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO;
1490 params.set(CameraParameters::KEY_WHITE_BALANCE,
1491 CameraParameters::WHITE_BALANCE_AUTO);
1492
1493 camera_metadata_entry_t availableWhiteBalanceModes =
1494 staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001495 {
1496 String8 supportedWhiteBalance;
1497 bool addComma = false;
1498 for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
1499 if (addComma) supportedWhiteBalance += ",";
1500 addComma = true;
1501 switch (availableWhiteBalanceModes.data.u8[i]) {
1502 case ANDROID_CONTROL_AWB_AUTO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001503 supportedWhiteBalance +=
1504 CameraParameters::WHITE_BALANCE_AUTO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001505 break;
1506 case ANDROID_CONTROL_AWB_INCANDESCENT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001507 supportedWhiteBalance +=
1508 CameraParameters::WHITE_BALANCE_INCANDESCENT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001509 break;
1510 case ANDROID_CONTROL_AWB_FLUORESCENT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001511 supportedWhiteBalance +=
1512 CameraParameters::WHITE_BALANCE_FLUORESCENT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001513 break;
1514 case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001515 supportedWhiteBalance +=
1516 CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001517 break;
1518 case ANDROID_CONTROL_AWB_DAYLIGHT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001519 supportedWhiteBalance +=
1520 CameraParameters::WHITE_BALANCE_DAYLIGHT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001521 break;
1522 case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001523 supportedWhiteBalance +=
1524 CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001525 break;
1526 case ANDROID_CONTROL_AWB_TWILIGHT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001527 supportedWhiteBalance +=
1528 CameraParameters::WHITE_BALANCE_TWILIGHT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001529 break;
1530 case ANDROID_CONTROL_AWB_SHADE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001531 supportedWhiteBalance +=
1532 CameraParameters::WHITE_BALANCE_SHADE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001533 break;
1534 // Skipping values not mappable to v1 API
1535 case ANDROID_CONTROL_AWB_OFF:
1536 addComma = false;
1537 break;
1538 default:
1539 ALOGW("%s: Camera %d: Unknown white balance value: %d",
1540 __FUNCTION__, mCameraId,
1541 availableWhiteBalanceModes.data.u8[i]);
1542 addComma = false;
1543 break;
1544 }
1545 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001546 params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001547 supportedWhiteBalance);
1548 }
1549
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001550 mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF;
1551 params.set(CameraParameters::KEY_EFFECT,
1552 CameraParameters::EFFECT_NONE);
1553
1554 camera_metadata_entry_t availableEffects =
1555 staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
1556 if (!availableEffects.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001557 {
1558 String8 supportedEffects;
1559 bool addComma = false;
1560 for (size_t i=0; i < availableEffects.count; i++) {
1561 if (addComma) supportedEffects += ",";
1562 addComma = true;
1563 switch (availableEffects.data.u8[i]) {
1564 case ANDROID_CONTROL_EFFECT_OFF:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001565 supportedEffects +=
1566 CameraParameters::EFFECT_NONE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001567 break;
1568 case ANDROID_CONTROL_EFFECT_MONO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001569 supportedEffects +=
1570 CameraParameters::EFFECT_MONO;
1571 break;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001572 case ANDROID_CONTROL_EFFECT_NEGATIVE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001573 supportedEffects +=
1574 CameraParameters::EFFECT_NEGATIVE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001575 break;
1576 case ANDROID_CONTROL_EFFECT_SOLARIZE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001577 supportedEffects +=
1578 CameraParameters::EFFECT_SOLARIZE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001579 break;
1580 case ANDROID_CONTROL_EFFECT_SEPIA:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001581 supportedEffects +=
1582 CameraParameters::EFFECT_SEPIA;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001583 break;
1584 case ANDROID_CONTROL_EFFECT_POSTERIZE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001585 supportedEffects +=
1586 CameraParameters::EFFECT_POSTERIZE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001587 break;
1588 case ANDROID_CONTROL_EFFECT_WHITEBOARD:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001589 supportedEffects +=
1590 CameraParameters::EFFECT_WHITEBOARD;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001591 break;
1592 case ANDROID_CONTROL_EFFECT_BLACKBOARD:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001593 supportedEffects +=
1594 CameraParameters::EFFECT_BLACKBOARD;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001595 break;
1596 case ANDROID_CONTROL_EFFECT_AQUA:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001597 supportedEffects +=
1598 CameraParameters::EFFECT_AQUA;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001599 break;
1600 default:
1601 ALOGW("%s: Camera %d: Unknown effect value: %d",
1602 __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
1603 addComma = false;
1604 break;
1605 }
1606 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001607 params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001608 }
1609
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001610 mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
1611 params.set(CameraParameters::KEY_ANTIBANDING,
1612 CameraParameters::ANTIBANDING_AUTO);
1613
1614 camera_metadata_entry_t availableAntibandingModes =
1615 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
1616 if (!availableAntibandingModes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001617 {
1618 String8 supportedAntibanding;
1619 bool addComma = false;
1620 for (size_t i=0; i < availableAntibandingModes.count; i++) {
1621 if (addComma) supportedAntibanding += ",";
1622 addComma = true;
1623 switch (availableAntibandingModes.data.u8[i]) {
1624 case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001625 supportedAntibanding +=
1626 CameraParameters::ANTIBANDING_OFF;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001627 break;
1628 case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001629 supportedAntibanding +=
1630 CameraParameters::ANTIBANDING_50HZ;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001631 break;
1632 case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001633 supportedAntibanding +=
1634 CameraParameters::ANTIBANDING_60HZ;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001635 break;
1636 case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001637 supportedAntibanding +=
1638 CameraParameters::ANTIBANDING_AUTO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001639 break;
1640 default:
1641 ALOGW("%s: Camera %d: Unknown antibanding value: %d",
1642 __FUNCTION__, mCameraId,
1643 availableAntibandingModes.data.u8[i]);
1644 addComma = false;
1645 break;
1646 }
1647 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001648 params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001649 supportedAntibanding);
1650 }
1651
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001652 mParameters.sceneMode = ANDROID_CONTROL_OFF;
1653 params.set(CameraParameters::KEY_SCENE_MODE,
1654 CameraParameters::SCENE_MODE_AUTO);
1655
1656 camera_metadata_entry_t availableSceneModes =
1657 staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
1658 if (!availableSceneModes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001659 {
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001660 String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001661 bool addComma = true;
1662 bool noSceneModes = false;
1663 for (size_t i=0; i < availableSceneModes.count; i++) {
1664 if (addComma) supportedSceneModes += ",";
1665 addComma = true;
1666 switch (availableSceneModes.data.u8[i]) {
1667 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
1668 noSceneModes = true;
1669 break;
1670 case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
1671 // Not in old API
1672 addComma = false;
1673 break;
1674 case ANDROID_CONTROL_SCENE_MODE_ACTION:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001675 supportedSceneModes +=
1676 CameraParameters::SCENE_MODE_ACTION;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001677 break;
1678 case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001679 supportedSceneModes +=
1680 CameraParameters::SCENE_MODE_PORTRAIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001681 break;
1682 case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001683 supportedSceneModes +=
1684 CameraParameters::SCENE_MODE_LANDSCAPE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001685 break;
1686 case ANDROID_CONTROL_SCENE_MODE_NIGHT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001687 supportedSceneModes +=
1688 CameraParameters::SCENE_MODE_NIGHT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001689 break;
1690 case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001691 supportedSceneModes +=
1692 CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001693 break;
1694 case ANDROID_CONTROL_SCENE_MODE_THEATRE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001695 supportedSceneModes +=
1696 CameraParameters::SCENE_MODE_THEATRE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001697 break;
1698 case ANDROID_CONTROL_SCENE_MODE_BEACH:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001699 supportedSceneModes +=
1700 CameraParameters::SCENE_MODE_BEACH;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001701 break;
1702 case ANDROID_CONTROL_SCENE_MODE_SNOW:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001703 supportedSceneModes +=
1704 CameraParameters::SCENE_MODE_SNOW;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001705 break;
1706 case ANDROID_CONTROL_SCENE_MODE_SUNSET:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001707 supportedSceneModes +=
1708 CameraParameters::SCENE_MODE_SUNSET;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001709 break;
1710 case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001711 supportedSceneModes +=
1712 CameraParameters::SCENE_MODE_STEADYPHOTO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001713 break;
1714 case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001715 supportedSceneModes +=
1716 CameraParameters::SCENE_MODE_FIREWORKS;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001717 break;
1718 case ANDROID_CONTROL_SCENE_MODE_SPORTS:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001719 supportedSceneModes +=
1720 CameraParameters::SCENE_MODE_SPORTS;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001721 break;
1722 case ANDROID_CONTROL_SCENE_MODE_PARTY:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001723 supportedSceneModes +=
1724 CameraParameters::SCENE_MODE_PARTY;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001725 break;
1726 case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001727 supportedSceneModes +=
1728 CameraParameters::SCENE_MODE_CANDLELIGHT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001729 break;
1730 case ANDROID_CONTROL_SCENE_MODE_BARCODE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001731 supportedSceneModes +=
1732 CameraParameters::SCENE_MODE_BARCODE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001733 break;
1734 default:
1735 ALOGW("%s: Camera %d: Unknown scene mode value: %d",
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001736 __FUNCTION__, mCameraId,
1737 availableSceneModes.data.u8[i]);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001738 addComma = false;
1739 break;
1740 }
1741 }
1742 if (!noSceneModes) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001743 params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001744 supportedSceneModes);
1745 }
1746 }
1747
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001748 camera_metadata_entry_t flashAvailable =
1749 staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
1750 if (!flashAvailable.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001751
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001752 camera_metadata_entry_t availableAeModes =
1753 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
1754 if (!availableAeModes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001755
1756 if (flashAvailable.data.u8[0]) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001757 mParameters.flashMode = Parameters::FLASH_MODE_AUTO;
1758 params.set(CameraParameters::KEY_FLASH_MODE,
1759 CameraParameters::FLASH_MODE_AUTO);
1760
1761 String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
1762 supportedFlashModes = supportedFlashModes +
1763 "," + CameraParameters::FLASH_MODE_AUTO +
1764 "," + CameraParameters::FLASH_MODE_ON +
1765 "," + CameraParameters::FLASH_MODE_TORCH;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001766 for (size_t i=0; i < availableAeModes.count; i++) {
1767 if (availableAeModes.data.u8[i] ==
1768 ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001769 supportedFlashModes = supportedFlashModes + "," +
1770 CameraParameters::FLASH_MODE_RED_EYE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001771 break;
1772 }
1773 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001774 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001775 supportedFlashModes);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001776 } else {
1777 mParameters.flashMode = Parameters::FLASH_MODE_OFF;
1778 params.set(CameraParameters::KEY_FLASH_MODE,
1779 CameraParameters::FLASH_MODE_OFF);
1780 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
1781 CameraParameters::FLASH_MODE_OFF);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001782 }
1783
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001784 camera_metadata_entry_t minFocusDistance =
1785 staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
1786 if (!minFocusDistance.count) return NO_INIT;
1787
1788 camera_metadata_entry_t availableAfModes =
1789 staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
1790 if (!availableAfModes.count) return NO_INIT;
1791
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001792 if (minFocusDistance.data.f[0] == 0) {
1793 // Fixed-focus lens
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001794 mParameters.focusMode = Parameters::FOCUS_MODE_FIXED;
1795 params.set(CameraParameters::KEY_FOCUS_MODE,
1796 CameraParameters::FOCUS_MODE_FIXED);
1797 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
1798 CameraParameters::FOCUS_MODE_FIXED);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001799 } else {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001800 mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
1801 params.set(CameraParameters::KEY_FOCUS_MODE,
1802 CameraParameters::FOCUS_MODE_AUTO);
1803 String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED);
1804 supportedFocusModes = supportedFocusModes + "," +
1805 CameraParameters::FOCUS_MODE_INFINITY;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001806 bool addComma = true;
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001807
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001808 for (size_t i=0; i < availableAfModes.count; i++) {
1809 if (addComma) supportedFocusModes += ",";
1810 addComma = true;
1811 switch (availableAfModes.data.u8[i]) {
1812 case ANDROID_CONTROL_AF_AUTO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001813 supportedFocusModes +=
1814 CameraParameters::FOCUS_MODE_AUTO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001815 break;
1816 case ANDROID_CONTROL_AF_MACRO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001817 supportedFocusModes +=
1818 CameraParameters::FOCUS_MODE_MACRO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001819 break;
1820 case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001821 supportedFocusModes +=
1822 CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001823 break;
1824 case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001825 supportedFocusModes +=
1826 CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001827 break;
1828 case ANDROID_CONTROL_AF_EDOF:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001829 supportedFocusModes +=
1830 CameraParameters::FOCUS_MODE_EDOF;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001831 break;
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001832 // Not supported in old API
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001833 case ANDROID_CONTROL_AF_OFF:
1834 addComma = false;
1835 break;
1836 default:
1837 ALOGW("%s: Camera %d: Unknown AF mode value: %d",
1838 __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
1839 addComma = false;
1840 break;
1841 }
1842 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001843 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001844 supportedFocusModes);
1845 }
1846
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001847 camera_metadata_entry_t max3aRegions =
1848 staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
1849 if (!max3aRegions.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001850
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001851 params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001852 max3aRegions.data.i32[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001853 params.set(CameraParameters::KEY_FOCUS_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001854 "(0,0,0,0,0)");
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001855 mParameters.focusingAreas.clear();
1856 mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001857
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001858 camera_metadata_entry_t availableFocalLengths =
1859 staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
1860 if (!availableFocalLengths.count) return NO_INIT;
1861
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001862 float minFocalLength = availableFocalLengths.data.f[0];
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001863 params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001864
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001865 camera_metadata_entry_t sensorSize =
1866 staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
1867 if (!sensorSize.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001868
1869 // The fields of view here assume infinity focus, maximum wide angle
1870 float horizFov = 180 / M_PI *
1871 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
1872 float vertFov = 180 / M_PI *
1873 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001874 params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
1875 params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001876
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001877 mParameters.exposureCompensation = 0;
1878 params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
1879 mParameters.exposureCompensation);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001880
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001881 camera_metadata_entry_t exposureCompensationRange =
1882 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
1883 if (!exposureCompensationRange.count) return NO_INIT;
1884
1885 params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001886 exposureCompensationRange.data.i32[1]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001887 params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001888 exposureCompensationRange.data.i32[0]);
1889
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001890 camera_metadata_entry_t exposureCompensationStep =
1891 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
1892 if (!exposureCompensationStep.count) return NO_INIT;
1893
1894 params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001895 exposureCompensationStep.data.r[0].numerator /
1896 exposureCompensationStep.data.r[0].denominator);
1897
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001898 mParameters.autoExposureLock = false;
1899 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
1900 CameraParameters::FALSE);
1901 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
1902 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001903
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001904 mParameters.autoWhiteBalanceLock = false;
1905 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
1906 CameraParameters::FALSE);
1907 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
1908 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001909
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001910 mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
1911 params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001912 max3aRegions.data.i32[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001913 params.set(CameraParameters::KEY_METERING_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001914 "(0,0,0,0,0)");
1915
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001916 mParameters.zoom = 0;
1917 params.set(CameraParameters::KEY_ZOOM, mParameters.zoom);
1918 params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001919
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001920 camera_metadata_entry_t maxDigitalZoom =
1921 staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
1922 if (!maxDigitalZoom.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001923
1924 {
1925 String8 zoomRatios;
1926 float zoom = 1.f;
1927 float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001928 (NUM_ZOOM_STEPS-1);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001929 bool addComma = false;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001930 for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001931 if (addComma) zoomRatios += ",";
1932 addComma = true;
1933 zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
1934 zoom += zoomIncrement;
1935 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001936 params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001937 }
1938
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001939 params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
1940 CameraParameters::TRUE);
1941 params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
1942 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001943
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001944 params.set(CameraParameters::KEY_FOCUS_DISTANCES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001945 "Infinity,Infinity,Infinity");
1946
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001947 camera_metadata_entry_t maxFacesDetected =
1948 staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
1949 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001950 maxFacesDetected.data.i32[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001951 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001952 0);
1953
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001954 params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
1955 formatEnumToString(HAL_PIXEL_FORMAT_YCrCb_420_SP));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001956
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001957 params.set(CameraParameters::KEY_RECORDING_HINT,
1958 CameraParameters::FALSE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001959
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001960 params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
1961 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001962
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001963 params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
1964 CameraParameters::FALSE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001965
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001966 camera_metadata_entry_t availableVideoStabilizationModes =
1967 staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
1968 if (!availableVideoStabilizationModes.count) return NO_INIT;
1969
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001970 if (availableVideoStabilizationModes.count > 1) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001971 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
1972 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001973 } else {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001974 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
1975 CameraParameters::FALSE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001976 }
1977
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001978 mParamsFlattened = params.flatten();
1979
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001980 return OK;
1981}
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001982
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001983status_t Camera2Client::updatePreviewRequest() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001984 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001985 status_t res;
1986 if (mPreviewRequest == NULL) {
1987 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
1988 &mPreviewRequest);
1989 if (res != OK) {
1990 ALOGE("%s: Camera %d: Unable to create default preview request: "
1991 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1992 return res;
1993 }
1994 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001995 // TODO: Adjust for params changes
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001996 return OK;
1997}
1998
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001999status_t Camera2Client::updateCaptureStream() {
2000 status_t res;
2001 // Find out buffer size for JPEG
2002 camera_metadata_entry_t maxJpegSize =
2003 staticInfo(ANDROID_JPEG_MAX_SIZE);
2004 if (maxJpegSize.count == 0) {
2005 ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!",
2006 __FUNCTION__, mCameraId);
2007 return INVALID_OPERATION;
2008 }
2009
2010 if (mCaptureConsumer == 0) {
2011 // Create CPU buffer queue endpoint
2012 mCaptureConsumer = new CpuConsumer(1);
2013 mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this));
2014 mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer"));
2015 mCaptureWindow = new SurfaceTextureClient(
2016 mCaptureConsumer->getProducerInterface());
2017 // Create memory for API consumption
2018 mCaptureHeap = new MemoryHeapBase(maxJpegSize.data.i32[0], 0,
2019 "Camera2Client::CaptureHeap");
2020 if (mCaptureHeap->getSize() == 0) {
2021 ALOGE("%s: Camera %d: Unable to allocate memory for capture",
2022 __FUNCTION__, mCameraId);
2023 return NO_MEMORY;
2024 }
2025 mCaptureMemory = new MemoryBase(mCaptureHeap,
2026 0, maxJpegSize.data.i32[0]);
2027 }
2028 if (mCaptureStreamId == NO_STREAM) {
2029 // Create stream for HAL production
2030 res = mDevice->createStream(mCaptureWindow,
2031 mParameters.pictureWidth, mParameters.pictureHeight,
2032 HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0],
2033 &mCaptureStreamId);
2034 if (res != OK) {
2035 ALOGE("%s: Camera %d: Can't create output stream for capture: "
2036 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2037 return res;
2038 }
2039
2040 } else {
2041 // Check if stream parameters have to change
2042 uint32_t currentWidth, currentHeight;
2043 res = mDevice->getStreamInfo(mCaptureStreamId,
2044 &currentWidth, &currentHeight, 0);
2045 if (res != OK) {
2046 ALOGE("%s: Camera %d: Error querying capture output stream info: "
2047 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2048 return res;
2049 }
2050 if (currentWidth != (uint32_t)mParameters.pictureWidth ||
2051 currentHeight != (uint32_t)mParameters.pictureHeight) {
2052 res = mDevice->deleteStream(mCaptureStreamId);
2053 if (res != OK) {
2054 ALOGE("%s: Camera %d: Unable to delete old output stream "
2055 "for capture: %s (%d)", __FUNCTION__, mCameraId,
2056 strerror(-res), res);
2057 return res;
2058 }
2059 mCaptureStreamId = NO_STREAM;
2060 return updateCaptureStream();
2061 }
2062 }
2063 return OK;
2064}
2065status_t Camera2Client::updateCaptureRequest() {
2066 ATRACE_CALL();
2067 status_t res;
2068 if (mCaptureRequest == NULL) {
2069 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE,
2070 &mCaptureRequest);
2071 if (res != OK) {
2072 ALOGE("%s: Camera %d: Unable to create default still image request:"
2073 " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2074 return res;
2075 }
2076 }
2077 // TODO: Adjust for params changes
2078 return OK;
2079}
2080
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07002081int Camera2Client::formatStringToEnum(const char *format) {
2082 return
2083 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ?
2084 HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
2085 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ?
2086 HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
2087 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ?
2088 HAL_PIXEL_FORMAT_YCbCr_422_I : // YUY2
2089 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ?
2090 HAL_PIXEL_FORMAT_YV12 : // YV12
2091 !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ?
2092 HAL_PIXEL_FORMAT_RGB_565 : // RGB565
2093 !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ?
2094 HAL_PIXEL_FORMAT_RGBA_8888 : // RGB8888
2095 !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ?
2096 HAL_PIXEL_FORMAT_RAW_SENSOR : // Raw sensor data
2097 -1;
2098}
2099
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07002100const char* Camera2Client::formatEnumToString(int format) {
2101 const char *fmt;
2102 switch(format) {
2103 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
2104 fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
2105 break;
2106 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
2107 fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
2108 break;
2109 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
2110 fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
2111 break;
2112 case HAL_PIXEL_FORMAT_YV12: // YV12
2113 fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
2114 break;
2115 case HAL_PIXEL_FORMAT_RGB_565: // RGB565
2116 fmt = CameraParameters::PIXEL_FORMAT_RGB565;
2117 break;
2118 case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888
2119 fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
2120 break;
2121 case HAL_PIXEL_FORMAT_RAW_SENSOR:
2122 ALOGW("Raw sensor preview format requested.");
2123 fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
2124 break;
2125 default:
2126 ALOGE("%s: Unknown preview format: %x",
2127 __FUNCTION__, format);
2128 fmt = NULL;
2129 break;
2130 }
2131 return fmt;
2132}
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07002133
2134int Camera2Client::wbModeStringToEnum(const char *wbMode) {
2135 return
2136 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
2137 ANDROID_CONTROL_AWB_AUTO :
2138 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
2139 ANDROID_CONTROL_AWB_INCANDESCENT :
2140 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
2141 ANDROID_CONTROL_AWB_FLUORESCENT :
2142 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
2143 ANDROID_CONTROL_AWB_WARM_FLUORESCENT :
2144 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
2145 ANDROID_CONTROL_AWB_DAYLIGHT :
2146 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
2147 ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT :
2148 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
2149 ANDROID_CONTROL_AWB_TWILIGHT :
2150 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
2151 ANDROID_CONTROL_AWB_SHADE :
2152 -1;
2153}
2154
2155int Camera2Client::effectModeStringToEnum(const char *effectMode) {
2156 return
2157 !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
2158 ANDROID_CONTROL_EFFECT_OFF :
2159 !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
2160 ANDROID_CONTROL_EFFECT_MONO :
2161 !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
2162 ANDROID_CONTROL_EFFECT_NEGATIVE :
2163 !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
2164 ANDROID_CONTROL_EFFECT_SOLARIZE :
2165 !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
2166 ANDROID_CONTROL_EFFECT_SEPIA :
2167 !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
2168 ANDROID_CONTROL_EFFECT_POSTERIZE :
2169 !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
2170 ANDROID_CONTROL_EFFECT_WHITEBOARD :
2171 !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
2172 ANDROID_CONTROL_EFFECT_BLACKBOARD :
2173 !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
2174 ANDROID_CONTROL_EFFECT_AQUA :
2175 -1;
2176}
2177
2178int Camera2Client::abModeStringToEnum(const char *abMode) {
2179 return
2180 !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
2181 ANDROID_CONTROL_AE_ANTIBANDING_AUTO :
2182 !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
2183 ANDROID_CONTROL_AE_ANTIBANDING_OFF :
2184 !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
2185 ANDROID_CONTROL_AE_ANTIBANDING_50HZ :
2186 !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
2187 ANDROID_CONTROL_AE_ANTIBANDING_60HZ :
2188 -1;
2189}
2190
2191int Camera2Client::sceneModeStringToEnum(const char *sceneMode) {
2192 return
2193 !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
2194 ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
2195 !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
2196 ANDROID_CONTROL_SCENE_MODE_ACTION :
2197 !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
2198 ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
2199 !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
2200 ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
2201 !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
2202 ANDROID_CONTROL_SCENE_MODE_NIGHT :
2203 !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
2204 ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
2205 !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
2206 ANDROID_CONTROL_SCENE_MODE_THEATRE :
2207 !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
2208 ANDROID_CONTROL_SCENE_MODE_BEACH :
2209 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
2210 ANDROID_CONTROL_SCENE_MODE_SNOW :
2211 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
2212 ANDROID_CONTROL_SCENE_MODE_SUNSET :
2213 !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
2214 ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
2215 !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
2216 ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
2217 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
2218 ANDROID_CONTROL_SCENE_MODE_SPORTS :
2219 !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
2220 ANDROID_CONTROL_SCENE_MODE_PARTY :
2221 !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
2222 ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
2223 !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
2224 ANDROID_CONTROL_SCENE_MODE_BARCODE:
2225 -1;
2226}
2227
2228Camera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum(
2229 const char *flashMode) {
2230 return
2231 !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
2232 Parameters::FLASH_MODE_OFF :
2233 !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
2234 Parameters::FLASH_MODE_AUTO :
2235 !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
2236 Parameters::FLASH_MODE_ON :
2237 !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
2238 Parameters::FLASH_MODE_RED_EYE :
2239 !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
2240 Parameters::FLASH_MODE_TORCH :
2241 Parameters::FLASH_MODE_INVALID;
2242}
2243
2244Camera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum(
2245 const char *focusMode) {
2246 return
2247 !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
2248 Parameters::FOCUS_MODE_AUTO :
2249 !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
2250 Parameters::FOCUS_MODE_INFINITY :
2251 !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
2252 Parameters::FOCUS_MODE_MACRO :
2253 !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
2254 Parameters::FOCUS_MODE_FIXED :
2255 !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
2256 Parameters::FOCUS_MODE_EDOF :
2257 !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
2258 Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
2259 !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
2260 Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
2261 Parameters::FOCUS_MODE_INVALID;
2262}
2263
2264status_t Camera2Client::parseAreas(const char *areasCStr,
2265 Vector<Parameters::Area> *areas) {
2266 static const size_t NUM_FIELDS = 5;
2267 areas->clear();
2268 if (areasCStr == NULL) {
2269 // If no key exists, use default (0,0,0,0,0)
2270 areas->push();
2271 return OK;
2272 }
2273 String8 areasStr(areasCStr);
2274 ssize_t areaStart = areasStr.find("(", 0) + 1;
2275 while (areaStart != 0) {
2276 const char* area = areasStr.string() + areaStart;
2277 char *numEnd;
2278 int vals[NUM_FIELDS];
2279 for (size_t i = 0; i < NUM_FIELDS; i++) {
2280 errno = 0;
2281 vals[i] = strtol(area, &numEnd, 10);
2282 if (errno || numEnd == area) return BAD_VALUE;
2283 area = numEnd + 1;
2284 }
2285 areas->push(Parameters::Area(
2286 vals[0], vals[1], vals[2], vals[3], vals[4]) );
2287 areaStart = areasStr.find("(", areaStart) + 1;
2288 }
2289 return OK;
2290}
2291
2292status_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas,
2293 size_t maxRegions) {
2294 // Definition of valid area can be found in
2295 // include/camera/CameraParameters.h
2296 if (areas.size() == 0) return BAD_VALUE;
2297 if (areas.size() == 1) {
2298 if (areas[0].left == 0 &&
2299 areas[0].top == 0 &&
2300 areas[0].right == 0 &&
2301 areas[0].bottom == 0 &&
2302 areas[0].weight == 0) {
2303 // Single (0,0,0,0,0) entry is always valid (== driver decides)
2304 return OK;
2305 }
2306 }
2307 if (areas.size() > maxRegions) {
2308 ALOGE("%s: Too many areas requested: %d",
2309 __FUNCTION__, areas.size());
2310 return BAD_VALUE;
2311 }
2312
2313 for (Vector<Parameters::Area>::const_iterator a = areas.begin();
2314 a != areas.end(); a++) {
2315 if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
2316 if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
2317 if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
2318 if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
2319 if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
2320 if (a->left >= a->right) return BAD_VALUE;
2321 if (a->top >= a->bottom) return BAD_VALUE;
2322 }
2323 return OK;
2324}
2325
2326bool Camera2Client::boolFromString(const char *boolStr) {
2327 return !boolStr ? false :
2328 !strcmp(boolStr, CameraParameters::TRUE) ? true :
2329 false;
2330}
2331
2332
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07002333} // namespace android