blob: 7f28c67804ad85230ab67be8180ec87f5b805f6b [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;
107 result.appendFormat("Client2[%d] (%p) PID: %d:\n",
108 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",
120 mParameters.previewFpsRangeMin, mParameters.previewFpsRangeMax);
121 result.appendFormat(" Preview HAL pixel format: 0x%x\n",
122 mParameters.previewFormat);
123 result.appendFormat(" Picture size: %d x %d\n",
124 mParameters.pictureWidth, mParameters.pictureHeight);
125 result.appendFormat(" Jpeg thumbnail size: %d x %d\n",
126 mParameters.jpegThumbWidth, mParameters.jpegThumbHeight);
127 result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n",
128 mParameters.jpegQuality, mParameters.jpegThumbQuality);
129 result.appendFormat(" Jpeg rotation: %d\n", mParameters.jpegRotation);
130 result.appendFormat(" GPS tags %s\n",
131 mParameters.gpsEnabled ? "enabled" : "disabled");
132 if (mParameters.gpsEnabled) {
133 result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n",
134 mParameters.gpsLatitude, mParameters.gpsLongitude,
135 mParameters.gpsAltitude);
136 result.appendFormat(" GPS timestamp: %lld\n",
137 mParameters.gpsTimestamp);
138 result.appendFormat(" GPS processing method: %s\n",
139 mParameters.gpsProcessingMethod.string());
140 }
141
142 result.append(" White balance mode: ");
143 switch (mParameters.wbMode) {
144 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
145 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
146 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
147 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
148 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
149 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
150 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
151 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
152 default: result.append("UNKNOWN\n");
153 }
154
155 result.append(" Effect mode: ");
156 switch (mParameters.effectMode) {
157 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
158 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
159 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
160 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
161 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
162 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
163 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
164 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
165 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
166 default: result.append("UNKNOWN\n");
167 }
168
169 result.append(" Antibanding mode: ");
170 switch (mParameters.antibandingMode) {
171 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
172 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
173 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
174 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
175 default: result.append("UNKNOWN\n");
176 }
177
178 result.append(" Scene mode: ");
179 switch (mParameters.sceneMode) {
180 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
181 result.append("AUTO\n"); break;
182 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
183 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
184 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
185 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
186 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
187 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
188 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
189 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
190 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
191 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
192 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
193 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
194 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
195 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
196 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
197 default: result.append("UNKNOWN\n");
198 }
199
200 result.append(" Flash mode: ");
201 switch (mParameters.flashMode) {
202 CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
203 CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
204 CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
205 CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
206 CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
207 CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
208 default: result.append("UNKNOWN\n");
209 }
210
211 result.append(" Focus mode: ");
212 switch (mParameters.focusMode) {
213 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
214 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
215 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
216 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
217 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
218 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
219 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
220 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
221 default: result.append("UNKNOWN\n");
222 }
223
224 result.append(" Focusing areas:\n");
225 for (size_t i = 0; i < mParameters.focusingAreas.size(); i++) {
226 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
227 mParameters.focusingAreas[i].left,
228 mParameters.focusingAreas[i].top,
229 mParameters.focusingAreas[i].right,
230 mParameters.focusingAreas[i].bottom,
231 mParameters.focusingAreas[i].weight);
232 }
233
234 result.appendFormat(" Exposure compensation index: %d\n",
235 mParameters.exposureCompensation);
236
237 result.appendFormat(" AE lock %s, AWB lock %s\n",
238 mParameters.autoExposureLock ? "enabled" : "disabled",
239 mParameters.autoWhiteBalanceLock ? "enabled" : "disabled" );
240
241 result.appendFormat(" Metering areas:\n");
242 for (size_t i = 0; i < mParameters.meteringAreas.size(); i++) {
243 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
244 mParameters.meteringAreas[i].left,
245 mParameters.meteringAreas[i].top,
246 mParameters.meteringAreas[i].right,
247 mParameters.meteringAreas[i].bottom,
248 mParameters.meteringAreas[i].weight);
249 }
250
251 result.appendFormat(" Zoom index: %d\n", mParameters.zoom);
252 result.appendFormat(" Video size: %d x %d\n", mParameters.videoWidth,
253 mParameters.videoHeight);
254
255 result.appendFormat(" Recording hint is %s\n",
256 mParameters.recordingHint ? "set" : "not set");
257
258 result.appendFormat(" Video stabilization is %s\n",
259 mParameters.videoStabilization ? "enabled" : "disabled");
260
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700261 write(fd, result.string(), result.size());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700262
263 // TODO: Dump Camera2Device
264
265#undef CASE_APPEND_ENUM
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700266 return NO_ERROR;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700267}
268
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700269const char* Camera2Client::getStateName(State state) {
270#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
271 switch(state) {
272 CASE_ENUM_TO_CHAR(NOT_INITIALIZED)
273 CASE_ENUM_TO_CHAR(STOPPED)
274 CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
275 CASE_ENUM_TO_CHAR(PREVIEW)
276 CASE_ENUM_TO_CHAR(RECORD)
277 CASE_ENUM_TO_CHAR(STILL_CAPTURE)
278 CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
279 default:
280 return "Unknown state!";
281 break;
282 }
283#undef CASE_ENUM_TO_CHAR
284}
285
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700286// ICamera interface
287
288void Camera2Client::disconnect() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700289 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700290 Mutex::Autolock icl(mICameraLock);
291
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700292 if (mDevice == 0) return;
293
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700294 stopPreviewLocked();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700295
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700296 mDevice->waitUntilDrained();
297
298 if (mPreviewStreamId != NO_STREAM) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700299 mDevice->deleteStream(mPreviewStreamId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700300 mPreviewStreamId = NO_STREAM;
301 }
302
303 if (mCaptureStreamId != NO_STREAM) {
304 mDevice->deleteStream(mCaptureStreamId);
305 mCaptureStreamId = NO_STREAM;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700306 }
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700307
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700308 CameraService::Client::disconnect();
309}
310
311status_t Camera2Client::connect(const sp<ICameraClient>& client) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700312 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700313 Mutex::Autolock icl(mICameraLock);
314
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700315 return BAD_VALUE;
316}
317
318status_t Camera2Client::lock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700319 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700320 Mutex::Autolock icl(mICameraLock);
321
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700322 return BAD_VALUE;
323}
324
325status_t Camera2Client::unlock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700326 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700327 Mutex::Autolock icl(mICameraLock);
328
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700329 return BAD_VALUE;
330}
331
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700332status_t Camera2Client::setPreviewDisplay(
333 const sp<Surface>& surface) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700334 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700335 Mutex::Autolock icl(mICameraLock);
336
337 if (mState >= PREVIEW) return INVALID_OPERATION;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700338
339 sp<IBinder> binder;
340 sp<ANativeWindow> window;
341 if (surface != 0) {
342 binder = surface->asBinder();
343 window = surface;
344 }
345
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700346 return setPreviewWindowLocked(binder,window);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700347}
348
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700349status_t Camera2Client::setPreviewTexture(
350 const sp<ISurfaceTexture>& surfaceTexture) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700351 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700352 Mutex::Autolock icl(mICameraLock);
353
354 if (mState >= PREVIEW) return INVALID_OPERATION;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700355
356 sp<IBinder> binder;
357 sp<ANativeWindow> window;
358 if (surfaceTexture != 0) {
359 binder = surfaceTexture->asBinder();
360 window = new SurfaceTextureClient(surfaceTexture);
361 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700362 return setPreviewWindowLocked(binder, window);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700363}
364
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700365status_t Camera2Client::setPreviewWindowLocked(const sp<IBinder>& binder,
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700366 const sp<ANativeWindow>& window) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700367 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700368 status_t res;
369
370 if (binder == mPreviewSurface) {
371 return NO_ERROR;
372 }
373
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700374 // TODO: Should wait until HAL has no remaining requests
375
376 if (mPreviewStreamId != NO_STREAM) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700377 res = mDevice->deleteStream(mPreviewStreamId);
378 if (res != OK) {
379 return res;
380 }
381 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700382 res = mDevice->createStream(window,
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700383 mParameters.previewWidth, mParameters.previewHeight,
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700384 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700385 &mPreviewStreamId);
386 if (res != OK) {
387 return res;
388 }
389
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700390 mPreviewSurface = binder;
391
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700392 if (mState == WAITING_FOR_PREVIEW_WINDOW) {
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700393 return startPreviewLocked();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700394 }
395
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700396 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700397}
398
399void Camera2Client::setPreviewCallbackFlag(int flag) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700400 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700401 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700402}
403
404status_t Camera2Client::startPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700405 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700406 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700407 return startPreviewLocked();
408}
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700409
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700410status_t Camera2Client::startPreviewLocked() {
411 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700412 status_t res;
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700413 if (mState >= PREVIEW) {
414 ALOGE("%s: Can't start preview in state %s",
415 __FUNCTION__, getStateName(mState));
416 return INVALID_OPERATION;
417 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700418
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700419 if (mPreviewStreamId == NO_STREAM) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700420 mState = WAITING_FOR_PREVIEW_WINDOW;
421 return OK;
422 }
423
424 if (mPreviewRequest == NULL) {
425 updatePreviewRequest();
426 }
427
428 uint8_t outputStream = mPreviewStreamId;
429
430 camera_metadata_entry_t outputStreams;
431 res = find_camera_metadata_entry(mPreviewRequest,
432 ANDROID_REQUEST_OUTPUT_STREAMS,
433 &outputStreams);
434 if (res == NAME_NOT_FOUND) {
435 res = add_camera_metadata_entry(mPreviewRequest,
436 ANDROID_REQUEST_OUTPUT_STREAMS,
437 &outputStream, 1);
438 } else if (res == OK) {
439 res = update_camera_metadata_entry(mPreviewRequest,
440 outputStreams.index, &outputStream, 1, NULL);
441 }
442
443 if (res != OK) {
444 ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
445 __FUNCTION__, mCameraId, strerror(-res), res);
446 mState = STOPPED;
447 return res;
448 }
449
450 res = mDevice->setStreamingRequest(mPreviewRequest);
451 if (res != OK) {
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700452 ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
453 "%s (%d)",
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700454 __FUNCTION__, mCameraId, strerror(-res), res);
455 mState = STOPPED;
456 return res;
457 }
458 mState = PREVIEW;
459
460 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700461}
462
463void Camera2Client::stopPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700464 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700465 Mutex::Autolock icl(mICameraLock);
466 stopPreviewLocked();
467}
468
469void Camera2Client::stopPreviewLocked() {
470 ATRACE_CALL();
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700471 switch (mState) {
472 case NOT_INITIALIZED:
473 ALOGE("%s: Camera %d: Call before initialized",
474 __FUNCTION__, mCameraId);
475 break;
476 case STOPPED:
477 break;
478 case STILL_CAPTURE:
479 ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
480 __FUNCTION__, mCameraId);
481 break;
482 case RECORD:
483 // TODO: Handle record stop here
484 case PREVIEW:
485 mDevice->setStreamingRequest(NULL);
486 case WAITING_FOR_PREVIEW_WINDOW:
487 mState = STOPPED;
488 break;
489 default:
490 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
491 mState);
492 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700493}
494
495bool Camera2Client::previewEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700496 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700497 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700498 return mState == PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700499}
500
501status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700502 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700503 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700504 return BAD_VALUE;
505}
506
507status_t Camera2Client::startRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700508 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700509 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700510 return BAD_VALUE;
511}
512
513void Camera2Client::stopRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700514 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700515 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700516}
517
518bool Camera2Client::recordingEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700519 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700520 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700521 return BAD_VALUE;
522}
523
524void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700525 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700526 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700527}
528
529status_t Camera2Client::autoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700530 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700531 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700532 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700533}
534
535status_t Camera2Client::cancelAutoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700536 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700537 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700538 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700539}
540
541status_t Camera2Client::takePicture(int msgType) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700542 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700543 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700544 status_t res;
545
546 switch (mState) {
547 case NOT_INITIALIZED:
548 case STOPPED:
549 case WAITING_FOR_PREVIEW_WINDOW:
550 ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
551 __FUNCTION__, mCameraId);
552 return INVALID_OPERATION;
553 case PREVIEW:
554 case RECORD:
555 // Good to go for takePicture
556 break;
557 case STILL_CAPTURE:
558 case VIDEO_SNAPSHOT:
559 ALOGE("%s: Camera %d: Already taking a picture",
560 __FUNCTION__, mCameraId);
561 return INVALID_OPERATION;
562 }
563
564 Mutex::Autolock pl(mParamsLock);
565
566 res = updateCaptureStream();
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700567 if (res != OK) {
568 ALOGE("%s: Can't set up still image stream: %s (%d)",
569 __FUNCTION__, strerror(-res), res);
570 return res;
571 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700572
573 if (mCaptureRequest == NULL) {
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700574 res = updateCaptureRequest();
575 if (res != OK) {
576 ALOGE("%s: Can't set up still image capture request: %s (%d)",
577 __FUNCTION__, strerror(-res), res);
578 return res;
579 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700580 }
581
582 // TODO: For video snapshot, need 3 streams here
583 camera_metadata_entry_t outputStreams;
584 uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId };
585 res = find_camera_metadata_entry(mCaptureRequest,
586 ANDROID_REQUEST_OUTPUT_STREAMS,
587 &outputStreams);
588 if (res == NAME_NOT_FOUND) {
589 res = add_camera_metadata_entry(mCaptureRequest,
590 ANDROID_REQUEST_OUTPUT_STREAMS,
591 streamIds, 2);
592 } else if (res == OK) {
593 res = update_camera_metadata_entry(mCaptureRequest,
594 outputStreams.index, streamIds, 2, NULL);
595 }
596
597 if (res != OK) {
598 ALOGE("%s: Camera %d: Unable to set up still image capture request: "
599 "%s (%d)",
600 __FUNCTION__, mCameraId, strerror(-res), res);
601 return res;
602 }
603
604 camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest);
605 if (captureCopy == NULL) {
606 ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
607 __FUNCTION__, mCameraId);
608 return NO_MEMORY;
609 }
610
611 if (mState == PREVIEW) {
612 res = mDevice->setStreamingRequest(NULL);
613 if (res != OK) {
614 ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
615 "%s (%d)",
616 __FUNCTION__, mCameraId, strerror(-res), res);
617 return res;
618 }
619 }
620
621 res = mDevice->capture(captureCopy);
622 if (res != OK) {
623 ALOGE("%s: Camera %d: Unable to submit still image capture request: "
624 "%s (%d)",
625 __FUNCTION__, mCameraId, strerror(-res), res);
626 return res;
627 }
628
629 switch (mState) {
630 case PREVIEW:
631 mState = STILL_CAPTURE;
632 break;
633 case RECORD:
634 mState = VIDEO_SNAPSHOT;
635 break;
636 default:
637 ALOGE("%s: Camera %d: Unknown state for still capture!",
638 __FUNCTION__, mCameraId);
639 return INVALID_OPERATION;
640 }
641
642 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700643}
644
645status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700646 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700647 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700648 Mutex::Autolock pl(mParamsLock);
649 status_t res;
650
651 CameraParameters newParams(params);
652
653 // TODO: Currently ignoring any changes to supposedly read-only
654 // parameters such as supported preview sizes, etc. Should probably
655 // produce an error if they're changed.
656
657 /** Extract and verify new parameters */
658
659 size_t i;
660
661 // PREVIEW_SIZE
662 int previewWidth, previewHeight;
663 newParams.getPreviewSize(&previewWidth, &previewHeight);
664
665 if (previewWidth != mParameters.previewWidth ||
666 previewHeight != mParameters.previewHeight) {
667 if (mState >= PREVIEW) {
668 ALOGE("%s: Preview size cannot be updated when preview "
669 "is active!", __FUNCTION__);
670 return BAD_VALUE;
671 }
672 camera_metadata_entry_t availablePreviewSizes =
673 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
674 for (i = 0; i < availablePreviewSizes.count; i += 2 ) {
675 if (availablePreviewSizes.data.i32[i] == previewWidth &&
676 availablePreviewSizes.data.i32[i+1] == previewHeight) break;
677 }
678 if (i == availablePreviewSizes.count) {
679 ALOGE("%s: Requested preview size %d x %d is not supported",
680 __FUNCTION__, previewWidth, previewHeight);
681 return BAD_VALUE;
682 }
683 }
684
685 // PREVIEW_FPS_RANGE
686 int previewFpsRangeMin, previewFpsRangeMax, previewFps = 0;
687 bool fpsRangeChanged = false;
688 newParams.getPreviewFpsRange(&previewFpsRangeMin, &previewFpsRangeMax);
689 if (previewFpsRangeMin != mParameters.previewFpsRangeMin ||
690 previewFpsRangeMax != mParameters.previewFpsRangeMax) {
691 fpsRangeChanged = true;
692 camera_metadata_entry_t availablePreviewFpsRanges =
693 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
694 for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
695 if ((availablePreviewFpsRanges.data.i32[i] ==
696 previewFpsRangeMin) &&
697 (availablePreviewFpsRanges.data.i32[i+1] ==
698 previewFpsRangeMax) ) {
699 break;
700 }
701 }
702 if (i == availablePreviewFpsRanges.count) {
703 ALOGE("%s: Requested preview FPS range %d - %d is not supported",
704 __FUNCTION__, previewFpsRangeMin, previewFpsRangeMax);
705 return BAD_VALUE;
706 }
707 previewFps = previewFpsRangeMin;
708 }
709
710 // PREVIEW_FORMAT
711 int previewFormat = formatStringToEnum(newParams.getPreviewFormat());
712 if (previewFormat != mParameters.previewFormat) {
713 if (mState >= PREVIEW) {
714 ALOGE("%s: Preview format cannot be updated when preview "
715 "is active!", __FUNCTION__);
716 return BAD_VALUE;
717 }
718 camera_metadata_entry_t availableFormats =
719 staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
720 for (i = 0; i < availableFormats.count; i++) {
721 if (availableFormats.data.i32[i] == previewFormat) break;
722 }
723 if (i == availableFormats.count) {
724 ALOGE("%s: Requested preview format %s (0x%x) is not supported",
725 __FUNCTION__, newParams.getPreviewFormat(), previewFormat);
726 return BAD_VALUE;
727 }
728 }
729
730 // PREVIEW_FRAME_RATE
731 // Deprecated, only use if the preview fps range is unchanged this time.
732 // The single-value FPS is the same as the minimum of the range.
733 if (!fpsRangeChanged) {
734 previewFps = newParams.getPreviewFrameRate();
735 if (previewFps != mParameters.previewFps) {
736 camera_metadata_entry_t availableFrameRates =
737 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
738 for (i = 0; i < availableFrameRates.count; i+=2) {
739 if (availableFrameRates.data.i32[i] == previewFps) break;
740 }
741 if (i == availableFrameRates.count) {
742 ALOGE("%s: Requested preview frame rate %d is not supported",
743 __FUNCTION__, previewFps);
744 return BAD_VALUE;
745 }
746 previewFpsRangeMin = availableFrameRates.data.i32[i];
747 previewFpsRangeMax = availableFrameRates.data.i32[i+1];
748 }
749 }
750
751 // PICTURE_SIZE
752 int pictureWidth, pictureHeight;
753 newParams.getPictureSize(&pictureWidth, &pictureHeight);
754 if (pictureWidth == mParameters.pictureWidth ||
755 pictureHeight == mParameters.pictureHeight) {
756 camera_metadata_entry_t availablePictureSizes =
757 staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
758 for (i = 0; i < availablePictureSizes.count; i+=2) {
759 if (availablePictureSizes.data.i32[i] == pictureWidth &&
760 availablePictureSizes.data.i32[i+1] == pictureHeight) break;
761 }
762 if (i == availablePictureSizes.count) {
763 ALOGE("%s: Requested picture size %d x %d is not supported",
764 __FUNCTION__, pictureWidth, pictureHeight);
765 return BAD_VALUE;
766 }
767 }
768
769 // JPEG_THUMBNAIL_WIDTH/HEIGHT
770 int jpegThumbWidth, jpegThumbHeight;
771 jpegThumbWidth =
772 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
773 jpegThumbHeight =
774 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
775 if (jpegThumbWidth != mParameters.jpegThumbWidth ||
776 jpegThumbHeight != mParameters.jpegThumbHeight) {
777 camera_metadata_entry_t availableJpegThumbSizes =
778 staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
779 for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
780 if (availableJpegThumbSizes.data.i32[i] == jpegThumbWidth &&
781 availableJpegThumbSizes.data.i32[i+1] == jpegThumbHeight) {
782 break;
783 }
784 }
785 if (i == availableJpegThumbSizes.count) {
786 ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
787 __FUNCTION__, jpegThumbWidth, jpegThumbHeight);
788 return BAD_VALUE;
789 }
790 }
791
792 // JPEG_THUMBNAIL_QUALITY
793 int jpegThumbQuality =
794 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
795 if (jpegThumbQuality < 0 || jpegThumbQuality > 100) {
796 ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
797 __FUNCTION__, jpegThumbQuality);
798 return BAD_VALUE;
799 }
800
801 // JPEG_QUALITY
802 int jpegQuality =
803 newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
804 if (jpegQuality < 0 || jpegQuality > 100) {
805 ALOGE("%s: Requested JPEG quality %d is not supported",
806 __FUNCTION__, jpegQuality);
807 return BAD_VALUE;
808 }
809
810 // ROTATION
811 int jpegRotation =
812 newParams.getInt(CameraParameters::KEY_ROTATION);
813 if (jpegRotation != 0 &&
814 jpegRotation != 90 &&
815 jpegRotation != 180 &&
816 jpegRotation != 270) {
817 ALOGE("%s: Requested picture rotation angle %d is not supported",
818 __FUNCTION__, jpegRotation);
819 return BAD_VALUE;
820 }
821
822 // GPS
823 bool gpsEnabled = false;
824 double gpsLatitude = 0, gpsLongitude = 0, gpsAltitude = 0;
825 int64_t gpsTimestamp = 0;
826 String8 gpsProcessingMethod;
827 const char *gpsLatStr =
828 newParams.get(CameraParameters::KEY_GPS_LATITUDE);
829 if (gpsLatStr != NULL) {
830 const char *gpsLongStr =
831 newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
832 const char *gpsAltitudeStr =
833 newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
834 const char *gpsTimeStr =
835 newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
836 const char *gpsProcMethodStr =
837 newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
838 if (gpsLongStr == NULL ||
839 gpsAltitudeStr == NULL ||
840 gpsTimeStr == NULL ||
841 gpsProcMethodStr == NULL) {
842 ALOGE("%s: Incomplete set of GPS parameters provided",
843 __FUNCTION__);
844 return BAD_VALUE;
845 }
846 char *endPtr;
847 errno = 0;
848 gpsLatitude = strtod(gpsLatStr, &endPtr);
849 if (errno || endPtr == gpsLatStr) {
850 ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
851 return BAD_VALUE;
852 }
853 errno = 0;
854 gpsLongitude = strtod(gpsLongStr, &endPtr);
855 if (errno || endPtr == gpsLongStr) {
856 ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
857 return BAD_VALUE;
858 }
859 errno = 0;
860 gpsAltitude = strtod(gpsAltitudeStr, &endPtr);
861 if (errno || endPtr == gpsAltitudeStr) {
862 ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
863 gpsAltitudeStr);
864 return BAD_VALUE;
865 }
866 errno = 0;
867 gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
868 if (errno || endPtr == gpsTimeStr) {
869 ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
870 return BAD_VALUE;
871 }
872 gpsProcessingMethod = gpsProcMethodStr;
873
874 gpsEnabled = true;
875 }
876
877 // WHITE_BALANCE
878 int wbMode = wbModeStringToEnum(
879 newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
880 if (wbMode != mParameters.wbMode) {
881 camera_metadata_entry_t availableWbModes =
882 staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
883 for (i = 0; i < availableWbModes.count; i++) {
884 if (wbMode == availableWbModes.data.u8[i]) break;
885 }
886 if (i == availableWbModes.count) {
887 ALOGE("%s: Requested white balance mode %s is not supported",
888 __FUNCTION__,
889 newParams.get(CameraParameters::KEY_WHITE_BALANCE));
890 return BAD_VALUE;
891 }
892 }
893
894 // EFFECT
895 int effectMode = effectModeStringToEnum(
896 newParams.get(CameraParameters::KEY_EFFECT) );
897 if (effectMode != mParameters.effectMode) {
898 camera_metadata_entry_t availableEffectModes =
899 staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
900 for (i = 0; i < availableEffectModes.count; i++) {
901 if (effectMode == availableEffectModes.data.u8[i]) break;
902 }
903 if (i == availableEffectModes.count) {
904 ALOGE("%s: Requested effect mode \"%s\" is not supported",
905 __FUNCTION__,
906 newParams.get(CameraParameters::KEY_EFFECT) );
907 return BAD_VALUE;
908 }
909 }
910
911 // ANTIBANDING
912 int antibandingMode = abModeStringToEnum(
913 newParams.get(CameraParameters::KEY_ANTIBANDING) );
914 if (antibandingMode != mParameters.antibandingMode) {
915 camera_metadata_entry_t availableAbModes =
916 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
917 for (i = 0; i < availableAbModes.count; i++) {
918 if (antibandingMode == availableAbModes.data.u8[i]) break;
919 }
920 if (i == availableAbModes.count) {
921 ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
922 __FUNCTION__,
923 newParams.get(CameraParameters::KEY_ANTIBANDING));
924 return BAD_VALUE;
925 }
926 }
927
928 // SCENE_MODE
929 int sceneMode = sceneModeStringToEnum(
930 newParams.get(CameraParameters::KEY_SCENE_MODE) );
931 if (sceneMode != mParameters.sceneMode) {
932 camera_metadata_entry_t availableSceneModes =
933 staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
934 for (i = 0; i < availableSceneModes.count; i++) {
935 if (sceneMode == availableSceneModes.data.u8[i]) break;
936 }
937 if (i == availableSceneModes.count) {
938 ALOGE("%s: Requested scene mode \"%s\" is not supported",
939 __FUNCTION__,
940 newParams.get(CameraParameters::KEY_SCENE_MODE));
941 return BAD_VALUE;
942 }
943 }
944
945 // FLASH_MODE
946 Parameters::flashMode_t flashMode = flashModeStringToEnum(
947 newParams.get(CameraParameters::KEY_FLASH_MODE) );
948 if (flashMode != mParameters.flashMode) {
949 camera_metadata_entry_t flashAvailable =
950 staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
951 if (!flashAvailable.data.u8[0] &&
952 flashMode != Parameters::FLASH_MODE_OFF) {
953 ALOGE("%s: Requested flash mode \"%s\" is not supported: "
954 "No flash on device", __FUNCTION__,
955 newParams.get(CameraParameters::KEY_FLASH_MODE));
956 return BAD_VALUE;
957 } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) {
958 camera_metadata_entry_t availableAeModes =
959 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
960 for (i = 0; i < availableAeModes.count; i++) {
961 if (flashMode == availableAeModes.data.u8[i]) break;
962 }
963 if (i == availableAeModes.count) {
964 ALOGE("%s: Requested flash mode \"%s\" is not supported",
965 __FUNCTION__,
966 newParams.get(CameraParameters::KEY_FLASH_MODE));
967 return BAD_VALUE;
968 }
969 } else if (flashMode == -1) {
970 ALOGE("%s: Requested flash mode \"%s\" is unknown",
971 __FUNCTION__,
972 newParams.get(CameraParameters::KEY_FLASH_MODE));
973 return BAD_VALUE;
974 }
975 }
976
977 // FOCUS_MODE
978 Parameters::focusMode_t focusMode = focusModeStringToEnum(
979 newParams.get(CameraParameters::KEY_FOCUS_MODE));
980 if (focusMode != mParameters.focusMode) {
981 if (focusMode != Parameters::FOCUS_MODE_FIXED) {
982 camera_metadata_entry_t minFocusDistance =
983 staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE);
984 if (minFocusDistance.data.f[0] == 0) {
985 ALOGE("%s: Requested focus mode \"%s\" is not available: "
986 "fixed focus lens",
987 __FUNCTION__,
988 newParams.get(CameraParameters::KEY_FOCUS_MODE));
989 return BAD_VALUE;
990 } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) {
991 camera_metadata_entry_t availableFocusModes =
992 staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
993 for (i = 0; i < availableFocusModes.count; i++) {
994 if (focusMode == availableFocusModes.data.u8[i]) break;
995 }
996 if (i == availableFocusModes.count) {
997 ALOGE("%s: Requested focus mode \"%s\" is not supported",
998 __FUNCTION__,
999 newParams.get(CameraParameters::KEY_FOCUS_MODE));
1000 return BAD_VALUE;
1001 }
1002 }
1003 }
1004 }
1005
1006 // FOCUS_AREAS
1007 Vector<Parameters::Area> focusingAreas;
1008 res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
1009 &focusingAreas);
1010 size_t max3aRegions =
1011 (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0];
1012 if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
1013 if (res != OK) {
1014 ALOGE("%s: Requested focus areas are malformed: %s",
1015 __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
1016 return BAD_VALUE;
1017 }
1018
1019 // EXPOSURE_COMPENSATION
1020 int exposureCompensation =
1021 newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
1022 camera_metadata_entry_t exposureCompensationRange =
1023 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE);
1024 if (exposureCompensation < exposureCompensationRange.data.i32[0] ||
1025 exposureCompensation > exposureCompensationRange.data.i32[1]) {
1026 ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
1027 __FUNCTION__, exposureCompensation);
1028 return BAD_VALUE;
1029 }
1030
1031 // AUTO_EXPOSURE_LOCK (always supported)
1032 bool autoExposureLock = boolFromString(
1033 newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
1034
1035 // AUTO_WHITEBALANCE_LOCK (always supported)
1036 bool autoWhiteBalanceLock = boolFromString(
1037 newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
1038
1039 // METERING_AREAS
1040 Vector<Parameters::Area> meteringAreas;
1041 res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
1042 &meteringAreas);
1043 if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
1044 if (res != OK) {
1045 ALOGE("%s: Requested metering areas are malformed: %s",
1046 __FUNCTION__,
1047 newParams.get(CameraParameters::KEY_METERING_AREAS));
1048 return BAD_VALUE;
1049 }
1050
1051 // ZOOM
1052 int zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
1053 if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) {
1054 ALOGE("%s: Requested zoom level %d is not supported",
1055 __FUNCTION__, zoom);
1056 return BAD_VALUE;
1057 }
1058
1059 // VIDEO_SIZE
1060 int videoWidth, videoHeight;
1061 newParams.getVideoSize(&videoWidth, &videoHeight);
1062 if (videoWidth != mParameters.videoWidth ||
1063 videoHeight != mParameters.videoHeight) {
1064 if (mState == RECORD) {
1065 ALOGE("%s: Video size cannot be updated when recording is active!",
1066 __FUNCTION__);
1067 return BAD_VALUE;
1068 }
1069 camera_metadata_entry_t availableVideoSizes =
1070 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
1071 for (i = 0; i < availableVideoSizes.count; i += 2 ) {
1072 if (availableVideoSizes.data.i32[i] == videoWidth &&
1073 availableVideoSizes.data.i32[i+1] == videoHeight) break;
1074 }
1075 if (i == availableVideoSizes.count) {
1076 ALOGE("%s: Requested video size %d x %d is not supported",
1077 __FUNCTION__, videoWidth, videoHeight);
1078 return BAD_VALUE;
1079 }
1080 }
1081
1082 // RECORDING_HINT (always supported)
1083 bool recordingHint = boolFromString(
1084 newParams.get(CameraParameters::KEY_RECORDING_HINT) );
1085
1086 // VIDEO_STABILIZATION
1087 bool videoStabilization = boolFromString(
1088 newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
1089 camera_metadata_entry_t availableVideoStabilizationModes =
1090 staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
1091 if (videoStabilization && availableVideoStabilizationModes.count == 1) {
1092 ALOGE("%s: Video stabilization not supported", __FUNCTION__);
1093 }
1094
1095 /** Update internal parameters */
1096 mParameters.previewWidth = previewWidth;
1097 mParameters.previewHeight = previewHeight;
1098 mParameters.previewFpsRangeMin = previewFpsRangeMin;
1099 mParameters.previewFpsRangeMax = previewFpsRangeMax;
1100 mParameters.previewFps = previewFps;
1101 mParameters.previewFormat = previewFormat;
1102
1103 mParameters.pictureWidth = pictureWidth;
1104 mParameters.pictureHeight = pictureHeight;
1105
1106 mParameters.jpegThumbWidth = jpegThumbWidth;
1107 mParameters.jpegThumbHeight = jpegThumbHeight;
1108 mParameters.jpegQuality = jpegQuality;
1109 mParameters.jpegThumbQuality = jpegThumbQuality;
1110
1111 mParameters.gpsEnabled = gpsEnabled;
1112 mParameters.gpsLatitude = gpsLatitude;
1113 mParameters.gpsLongitude = gpsLongitude;
1114 mParameters.gpsAltitude = gpsAltitude;
1115 mParameters.gpsTimestamp = gpsTimestamp;
1116 mParameters.gpsProcessingMethod = gpsProcessingMethod;
1117
1118 mParameters.wbMode = wbMode;
1119 mParameters.effectMode = effectMode;
1120 mParameters.antibandingMode = antibandingMode;
1121 mParameters.sceneMode = sceneMode;
1122
1123 mParameters.flashMode = flashMode;
1124 mParameters.focusMode = focusMode;
1125
1126 mParameters.focusingAreas = focusingAreas;
1127 mParameters.exposureCompensation = exposureCompensation;
1128 mParameters.autoExposureLock = autoExposureLock;
1129 mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock;
1130 mParameters.meteringAreas = meteringAreas;
1131 mParameters.zoom = zoom;
1132
1133 mParameters.videoWidth = videoWidth;
1134 mParameters.videoHeight = videoHeight;
1135
1136 mParameters.recordingHint = recordingHint;
1137 mParameters.videoStabilization = videoStabilization;
1138
1139 updatePreviewRequest();
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001140 updateCaptureRequest();
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001141
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001142 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001143}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001144
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001145String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001146 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001147 Mutex::Autolock icl(mICameraLock);
1148
1149 Mutex::Autolock pl(mParamsLock);
1150
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001151 // TODO: Deal with focus distances
1152 return mParamsFlattened;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001153}
1154
1155status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001156 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001157 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001158 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001159}
1160
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001161/** Device-related methods */
1162
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001163void Camera2Client::onCaptureAvailable() {
1164 ATRACE_CALL();
1165 status_t res;
1166 sp<ICameraClient> currentClient;
1167 CpuConsumer::LockedBuffer imgBuffer;
1168 {
1169 Mutex::Autolock icl(mICameraLock);
1170
1171 // TODO: Signal errors here upstream
1172 if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) {
1173 ALOGE("%s: Camera %d: Still image produced unexpectedly!",
1174 __FUNCTION__, mCameraId);
1175 return;
1176 }
1177
1178 res = mCaptureConsumer->lockNextBuffer(&imgBuffer);
1179 if (res != OK) {
1180 ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)",
1181 __FUNCTION__, mCameraId, strerror(-res), res);
1182 return;
1183 }
1184
1185 if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) {
1186 ALOGE("%s: Camera %d: Unexpected format for still image: "
1187 "%x, expected %x", __FUNCTION__, mCameraId,
1188 imgBuffer.format,
1189 HAL_PIXEL_FORMAT_BLOB);
1190 mCaptureConsumer->unlockBuffer(imgBuffer);
1191 return;
1192 }
1193
1194 // TODO: Optimize this to avoid memcopy
1195 void* captureMemory = mCaptureHeap->getBase();
1196 size_t size = mCaptureHeap->getSize();
1197 memcpy(captureMemory, imgBuffer.data, size);
1198
1199 mCaptureConsumer->unlockBuffer(imgBuffer);
1200
1201 currentClient = mCameraClient;
1202 switch (mState) {
1203 case STILL_CAPTURE:
1204 mState = STOPPED;
1205 break;
1206 case VIDEO_SNAPSHOT:
1207 mState = RECORD;
1208 break;
1209 default:
1210 ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__,
1211 mCameraId, mState);
1212 break;
1213 }
1214 }
1215 // Call outside mICameraLock to allow re-entrancy from notification
1216 if (currentClient != 0) {
1217 currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
1218 mCaptureMemory, NULL);
1219 }
1220}
1221
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001222camera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag,
1223 size_t minCount, size_t maxCount) {
1224 status_t res;
1225 camera_metadata_entry_t entry;
1226 res = find_camera_metadata_entry(mDevice->info(),
1227 tag,
1228 &entry);
1229 if (CC_UNLIKELY( res != OK )) {
1230 const char* tagSection = get_camera_metadata_section_name(tag);
1231 if (tagSection == NULL) tagSection = "<unknown>";
1232 const char* tagName = get_camera_metadata_tag_name(tag);
1233 if (tagName == NULL) tagName = "<unknown>";
1234
1235 ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)",
1236 tagSection, tagName, tag, strerror(-res), res);
1237 entry.count = 0;
1238 entry.data.u8 = NULL;
1239 } else if (CC_UNLIKELY(
1240 (minCount != 0 && entry.count < minCount) ||
1241 (maxCount != 0 && entry.count > maxCount) ) ) {
1242 const char* tagSection = get_camera_metadata_section_name(tag);
1243 if (tagSection == NULL) tagSection = "<unknown>";
1244 const char* tagName = get_camera_metadata_tag_name(tag);
1245 if (tagName == NULL) tagName = "<unknown>";
1246 ALOGE("Malformed static metadata entry '%s.%s' (%x):"
1247 "Expected between %d and %d values, but got %d values",
1248 tagSection, tagName, tag, minCount, maxCount, entry.count);
1249 entry.count = 0;
1250 entry.data.u8 = NULL;
1251 }
1252
1253 return entry;
1254}
1255
1256/** Utility methods */
1257
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001258
1259status_t Camera2Client::buildDefaultParameters() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001260 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001261 Mutex::Autolock pl(mParamsLock);
1262
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001263 status_t res;
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001264 CameraParameters params;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001265
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001266 camera_metadata_entry_t availableProcessedSizes =
1267 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
1268 if (!availableProcessedSizes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001269
1270 // TODO: Pick more intelligently
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001271 mParameters.previewWidth = availableProcessedSizes.data.i32[0];
1272 mParameters.previewHeight = availableProcessedSizes.data.i32[1];
1273 mParameters.videoWidth = mParameters.previewWidth;
1274 mParameters.videoHeight = mParameters.previewHeight;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001275
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001276 params.setPreviewSize(mParameters.previewWidth, mParameters.previewHeight);
1277 params.setVideoSize(mParameters.videoWidth, mParameters.videoHeight);
1278 params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
1279 String8::format("%dx%d",
1280 mParameters.previewWidth, mParameters.previewHeight));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001281 {
1282 String8 supportedPreviewSizes;
1283 for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
1284 if (i != 0) supportedPreviewSizes += ",";
1285 supportedPreviewSizes += String8::format("%dx%d",
1286 availableProcessedSizes.data.i32[i],
1287 availableProcessedSizes.data.i32[i+1]);
1288 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001289 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001290 supportedPreviewSizes);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001291 params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001292 supportedPreviewSizes);
1293 }
1294
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001295 camera_metadata_entry_t availableFpsRanges =
1296 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
1297 if (!availableFpsRanges.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001298
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001299 mParameters.previewFpsRangeMin = availableFpsRanges.data.i32[0];
1300 mParameters.previewFpsRangeMax = availableFpsRanges.data.i32[1];
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001301
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001302 params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
1303 String8::format("%d,%d",
1304 mParameters.previewFpsRangeMin,
1305 mParameters.previewFpsRangeMax));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001306
1307 {
1308 String8 supportedPreviewFpsRange;
1309 for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1310 if (i != 0) supportedPreviewFpsRange += ",";
1311 supportedPreviewFpsRange += String8::format("(%d,%d)",
1312 availableFpsRanges.data.i32[i],
1313 availableFpsRanges.data.i32[i+1]);
1314 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001315 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001316 supportedPreviewFpsRange);
1317 }
1318
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001319 mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1320 params.set(CameraParameters::KEY_PREVIEW_FORMAT,
1321 formatEnumToString(mParameters.previewFormat)); // NV21
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001322
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001323 camera_metadata_entry_t availableFormats =
1324 staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
1325
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001326 {
1327 String8 supportedPreviewFormats;
1328 bool addComma = false;
1329 for (size_t i=0; i < availableFormats.count; i++) {
1330 if (addComma) supportedPreviewFormats += ",";
1331 addComma = true;
1332 switch (availableFormats.data.i32[i]) {
1333 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001334 supportedPreviewFormats +=
1335 CameraParameters::PIXEL_FORMAT_YUV422SP;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001336 break;
1337 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001338 supportedPreviewFormats +=
1339 CameraParameters::PIXEL_FORMAT_YUV420SP;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001340 break;
1341 case HAL_PIXEL_FORMAT_YCbCr_422_I:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001342 supportedPreviewFormats +=
1343 CameraParameters::PIXEL_FORMAT_YUV422I;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001344 break;
1345 case HAL_PIXEL_FORMAT_YV12:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001346 supportedPreviewFormats +=
1347 CameraParameters::PIXEL_FORMAT_YUV420P;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001348 break;
1349 case HAL_PIXEL_FORMAT_RGB_565:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001350 supportedPreviewFormats +=
1351 CameraParameters::PIXEL_FORMAT_RGB565;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001352 break;
1353 // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
1354 case HAL_PIXEL_FORMAT_RAW_SENSOR:
1355 addComma = false;
1356 break;
1357 default:
1358 ALOGW("%s: Camera %d: Unknown preview format: %x",
1359 __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
1360 addComma = false;
1361 break;
1362 }
1363 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001364 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001365 supportedPreviewFormats);
1366 }
1367
1368 // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
1369 // still have to do something sane for them
1370
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001371 params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
1372 mParameters.previewFpsRangeMin);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001373
1374 {
1375 String8 supportedPreviewFrameRates;
1376 for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1377 if (i != 0) supportedPreviewFrameRates += ",";
1378 supportedPreviewFrameRates += String8::format("%d",
1379 availableFpsRanges.data.i32[i]);
1380 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001381 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001382 supportedPreviewFrameRates);
1383 }
1384
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001385 camera_metadata_entry_t availableJpegSizes =
1386 staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
1387 if (!availableJpegSizes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001388
1389 // TODO: Pick maximum
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001390 mParameters.pictureWidth = availableJpegSizes.data.i32[0];
1391 mParameters.pictureHeight = availableJpegSizes.data.i32[1];
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001392
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001393 params.setPictureSize(mParameters.pictureWidth,
1394 mParameters.pictureHeight);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001395
1396 {
1397 String8 supportedPictureSizes;
1398 for (size_t i=0; i < availableJpegSizes.count; i += 2) {
1399 if (i != 0) supportedPictureSizes += ",";
1400 supportedPictureSizes += String8::format("%dx%d",
1401 availableJpegSizes.data.i32[i],
1402 availableJpegSizes.data.i32[i+1]);
1403 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001404 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001405 supportedPictureSizes);
1406 }
1407
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001408 params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
1409 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
1410 CameraParameters::PIXEL_FORMAT_JPEG);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001411
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001412 camera_metadata_entry_t availableJpegThumbnailSizes =
1413 staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2);
1414 if (!availableJpegThumbnailSizes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001415
1416 // TODO: Pick default thumbnail size sensibly
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001417 mParameters.jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0];
1418 mParameters.jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1];
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001419
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001420 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
1421 mParameters.jpegThumbWidth);
1422 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
1423 mParameters.jpegThumbHeight);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001424
1425 {
1426 String8 supportedJpegThumbSizes;
1427 for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
1428 if (i != 0) supportedJpegThumbSizes += ",";
1429 supportedJpegThumbSizes += String8::format("%dx%d",
1430 availableJpegThumbnailSizes.data.i32[i],
1431 availableJpegThumbnailSizes.data.i32[i+1]);
1432 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001433 params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001434 supportedJpegThumbSizes);
1435 }
1436
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001437 mParameters.jpegThumbQuality = 90;
1438 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
1439 mParameters.jpegThumbQuality);
1440 mParameters.jpegQuality = 90;
1441 params.set(CameraParameters::KEY_JPEG_QUALITY,
1442 mParameters.jpegQuality);
1443 mParameters.jpegRotation = 0;
1444 params.set(CameraParameters::KEY_ROTATION,
1445 mParameters.jpegRotation);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001446
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001447 mParameters.gpsEnabled = false;
1448 mParameters.gpsProcessingMethod = "unknown";
1449 // GPS fields in CameraParameters are not set by implementation
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001450
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001451 mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO;
1452 params.set(CameraParameters::KEY_WHITE_BALANCE,
1453 CameraParameters::WHITE_BALANCE_AUTO);
1454
1455 camera_metadata_entry_t availableWhiteBalanceModes =
1456 staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001457 {
1458 String8 supportedWhiteBalance;
1459 bool addComma = false;
1460 for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
1461 if (addComma) supportedWhiteBalance += ",";
1462 addComma = true;
1463 switch (availableWhiteBalanceModes.data.u8[i]) {
1464 case ANDROID_CONTROL_AWB_AUTO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001465 supportedWhiteBalance +=
1466 CameraParameters::WHITE_BALANCE_AUTO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001467 break;
1468 case ANDROID_CONTROL_AWB_INCANDESCENT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001469 supportedWhiteBalance +=
1470 CameraParameters::WHITE_BALANCE_INCANDESCENT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001471 break;
1472 case ANDROID_CONTROL_AWB_FLUORESCENT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001473 supportedWhiteBalance +=
1474 CameraParameters::WHITE_BALANCE_FLUORESCENT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001475 break;
1476 case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001477 supportedWhiteBalance +=
1478 CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001479 break;
1480 case ANDROID_CONTROL_AWB_DAYLIGHT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001481 supportedWhiteBalance +=
1482 CameraParameters::WHITE_BALANCE_DAYLIGHT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001483 break;
1484 case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001485 supportedWhiteBalance +=
1486 CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001487 break;
1488 case ANDROID_CONTROL_AWB_TWILIGHT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001489 supportedWhiteBalance +=
1490 CameraParameters::WHITE_BALANCE_TWILIGHT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001491 break;
1492 case ANDROID_CONTROL_AWB_SHADE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001493 supportedWhiteBalance +=
1494 CameraParameters::WHITE_BALANCE_SHADE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001495 break;
1496 // Skipping values not mappable to v1 API
1497 case ANDROID_CONTROL_AWB_OFF:
1498 addComma = false;
1499 break;
1500 default:
1501 ALOGW("%s: Camera %d: Unknown white balance value: %d",
1502 __FUNCTION__, mCameraId,
1503 availableWhiteBalanceModes.data.u8[i]);
1504 addComma = false;
1505 break;
1506 }
1507 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001508 params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001509 supportedWhiteBalance);
1510 }
1511
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001512 mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF;
1513 params.set(CameraParameters::KEY_EFFECT,
1514 CameraParameters::EFFECT_NONE);
1515
1516 camera_metadata_entry_t availableEffects =
1517 staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
1518 if (!availableEffects.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001519 {
1520 String8 supportedEffects;
1521 bool addComma = false;
1522 for (size_t i=0; i < availableEffects.count; i++) {
1523 if (addComma) supportedEffects += ",";
1524 addComma = true;
1525 switch (availableEffects.data.u8[i]) {
1526 case ANDROID_CONTROL_EFFECT_OFF:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001527 supportedEffects +=
1528 CameraParameters::EFFECT_NONE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001529 break;
1530 case ANDROID_CONTROL_EFFECT_MONO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001531 supportedEffects +=
1532 CameraParameters::EFFECT_MONO;
1533 break;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001534 case ANDROID_CONTROL_EFFECT_NEGATIVE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001535 supportedEffects +=
1536 CameraParameters::EFFECT_NEGATIVE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001537 break;
1538 case ANDROID_CONTROL_EFFECT_SOLARIZE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001539 supportedEffects +=
1540 CameraParameters::EFFECT_SOLARIZE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001541 break;
1542 case ANDROID_CONTROL_EFFECT_SEPIA:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001543 supportedEffects +=
1544 CameraParameters::EFFECT_SEPIA;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001545 break;
1546 case ANDROID_CONTROL_EFFECT_POSTERIZE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001547 supportedEffects +=
1548 CameraParameters::EFFECT_POSTERIZE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001549 break;
1550 case ANDROID_CONTROL_EFFECT_WHITEBOARD:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001551 supportedEffects +=
1552 CameraParameters::EFFECT_WHITEBOARD;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001553 break;
1554 case ANDROID_CONTROL_EFFECT_BLACKBOARD:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001555 supportedEffects +=
1556 CameraParameters::EFFECT_BLACKBOARD;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001557 break;
1558 case ANDROID_CONTROL_EFFECT_AQUA:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001559 supportedEffects +=
1560 CameraParameters::EFFECT_AQUA;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001561 break;
1562 default:
1563 ALOGW("%s: Camera %d: Unknown effect value: %d",
1564 __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
1565 addComma = false;
1566 break;
1567 }
1568 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001569 params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001570 }
1571
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001572 mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
1573 params.set(CameraParameters::KEY_ANTIBANDING,
1574 CameraParameters::ANTIBANDING_AUTO);
1575
1576 camera_metadata_entry_t availableAntibandingModes =
1577 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
1578 if (!availableAntibandingModes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001579 {
1580 String8 supportedAntibanding;
1581 bool addComma = false;
1582 for (size_t i=0; i < availableAntibandingModes.count; i++) {
1583 if (addComma) supportedAntibanding += ",";
1584 addComma = true;
1585 switch (availableAntibandingModes.data.u8[i]) {
1586 case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001587 supportedAntibanding +=
1588 CameraParameters::ANTIBANDING_OFF;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001589 break;
1590 case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001591 supportedAntibanding +=
1592 CameraParameters::ANTIBANDING_50HZ;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001593 break;
1594 case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001595 supportedAntibanding +=
1596 CameraParameters::ANTIBANDING_60HZ;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001597 break;
1598 case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001599 supportedAntibanding +=
1600 CameraParameters::ANTIBANDING_AUTO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001601 break;
1602 default:
1603 ALOGW("%s: Camera %d: Unknown antibanding value: %d",
1604 __FUNCTION__, mCameraId,
1605 availableAntibandingModes.data.u8[i]);
1606 addComma = false;
1607 break;
1608 }
1609 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001610 params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001611 supportedAntibanding);
1612 }
1613
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001614 mParameters.sceneMode = ANDROID_CONTROL_OFF;
1615 params.set(CameraParameters::KEY_SCENE_MODE,
1616 CameraParameters::SCENE_MODE_AUTO);
1617
1618 camera_metadata_entry_t availableSceneModes =
1619 staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
1620 if (!availableSceneModes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001621 {
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001622 String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001623 bool addComma = true;
1624 bool noSceneModes = false;
1625 for (size_t i=0; i < availableSceneModes.count; i++) {
1626 if (addComma) supportedSceneModes += ",";
1627 addComma = true;
1628 switch (availableSceneModes.data.u8[i]) {
1629 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
1630 noSceneModes = true;
1631 break;
1632 case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
1633 // Not in old API
1634 addComma = false;
1635 break;
1636 case ANDROID_CONTROL_SCENE_MODE_ACTION:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001637 supportedSceneModes +=
1638 CameraParameters::SCENE_MODE_ACTION;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001639 break;
1640 case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001641 supportedSceneModes +=
1642 CameraParameters::SCENE_MODE_PORTRAIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001643 break;
1644 case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001645 supportedSceneModes +=
1646 CameraParameters::SCENE_MODE_LANDSCAPE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001647 break;
1648 case ANDROID_CONTROL_SCENE_MODE_NIGHT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001649 supportedSceneModes +=
1650 CameraParameters::SCENE_MODE_NIGHT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001651 break;
1652 case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001653 supportedSceneModes +=
1654 CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001655 break;
1656 case ANDROID_CONTROL_SCENE_MODE_THEATRE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001657 supportedSceneModes +=
1658 CameraParameters::SCENE_MODE_THEATRE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001659 break;
1660 case ANDROID_CONTROL_SCENE_MODE_BEACH:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001661 supportedSceneModes +=
1662 CameraParameters::SCENE_MODE_BEACH;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001663 break;
1664 case ANDROID_CONTROL_SCENE_MODE_SNOW:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001665 supportedSceneModes +=
1666 CameraParameters::SCENE_MODE_SNOW;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001667 break;
1668 case ANDROID_CONTROL_SCENE_MODE_SUNSET:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001669 supportedSceneModes +=
1670 CameraParameters::SCENE_MODE_SUNSET;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001671 break;
1672 case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001673 supportedSceneModes +=
1674 CameraParameters::SCENE_MODE_STEADYPHOTO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001675 break;
1676 case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001677 supportedSceneModes +=
1678 CameraParameters::SCENE_MODE_FIREWORKS;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001679 break;
1680 case ANDROID_CONTROL_SCENE_MODE_SPORTS:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001681 supportedSceneModes +=
1682 CameraParameters::SCENE_MODE_SPORTS;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001683 break;
1684 case ANDROID_CONTROL_SCENE_MODE_PARTY:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001685 supportedSceneModes +=
1686 CameraParameters::SCENE_MODE_PARTY;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001687 break;
1688 case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001689 supportedSceneModes +=
1690 CameraParameters::SCENE_MODE_CANDLELIGHT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001691 break;
1692 case ANDROID_CONTROL_SCENE_MODE_BARCODE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001693 supportedSceneModes +=
1694 CameraParameters::SCENE_MODE_BARCODE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001695 break;
1696 default:
1697 ALOGW("%s: Camera %d: Unknown scene mode value: %d",
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001698 __FUNCTION__, mCameraId,
1699 availableSceneModes.data.u8[i]);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001700 addComma = false;
1701 break;
1702 }
1703 }
1704 if (!noSceneModes) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001705 params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001706 supportedSceneModes);
1707 }
1708 }
1709
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001710 camera_metadata_entry_t flashAvailable =
1711 staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
1712 if (!flashAvailable.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001713
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001714 camera_metadata_entry_t availableAeModes =
1715 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
1716 if (!availableAeModes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001717
1718 if (flashAvailable.data.u8[0]) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001719 mParameters.flashMode = Parameters::FLASH_MODE_AUTO;
1720 params.set(CameraParameters::KEY_FLASH_MODE,
1721 CameraParameters::FLASH_MODE_AUTO);
1722
1723 String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
1724 supportedFlashModes = supportedFlashModes +
1725 "," + CameraParameters::FLASH_MODE_AUTO +
1726 "," + CameraParameters::FLASH_MODE_ON +
1727 "," + CameraParameters::FLASH_MODE_TORCH;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001728 for (size_t i=0; i < availableAeModes.count; i++) {
1729 if (availableAeModes.data.u8[i] ==
1730 ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001731 supportedFlashModes = supportedFlashModes + "," +
1732 CameraParameters::FLASH_MODE_RED_EYE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001733 break;
1734 }
1735 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001736 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001737 supportedFlashModes);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001738 } else {
1739 mParameters.flashMode = Parameters::FLASH_MODE_OFF;
1740 params.set(CameraParameters::KEY_FLASH_MODE,
1741 CameraParameters::FLASH_MODE_OFF);
1742 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
1743 CameraParameters::FLASH_MODE_OFF);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001744 }
1745
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001746 camera_metadata_entry_t minFocusDistance =
1747 staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
1748 if (!minFocusDistance.count) return NO_INIT;
1749
1750 camera_metadata_entry_t availableAfModes =
1751 staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
1752 if (!availableAfModes.count) return NO_INIT;
1753
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001754 if (minFocusDistance.data.f[0] == 0) {
1755 // Fixed-focus lens
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001756 mParameters.focusMode = Parameters::FOCUS_MODE_FIXED;
1757 params.set(CameraParameters::KEY_FOCUS_MODE,
1758 CameraParameters::FOCUS_MODE_FIXED);
1759 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
1760 CameraParameters::FOCUS_MODE_FIXED);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001761 } else {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001762 mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
1763 params.set(CameraParameters::KEY_FOCUS_MODE,
1764 CameraParameters::FOCUS_MODE_AUTO);
1765 String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED);
1766 supportedFocusModes = supportedFocusModes + "," +
1767 CameraParameters::FOCUS_MODE_INFINITY;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001768 bool addComma = true;
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001769
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001770 for (size_t i=0; i < availableAfModes.count; i++) {
1771 if (addComma) supportedFocusModes += ",";
1772 addComma = true;
1773 switch (availableAfModes.data.u8[i]) {
1774 case ANDROID_CONTROL_AF_AUTO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001775 supportedFocusModes +=
1776 CameraParameters::FOCUS_MODE_AUTO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001777 break;
1778 case ANDROID_CONTROL_AF_MACRO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001779 supportedFocusModes +=
1780 CameraParameters::FOCUS_MODE_MACRO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001781 break;
1782 case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001783 supportedFocusModes +=
1784 CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001785 break;
1786 case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001787 supportedFocusModes +=
1788 CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001789 break;
1790 case ANDROID_CONTROL_AF_EDOF:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001791 supportedFocusModes +=
1792 CameraParameters::FOCUS_MODE_EDOF;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001793 break;
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001794 // Not supported in old API
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001795 case ANDROID_CONTROL_AF_OFF:
1796 addComma = false;
1797 break;
1798 default:
1799 ALOGW("%s: Camera %d: Unknown AF mode value: %d",
1800 __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
1801 addComma = false;
1802 break;
1803 }
1804 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001805 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001806 supportedFocusModes);
1807 }
1808
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001809 camera_metadata_entry_t max3aRegions =
1810 staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
1811 if (!max3aRegions.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001812
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001813 params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001814 max3aRegions.data.i32[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001815 params.set(CameraParameters::KEY_FOCUS_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001816 "(0,0,0,0,0)");
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001817 mParameters.focusingAreas.clear();
1818 mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001819
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001820 camera_metadata_entry_t availableFocalLengths =
1821 staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
1822 if (!availableFocalLengths.count) return NO_INIT;
1823
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001824 float minFocalLength = availableFocalLengths.data.f[0];
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001825 params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001826
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001827 camera_metadata_entry_t sensorSize =
1828 staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
1829 if (!sensorSize.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001830
1831 // The fields of view here assume infinity focus, maximum wide angle
1832 float horizFov = 180 / M_PI *
1833 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
1834 float vertFov = 180 / M_PI *
1835 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001836 params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
1837 params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001838
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001839 mParameters.exposureCompensation = 0;
1840 params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
1841 mParameters.exposureCompensation);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001842
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001843 camera_metadata_entry_t exposureCompensationRange =
1844 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
1845 if (!exposureCompensationRange.count) return NO_INIT;
1846
1847 params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001848 exposureCompensationRange.data.i32[1]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001849 params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001850 exposureCompensationRange.data.i32[0]);
1851
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001852 camera_metadata_entry_t exposureCompensationStep =
1853 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
1854 if (!exposureCompensationStep.count) return NO_INIT;
1855
1856 params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001857 exposureCompensationStep.data.r[0].numerator /
1858 exposureCompensationStep.data.r[0].denominator);
1859
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001860 mParameters.autoExposureLock = false;
1861 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
1862 CameraParameters::FALSE);
1863 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
1864 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001865
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001866 mParameters.autoWhiteBalanceLock = false;
1867 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
1868 CameraParameters::FALSE);
1869 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
1870 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001871
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001872 mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
1873 params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001874 max3aRegions.data.i32[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001875 params.set(CameraParameters::KEY_METERING_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001876 "(0,0,0,0,0)");
1877
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001878 mParameters.zoom = 0;
1879 params.set(CameraParameters::KEY_ZOOM, mParameters.zoom);
1880 params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001881
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001882 camera_metadata_entry_t maxDigitalZoom =
1883 staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
1884 if (!maxDigitalZoom.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001885
1886 {
1887 String8 zoomRatios;
1888 float zoom = 1.f;
1889 float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001890 (NUM_ZOOM_STEPS-1);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001891 bool addComma = false;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001892 for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001893 if (addComma) zoomRatios += ",";
1894 addComma = true;
1895 zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
1896 zoom += zoomIncrement;
1897 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001898 params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001899 }
1900
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001901 params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
1902 CameraParameters::TRUE);
1903 params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
1904 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001905
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001906 params.set(CameraParameters::KEY_FOCUS_DISTANCES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001907 "Infinity,Infinity,Infinity");
1908
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001909 camera_metadata_entry_t maxFacesDetected =
1910 staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
1911 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001912 maxFacesDetected.data.i32[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001913 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001914 0);
1915
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001916 params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
1917 formatEnumToString(HAL_PIXEL_FORMAT_YCrCb_420_SP));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001918
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001919 params.set(CameraParameters::KEY_RECORDING_HINT,
1920 CameraParameters::FALSE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001921
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001922 params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
1923 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001924
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001925 params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
1926 CameraParameters::FALSE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001927
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001928 camera_metadata_entry_t availableVideoStabilizationModes =
1929 staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
1930 if (!availableVideoStabilizationModes.count) return NO_INIT;
1931
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001932 if (availableVideoStabilizationModes.count > 1) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001933 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
1934 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001935 } else {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001936 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
1937 CameraParameters::FALSE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001938 }
1939
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001940 mParamsFlattened = params.flatten();
1941
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001942 return OK;
1943}
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001944
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001945status_t Camera2Client::updatePreviewRequest() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001946 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001947 status_t res;
1948 if (mPreviewRequest == NULL) {
1949 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
1950 &mPreviewRequest);
1951 if (res != OK) {
1952 ALOGE("%s: Camera %d: Unable to create default preview request: "
1953 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1954 return res;
1955 }
1956 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001957 // TODO: Adjust for params changes
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001958 return OK;
1959}
1960
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001961status_t Camera2Client::updateCaptureStream() {
1962 status_t res;
1963 // Find out buffer size for JPEG
1964 camera_metadata_entry_t maxJpegSize =
1965 staticInfo(ANDROID_JPEG_MAX_SIZE);
1966 if (maxJpegSize.count == 0) {
1967 ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!",
1968 __FUNCTION__, mCameraId);
1969 return INVALID_OPERATION;
1970 }
1971
1972 if (mCaptureConsumer == 0) {
1973 // Create CPU buffer queue endpoint
1974 mCaptureConsumer = new CpuConsumer(1);
1975 mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this));
1976 mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer"));
1977 mCaptureWindow = new SurfaceTextureClient(
1978 mCaptureConsumer->getProducerInterface());
1979 // Create memory for API consumption
1980 mCaptureHeap = new MemoryHeapBase(maxJpegSize.data.i32[0], 0,
1981 "Camera2Client::CaptureHeap");
1982 if (mCaptureHeap->getSize() == 0) {
1983 ALOGE("%s: Camera %d: Unable to allocate memory for capture",
1984 __FUNCTION__, mCameraId);
1985 return NO_MEMORY;
1986 }
1987 mCaptureMemory = new MemoryBase(mCaptureHeap,
1988 0, maxJpegSize.data.i32[0]);
1989 }
1990 if (mCaptureStreamId == NO_STREAM) {
1991 // Create stream for HAL production
1992 res = mDevice->createStream(mCaptureWindow,
1993 mParameters.pictureWidth, mParameters.pictureHeight,
1994 HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0],
1995 &mCaptureStreamId);
1996 if (res != OK) {
1997 ALOGE("%s: Camera %d: Can't create output stream for capture: "
1998 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1999 return res;
2000 }
2001
2002 } else {
2003 // Check if stream parameters have to change
2004 uint32_t currentWidth, currentHeight;
2005 res = mDevice->getStreamInfo(mCaptureStreamId,
2006 &currentWidth, &currentHeight, 0);
2007 if (res != OK) {
2008 ALOGE("%s: Camera %d: Error querying capture output stream info: "
2009 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2010 return res;
2011 }
2012 if (currentWidth != (uint32_t)mParameters.pictureWidth ||
2013 currentHeight != (uint32_t)mParameters.pictureHeight) {
2014 res = mDevice->deleteStream(mCaptureStreamId);
2015 if (res != OK) {
2016 ALOGE("%s: Camera %d: Unable to delete old output stream "
2017 "for capture: %s (%d)", __FUNCTION__, mCameraId,
2018 strerror(-res), res);
2019 return res;
2020 }
2021 mCaptureStreamId = NO_STREAM;
2022 return updateCaptureStream();
2023 }
2024 }
2025 return OK;
2026}
2027status_t Camera2Client::updateCaptureRequest() {
2028 ATRACE_CALL();
2029 status_t res;
2030 if (mCaptureRequest == NULL) {
2031 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE,
2032 &mCaptureRequest);
2033 if (res != OK) {
2034 ALOGE("%s: Camera %d: Unable to create default still image request:"
2035 " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2036 return res;
2037 }
2038 }
2039 // TODO: Adjust for params changes
2040 return OK;
2041}
2042
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07002043int Camera2Client::formatStringToEnum(const char *format) {
2044 return
2045 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ?
2046 HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
2047 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ?
2048 HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
2049 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ?
2050 HAL_PIXEL_FORMAT_YCbCr_422_I : // YUY2
2051 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ?
2052 HAL_PIXEL_FORMAT_YV12 : // YV12
2053 !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ?
2054 HAL_PIXEL_FORMAT_RGB_565 : // RGB565
2055 !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ?
2056 HAL_PIXEL_FORMAT_RGBA_8888 : // RGB8888
2057 !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ?
2058 HAL_PIXEL_FORMAT_RAW_SENSOR : // Raw sensor data
2059 -1;
2060}
2061
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07002062const char* Camera2Client::formatEnumToString(int format) {
2063 const char *fmt;
2064 switch(format) {
2065 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
2066 fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
2067 break;
2068 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
2069 fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
2070 break;
2071 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
2072 fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
2073 break;
2074 case HAL_PIXEL_FORMAT_YV12: // YV12
2075 fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
2076 break;
2077 case HAL_PIXEL_FORMAT_RGB_565: // RGB565
2078 fmt = CameraParameters::PIXEL_FORMAT_RGB565;
2079 break;
2080 case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888
2081 fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
2082 break;
2083 case HAL_PIXEL_FORMAT_RAW_SENSOR:
2084 ALOGW("Raw sensor preview format requested.");
2085 fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
2086 break;
2087 default:
2088 ALOGE("%s: Unknown preview format: %x",
2089 __FUNCTION__, format);
2090 fmt = NULL;
2091 break;
2092 }
2093 return fmt;
2094}
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07002095
2096int Camera2Client::wbModeStringToEnum(const char *wbMode) {
2097 return
2098 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
2099 ANDROID_CONTROL_AWB_AUTO :
2100 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
2101 ANDROID_CONTROL_AWB_INCANDESCENT :
2102 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
2103 ANDROID_CONTROL_AWB_FLUORESCENT :
2104 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
2105 ANDROID_CONTROL_AWB_WARM_FLUORESCENT :
2106 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
2107 ANDROID_CONTROL_AWB_DAYLIGHT :
2108 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
2109 ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT :
2110 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
2111 ANDROID_CONTROL_AWB_TWILIGHT :
2112 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
2113 ANDROID_CONTROL_AWB_SHADE :
2114 -1;
2115}
2116
2117int Camera2Client::effectModeStringToEnum(const char *effectMode) {
2118 return
2119 !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
2120 ANDROID_CONTROL_EFFECT_OFF :
2121 !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
2122 ANDROID_CONTROL_EFFECT_MONO :
2123 !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
2124 ANDROID_CONTROL_EFFECT_NEGATIVE :
2125 !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
2126 ANDROID_CONTROL_EFFECT_SOLARIZE :
2127 !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
2128 ANDROID_CONTROL_EFFECT_SEPIA :
2129 !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
2130 ANDROID_CONTROL_EFFECT_POSTERIZE :
2131 !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
2132 ANDROID_CONTROL_EFFECT_WHITEBOARD :
2133 !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
2134 ANDROID_CONTROL_EFFECT_BLACKBOARD :
2135 !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
2136 ANDROID_CONTROL_EFFECT_AQUA :
2137 -1;
2138}
2139
2140int Camera2Client::abModeStringToEnum(const char *abMode) {
2141 return
2142 !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
2143 ANDROID_CONTROL_AE_ANTIBANDING_AUTO :
2144 !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
2145 ANDROID_CONTROL_AE_ANTIBANDING_OFF :
2146 !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
2147 ANDROID_CONTROL_AE_ANTIBANDING_50HZ :
2148 !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
2149 ANDROID_CONTROL_AE_ANTIBANDING_60HZ :
2150 -1;
2151}
2152
2153int Camera2Client::sceneModeStringToEnum(const char *sceneMode) {
2154 return
2155 !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
2156 ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
2157 !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
2158 ANDROID_CONTROL_SCENE_MODE_ACTION :
2159 !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
2160 ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
2161 !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
2162 ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
2163 !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
2164 ANDROID_CONTROL_SCENE_MODE_NIGHT :
2165 !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
2166 ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
2167 !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
2168 ANDROID_CONTROL_SCENE_MODE_THEATRE :
2169 !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
2170 ANDROID_CONTROL_SCENE_MODE_BEACH :
2171 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
2172 ANDROID_CONTROL_SCENE_MODE_SNOW :
2173 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
2174 ANDROID_CONTROL_SCENE_MODE_SUNSET :
2175 !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
2176 ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
2177 !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
2178 ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
2179 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
2180 ANDROID_CONTROL_SCENE_MODE_SPORTS :
2181 !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
2182 ANDROID_CONTROL_SCENE_MODE_PARTY :
2183 !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
2184 ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
2185 !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
2186 ANDROID_CONTROL_SCENE_MODE_BARCODE:
2187 -1;
2188}
2189
2190Camera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum(
2191 const char *flashMode) {
2192 return
2193 !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
2194 Parameters::FLASH_MODE_OFF :
2195 !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
2196 Parameters::FLASH_MODE_AUTO :
2197 !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
2198 Parameters::FLASH_MODE_ON :
2199 !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
2200 Parameters::FLASH_MODE_RED_EYE :
2201 !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
2202 Parameters::FLASH_MODE_TORCH :
2203 Parameters::FLASH_MODE_INVALID;
2204}
2205
2206Camera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum(
2207 const char *focusMode) {
2208 return
2209 !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
2210 Parameters::FOCUS_MODE_AUTO :
2211 !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
2212 Parameters::FOCUS_MODE_INFINITY :
2213 !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
2214 Parameters::FOCUS_MODE_MACRO :
2215 !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
2216 Parameters::FOCUS_MODE_FIXED :
2217 !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
2218 Parameters::FOCUS_MODE_EDOF :
2219 !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
2220 Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
2221 !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
2222 Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
2223 Parameters::FOCUS_MODE_INVALID;
2224}
2225
2226status_t Camera2Client::parseAreas(const char *areasCStr,
2227 Vector<Parameters::Area> *areas) {
2228 static const size_t NUM_FIELDS = 5;
2229 areas->clear();
2230 if (areasCStr == NULL) {
2231 // If no key exists, use default (0,0,0,0,0)
2232 areas->push();
2233 return OK;
2234 }
2235 String8 areasStr(areasCStr);
2236 ssize_t areaStart = areasStr.find("(", 0) + 1;
2237 while (areaStart != 0) {
2238 const char* area = areasStr.string() + areaStart;
2239 char *numEnd;
2240 int vals[NUM_FIELDS];
2241 for (size_t i = 0; i < NUM_FIELDS; i++) {
2242 errno = 0;
2243 vals[i] = strtol(area, &numEnd, 10);
2244 if (errno || numEnd == area) return BAD_VALUE;
2245 area = numEnd + 1;
2246 }
2247 areas->push(Parameters::Area(
2248 vals[0], vals[1], vals[2], vals[3], vals[4]) );
2249 areaStart = areasStr.find("(", areaStart) + 1;
2250 }
2251 return OK;
2252}
2253
2254status_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas,
2255 size_t maxRegions) {
2256 // Definition of valid area can be found in
2257 // include/camera/CameraParameters.h
2258 if (areas.size() == 0) return BAD_VALUE;
2259 if (areas.size() == 1) {
2260 if (areas[0].left == 0 &&
2261 areas[0].top == 0 &&
2262 areas[0].right == 0 &&
2263 areas[0].bottom == 0 &&
2264 areas[0].weight == 0) {
2265 // Single (0,0,0,0,0) entry is always valid (== driver decides)
2266 return OK;
2267 }
2268 }
2269 if (areas.size() > maxRegions) {
2270 ALOGE("%s: Too many areas requested: %d",
2271 __FUNCTION__, areas.size());
2272 return BAD_VALUE;
2273 }
2274
2275 for (Vector<Parameters::Area>::const_iterator a = areas.begin();
2276 a != areas.end(); a++) {
2277 if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
2278 if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
2279 if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
2280 if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
2281 if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
2282 if (a->left >= a->right) return BAD_VALUE;
2283 if (a->top >= a->bottom) return BAD_VALUE;
2284 }
2285 return OK;
2286}
2287
2288bool Camera2Client::boolFromString(const char *boolStr) {
2289 return !boolStr ? false :
2290 !strcmp(boolStr, CameraParameters::TRUE) ? true :
2291 false;
2292}
2293
2294
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07002295} // namespace android