blob: d8b80815af3906b40d3307600ef1f71a8c6305bd [file] [log] [blame]
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "Camera2Client"
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070018#define ATRACE_TAG ATRACE_TAG_CAMERA
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070019//#define LOG_NDEBUG 0
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070020
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070021#include <utils/Log.h>
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070022#include <utils/Trace.h>
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070023
24#include <cutils/properties.h>
25#include <gui/SurfaceTextureClient.h>
26#include <gui/Surface.h>
27
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070028#include <math.h>
29
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070030#include "Camera2Client.h"
31
32namespace android {
33
34#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
35#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
36
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070037static int getCallingPid() {
38 return IPCThreadState::self()->getCallingPid();
39}
40
41static int getCallingUid() {
42 return IPCThreadState::self()->getCallingUid();
43}
44
45// Interface used by CameraService
46
47Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
48 const sp<ICameraClient>& cameraClient,
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070049 int cameraId,
50 int cameraFacing,
51 int clientPid):
52 Client(cameraService, cameraClient,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070053 cameraId, cameraFacing, clientPid),
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -070054 mState(NOT_INITIALIZED),
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -070055 mPreviewStreamId(NO_STREAM),
56 mPreviewRequest(NULL),
57 mCaptureStreamId(NO_STREAM),
58 mCaptureRequest(NULL)
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070059{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070060 ATRACE_CALL();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070061
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070062 mDevice = new Camera2Device(cameraId);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070063}
64
65status_t Camera2Client::initialize(camera_module_t *module)
66{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070067 ATRACE_CALL();
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070068 status_t res;
69
70 res = mDevice->initialize(module);
71 if (res != OK) {
72 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
73 __FUNCTION__, mCameraId, strerror(-res), res);
74 return NO_INIT;
75 }
76
77 res = buildDefaultParameters();
78 if (res != OK) {
79 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
80 __FUNCTION__, mCameraId, strerror(-res), res);
81 return NO_INIT;
82 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -070083
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070084 if (gLogLevel >= 1) {
85 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
86 mCameraId);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -070087 ALOGD("%s", mParamsFlattened.string());
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070088 }
89
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -070090 mState = STOPPED;
91
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070092 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070093}
94
95Camera2Client::~Camera2Client() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070096 ATRACE_CALL();
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -070097 ALOGV("%s: Camera %d: Shutting down", __FUNCTION__, mCameraId);
98
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070099 mDestructionStarted = true;
100
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700101 disconnect();
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700102
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700103}
104
105status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700106 String8 result;
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700107 result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700108 mCameraId,
109 getCameraClient()->asBinder().get(),
110 mClientPid);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700111 result.append(" State: ");
112#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
113
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700114 result.append(getStateName(mState));
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700115
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700116 result.append("\n Current parameters:\n");
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700117 result.appendFormat(" Preview size: %d x %d\n",
118 mParameters.previewWidth, mParameters.previewHeight);
119 result.appendFormat(" Preview FPS range: %d - %d\n",
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
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700251 result.appendFormat(" Zoom index: %d\n", mParameters.zoom);
252 result.appendFormat(" Video size: %d x %d\n", mParameters.videoWidth,
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700253 mParameters.videoHeight);
254
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700255 result.appendFormat(" Recording hint is %s\n",
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700256 mParameters.recordingHint ? "set" : "not set");
257
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700258 result.appendFormat(" Video stabilization is %s\n",
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700259 mParameters.videoStabilization ? "enabled" : "disabled");
260
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700261 result.append(" Current streams:\n");
262 result.appendFormat(" Preview stream ID: %d\n", mPreviewStreamId);
263 result.appendFormat(" Capture stream ID: %d\n", mCaptureStreamId);
264
265 result.append(" Current requests:\n");
266 if (mPreviewRequest != NULL) {
267 result.append(" Preview request:\n");
268 write(fd, result.string(), result.size());
269 dump_camera_metadata(mPreviewRequest, fd, 2);
270 } else {
271 result.append(" Preview request: undefined\n");
272 write(fd, result.string(), result.size());
273 }
274
275 if (mCaptureRequest != NULL) {
276 result = " Capture request:\n";
277 write(fd, result.string(), result.size());
278 dump_camera_metadata(mCaptureRequest, fd, 2);
279 } else {
280 result = " Capture request: undefined\n";
281 write(fd, result.string(), result.size());
282 }
283
284 result = " Device dump:\n";
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700285 write(fd, result.string(), result.size());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700286
Eino-Ville Talvala3297daa2012-06-14 10:49:45 -0700287 status_t res = mDevice->dump(fd, args);
288 if (res != OK) {
289 result = String8::format(" Error dumping device: %s (%d)",
290 strerror(-res), res);
291 write(fd, result.string(), result.size());
292 }
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700293
294#undef CASE_APPEND_ENUM
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700295 return NO_ERROR;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700296}
297
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700298const char* Camera2Client::getStateName(State state) {
299#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
300 switch(state) {
301 CASE_ENUM_TO_CHAR(NOT_INITIALIZED)
302 CASE_ENUM_TO_CHAR(STOPPED)
303 CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
304 CASE_ENUM_TO_CHAR(PREVIEW)
305 CASE_ENUM_TO_CHAR(RECORD)
306 CASE_ENUM_TO_CHAR(STILL_CAPTURE)
307 CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
308 default:
309 return "Unknown state!";
310 break;
311 }
312#undef CASE_ENUM_TO_CHAR
313}
314
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700315// ICamera interface
316
317void Camera2Client::disconnect() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700318 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700319 Mutex::Autolock icl(mICameraLock);
320
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700321 if (mDevice == 0) return;
322
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700323 stopPreviewLocked();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700324
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700325 mDevice->waitUntilDrained();
326
327 if (mPreviewStreamId != NO_STREAM) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700328 mDevice->deleteStream(mPreviewStreamId);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700329 mPreviewStreamId = NO_STREAM;
330 }
331
332 if (mCaptureStreamId != NO_STREAM) {
333 mDevice->deleteStream(mCaptureStreamId);
334 mCaptureStreamId = NO_STREAM;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700335 }
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700336
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700337 CameraService::Client::disconnect();
338}
339
340status_t Camera2Client::connect(const sp<ICameraClient>& client) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700341 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700342 Mutex::Autolock icl(mICameraLock);
343
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700344 return BAD_VALUE;
345}
346
347status_t Camera2Client::lock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700348 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700349 Mutex::Autolock icl(mICameraLock);
350
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700351 return BAD_VALUE;
352}
353
354status_t Camera2Client::unlock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700355 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700356 Mutex::Autolock icl(mICameraLock);
357
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700358 return BAD_VALUE;
359}
360
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700361status_t Camera2Client::setPreviewDisplay(
362 const sp<Surface>& surface) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700363 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700364 Mutex::Autolock icl(mICameraLock);
365
366 if (mState >= PREVIEW) return INVALID_OPERATION;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700367
368 sp<IBinder> binder;
369 sp<ANativeWindow> window;
370 if (surface != 0) {
371 binder = surface->asBinder();
372 window = surface;
373 }
374
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700375 return setPreviewWindowLocked(binder,window);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700376}
377
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700378status_t Camera2Client::setPreviewTexture(
379 const sp<ISurfaceTexture>& surfaceTexture) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700380 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700381 Mutex::Autolock icl(mICameraLock);
382
383 if (mState >= PREVIEW) return INVALID_OPERATION;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700384
385 sp<IBinder> binder;
386 sp<ANativeWindow> window;
387 if (surfaceTexture != 0) {
388 binder = surfaceTexture->asBinder();
389 window = new SurfaceTextureClient(surfaceTexture);
390 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700391 return setPreviewWindowLocked(binder, window);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700392}
393
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700394status_t Camera2Client::setPreviewWindowLocked(const sp<IBinder>& binder,
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700395 const sp<ANativeWindow>& window) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700396 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700397 status_t res;
398
399 if (binder == mPreviewSurface) {
400 return NO_ERROR;
401 }
402
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700403 // TODO: Should wait until HAL has no remaining requests
404
405 if (mPreviewStreamId != NO_STREAM) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700406 res = mDevice->deleteStream(mPreviewStreamId);
407 if (res != OK) {
408 return res;
409 }
410 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700411 res = mDevice->createStream(window,
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700412 mParameters.previewWidth, mParameters.previewHeight,
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700413 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700414 &mPreviewStreamId);
415 if (res != OK) {
416 return res;
417 }
418
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700419 mPreviewSurface = binder;
420
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700421 if (mState == WAITING_FOR_PREVIEW_WINDOW) {
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700422 return startPreviewLocked();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700423 }
424
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700425 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700426}
427
428void Camera2Client::setPreviewCallbackFlag(int flag) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700429 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700430 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700431}
432
433status_t Camera2Client::startPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700434 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700435 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700436 return startPreviewLocked();
437}
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700438
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700439status_t Camera2Client::startPreviewLocked() {
440 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700441 status_t res;
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700442 if (mState >= PREVIEW) {
443 ALOGE("%s: Can't start preview in state %s",
444 __FUNCTION__, getStateName(mState));
445 return INVALID_OPERATION;
446 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700447
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700448 if (mPreviewStreamId == NO_STREAM) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700449 mState = WAITING_FOR_PREVIEW_WINDOW;
450 return OK;
451 }
452
453 if (mPreviewRequest == NULL) {
454 updatePreviewRequest();
455 }
456
457 uint8_t outputStream = mPreviewStreamId;
458
459 camera_metadata_entry_t outputStreams;
460 res = find_camera_metadata_entry(mPreviewRequest,
461 ANDROID_REQUEST_OUTPUT_STREAMS,
462 &outputStreams);
463 if (res == NAME_NOT_FOUND) {
464 res = add_camera_metadata_entry(mPreviewRequest,
465 ANDROID_REQUEST_OUTPUT_STREAMS,
466 &outputStream, 1);
467 } else if (res == OK) {
468 res = update_camera_metadata_entry(mPreviewRequest,
469 outputStreams.index, &outputStream, 1, NULL);
470 }
471
472 if (res != OK) {
473 ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
474 __FUNCTION__, mCameraId, strerror(-res), res);
475 mState = STOPPED;
476 return res;
477 }
478
479 res = mDevice->setStreamingRequest(mPreviewRequest);
480 if (res != OK) {
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -0700481 ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
482 "%s (%d)",
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700483 __FUNCTION__, mCameraId, strerror(-res), res);
484 mState = STOPPED;
485 return res;
486 }
487 mState = PREVIEW;
488
489 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700490}
491
492void Camera2Client::stopPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700493 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700494 Mutex::Autolock icl(mICameraLock);
495 stopPreviewLocked();
496}
497
498void Camera2Client::stopPreviewLocked() {
499 ATRACE_CALL();
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700500 switch (mState) {
501 case NOT_INITIALIZED:
502 ALOGE("%s: Camera %d: Call before initialized",
503 __FUNCTION__, mCameraId);
504 break;
505 case STOPPED:
506 break;
507 case STILL_CAPTURE:
508 ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
509 __FUNCTION__, mCameraId);
510 break;
511 case RECORD:
512 // TODO: Handle record stop here
513 case PREVIEW:
514 mDevice->setStreamingRequest(NULL);
515 case WAITING_FOR_PREVIEW_WINDOW:
516 mState = STOPPED;
517 break;
518 default:
519 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
520 mState);
521 }
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700522}
523
524bool Camera2Client::previewEnabled() {
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 Talvala6db981c2012-05-21 18:54:30 -0700527 return mState == PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700528}
529
530status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700531 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700532 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700533 return BAD_VALUE;
534}
535
536status_t Camera2Client::startRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700537 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700538 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700539 return BAD_VALUE;
540}
541
542void Camera2Client::stopRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700543 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700544 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700545}
546
547bool Camera2Client::recordingEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700548 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700549 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700550 return BAD_VALUE;
551}
552
553void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700554 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700555 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700556}
557
558status_t Camera2Client::autoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700559 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700560 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700561 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700562}
563
564status_t Camera2Client::cancelAutoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700565 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700566 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700567 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700568}
569
570status_t Camera2Client::takePicture(int msgType) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700571 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700572 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700573 status_t res;
574
575 switch (mState) {
576 case NOT_INITIALIZED:
577 case STOPPED:
578 case WAITING_FOR_PREVIEW_WINDOW:
579 ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
580 __FUNCTION__, mCameraId);
581 return INVALID_OPERATION;
582 case PREVIEW:
583 case RECORD:
584 // Good to go for takePicture
585 break;
586 case STILL_CAPTURE:
587 case VIDEO_SNAPSHOT:
588 ALOGE("%s: Camera %d: Already taking a picture",
589 __FUNCTION__, mCameraId);
590 return INVALID_OPERATION;
591 }
592
593 Mutex::Autolock pl(mParamsLock);
594
595 res = updateCaptureStream();
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700596 if (res != OK) {
597 ALOGE("%s: Can't set up still image stream: %s (%d)",
598 __FUNCTION__, strerror(-res), res);
599 return res;
600 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700601
602 if (mCaptureRequest == NULL) {
Eino-Ville Talvala4ecfec32012-06-12 17:13:48 -0700603 res = updateCaptureRequest();
604 if (res != OK) {
605 ALOGE("%s: Can't set up still image capture request: %s (%d)",
606 __FUNCTION__, strerror(-res), res);
607 return res;
608 }
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700609 }
610
611 // TODO: For video snapshot, need 3 streams here
612 camera_metadata_entry_t outputStreams;
613 uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId };
614 res = find_camera_metadata_entry(mCaptureRequest,
615 ANDROID_REQUEST_OUTPUT_STREAMS,
616 &outputStreams);
617 if (res == NAME_NOT_FOUND) {
618 res = add_camera_metadata_entry(mCaptureRequest,
619 ANDROID_REQUEST_OUTPUT_STREAMS,
620 streamIds, 2);
621 } else if (res == OK) {
622 res = update_camera_metadata_entry(mCaptureRequest,
623 outputStreams.index, streamIds, 2, NULL);
624 }
625
626 if (res != OK) {
627 ALOGE("%s: Camera %d: Unable to set up still image capture request: "
628 "%s (%d)",
629 __FUNCTION__, mCameraId, strerror(-res), res);
630 return res;
631 }
632
633 camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest);
634 if (captureCopy == NULL) {
635 ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
636 __FUNCTION__, mCameraId);
637 return NO_MEMORY;
638 }
639
640 if (mState == PREVIEW) {
641 res = mDevice->setStreamingRequest(NULL);
642 if (res != OK) {
643 ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
644 "%s (%d)",
645 __FUNCTION__, mCameraId, strerror(-res), res);
646 return res;
647 }
648 }
649
650 res = mDevice->capture(captureCopy);
651 if (res != OK) {
652 ALOGE("%s: Camera %d: Unable to submit still image capture request: "
653 "%s (%d)",
654 __FUNCTION__, mCameraId, strerror(-res), res);
655 return res;
656 }
657
658 switch (mState) {
659 case PREVIEW:
660 mState = STILL_CAPTURE;
661 break;
662 case RECORD:
663 mState = VIDEO_SNAPSHOT;
664 break;
665 default:
666 ALOGE("%s: Camera %d: Unknown state for still capture!",
667 __FUNCTION__, mCameraId);
668 return INVALID_OPERATION;
669 }
670
671 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700672}
673
674status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700675 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700676 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -0700677 Mutex::Autolock pl(mParamsLock);
678 status_t res;
679
680 CameraParameters newParams(params);
681
682 // TODO: Currently ignoring any changes to supposedly read-only
683 // parameters such as supported preview sizes, etc. Should probably
684 // produce an error if they're changed.
685
686 /** Extract and verify new parameters */
687
688 size_t i;
689
690 // PREVIEW_SIZE
691 int previewWidth, previewHeight;
692 newParams.getPreviewSize(&previewWidth, &previewHeight);
693
694 if (previewWidth != mParameters.previewWidth ||
695 previewHeight != mParameters.previewHeight) {
696 if (mState >= PREVIEW) {
697 ALOGE("%s: Preview size cannot be updated when preview "
698 "is active!", __FUNCTION__);
699 return BAD_VALUE;
700 }
701 camera_metadata_entry_t availablePreviewSizes =
702 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
703 for (i = 0; i < availablePreviewSizes.count; i += 2 ) {
704 if (availablePreviewSizes.data.i32[i] == previewWidth &&
705 availablePreviewSizes.data.i32[i+1] == previewHeight) break;
706 }
707 if (i == availablePreviewSizes.count) {
708 ALOGE("%s: Requested preview size %d x %d is not supported",
709 __FUNCTION__, previewWidth, previewHeight);
710 return BAD_VALUE;
711 }
712 }
713
714 // PREVIEW_FPS_RANGE
715 int previewFpsRangeMin, previewFpsRangeMax, previewFps = 0;
716 bool fpsRangeChanged = false;
717 newParams.getPreviewFpsRange(&previewFpsRangeMin, &previewFpsRangeMax);
718 if (previewFpsRangeMin != mParameters.previewFpsRangeMin ||
719 previewFpsRangeMax != mParameters.previewFpsRangeMax) {
720 fpsRangeChanged = true;
721 camera_metadata_entry_t availablePreviewFpsRanges =
722 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
723 for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
724 if ((availablePreviewFpsRanges.data.i32[i] ==
725 previewFpsRangeMin) &&
726 (availablePreviewFpsRanges.data.i32[i+1] ==
727 previewFpsRangeMax) ) {
728 break;
729 }
730 }
731 if (i == availablePreviewFpsRanges.count) {
732 ALOGE("%s: Requested preview FPS range %d - %d is not supported",
733 __FUNCTION__, previewFpsRangeMin, previewFpsRangeMax);
734 return BAD_VALUE;
735 }
736 previewFps = previewFpsRangeMin;
737 }
738
739 // PREVIEW_FORMAT
740 int previewFormat = formatStringToEnum(newParams.getPreviewFormat());
741 if (previewFormat != mParameters.previewFormat) {
742 if (mState >= PREVIEW) {
743 ALOGE("%s: Preview format cannot be updated when preview "
744 "is active!", __FUNCTION__);
745 return BAD_VALUE;
746 }
747 camera_metadata_entry_t availableFormats =
748 staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
749 for (i = 0; i < availableFormats.count; i++) {
750 if (availableFormats.data.i32[i] == previewFormat) break;
751 }
752 if (i == availableFormats.count) {
753 ALOGE("%s: Requested preview format %s (0x%x) is not supported",
754 __FUNCTION__, newParams.getPreviewFormat(), previewFormat);
755 return BAD_VALUE;
756 }
757 }
758
759 // PREVIEW_FRAME_RATE
760 // Deprecated, only use if the preview fps range is unchanged this time.
761 // The single-value FPS is the same as the minimum of the range.
762 if (!fpsRangeChanged) {
763 previewFps = newParams.getPreviewFrameRate();
764 if (previewFps != mParameters.previewFps) {
765 camera_metadata_entry_t availableFrameRates =
766 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
767 for (i = 0; i < availableFrameRates.count; i+=2) {
768 if (availableFrameRates.data.i32[i] == previewFps) break;
769 }
770 if (i == availableFrameRates.count) {
771 ALOGE("%s: Requested preview frame rate %d is not supported",
772 __FUNCTION__, previewFps);
773 return BAD_VALUE;
774 }
775 previewFpsRangeMin = availableFrameRates.data.i32[i];
776 previewFpsRangeMax = availableFrameRates.data.i32[i+1];
777 }
778 }
779
780 // PICTURE_SIZE
781 int pictureWidth, pictureHeight;
782 newParams.getPictureSize(&pictureWidth, &pictureHeight);
783 if (pictureWidth == mParameters.pictureWidth ||
784 pictureHeight == mParameters.pictureHeight) {
785 camera_metadata_entry_t availablePictureSizes =
786 staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
787 for (i = 0; i < availablePictureSizes.count; i+=2) {
788 if (availablePictureSizes.data.i32[i] == pictureWidth &&
789 availablePictureSizes.data.i32[i+1] == pictureHeight) break;
790 }
791 if (i == availablePictureSizes.count) {
792 ALOGE("%s: Requested picture size %d x %d is not supported",
793 __FUNCTION__, pictureWidth, pictureHeight);
794 return BAD_VALUE;
795 }
796 }
797
798 // JPEG_THUMBNAIL_WIDTH/HEIGHT
799 int jpegThumbWidth, jpegThumbHeight;
800 jpegThumbWidth =
801 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
802 jpegThumbHeight =
803 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
804 if (jpegThumbWidth != mParameters.jpegThumbWidth ||
805 jpegThumbHeight != mParameters.jpegThumbHeight) {
806 camera_metadata_entry_t availableJpegThumbSizes =
807 staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
808 for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
809 if (availableJpegThumbSizes.data.i32[i] == jpegThumbWidth &&
810 availableJpegThumbSizes.data.i32[i+1] == jpegThumbHeight) {
811 break;
812 }
813 }
814 if (i == availableJpegThumbSizes.count) {
815 ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
816 __FUNCTION__, jpegThumbWidth, jpegThumbHeight);
817 return BAD_VALUE;
818 }
819 }
820
821 // JPEG_THUMBNAIL_QUALITY
822 int jpegThumbQuality =
823 newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
824 if (jpegThumbQuality < 0 || jpegThumbQuality > 100) {
825 ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
826 __FUNCTION__, jpegThumbQuality);
827 return BAD_VALUE;
828 }
829
830 // JPEG_QUALITY
831 int jpegQuality =
832 newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
833 if (jpegQuality < 0 || jpegQuality > 100) {
834 ALOGE("%s: Requested JPEG quality %d is not supported",
835 __FUNCTION__, jpegQuality);
836 return BAD_VALUE;
837 }
838
839 // ROTATION
840 int jpegRotation =
841 newParams.getInt(CameraParameters::KEY_ROTATION);
842 if (jpegRotation != 0 &&
843 jpegRotation != 90 &&
844 jpegRotation != 180 &&
845 jpegRotation != 270) {
846 ALOGE("%s: Requested picture rotation angle %d is not supported",
847 __FUNCTION__, jpegRotation);
848 return BAD_VALUE;
849 }
850
851 // GPS
852 bool gpsEnabled = false;
853 double gpsLatitude = 0, gpsLongitude = 0, gpsAltitude = 0;
854 int64_t gpsTimestamp = 0;
855 String8 gpsProcessingMethod;
856 const char *gpsLatStr =
857 newParams.get(CameraParameters::KEY_GPS_LATITUDE);
858 if (gpsLatStr != NULL) {
859 const char *gpsLongStr =
860 newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
861 const char *gpsAltitudeStr =
862 newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
863 const char *gpsTimeStr =
864 newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
865 const char *gpsProcMethodStr =
866 newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
867 if (gpsLongStr == NULL ||
868 gpsAltitudeStr == NULL ||
869 gpsTimeStr == NULL ||
870 gpsProcMethodStr == NULL) {
871 ALOGE("%s: Incomplete set of GPS parameters provided",
872 __FUNCTION__);
873 return BAD_VALUE;
874 }
875 char *endPtr;
876 errno = 0;
877 gpsLatitude = strtod(gpsLatStr, &endPtr);
878 if (errno || endPtr == gpsLatStr) {
879 ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
880 return BAD_VALUE;
881 }
882 errno = 0;
883 gpsLongitude = strtod(gpsLongStr, &endPtr);
884 if (errno || endPtr == gpsLongStr) {
885 ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
886 return BAD_VALUE;
887 }
888 errno = 0;
889 gpsAltitude = strtod(gpsAltitudeStr, &endPtr);
890 if (errno || endPtr == gpsAltitudeStr) {
891 ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
892 gpsAltitudeStr);
893 return BAD_VALUE;
894 }
895 errno = 0;
896 gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
897 if (errno || endPtr == gpsTimeStr) {
898 ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
899 return BAD_VALUE;
900 }
901 gpsProcessingMethod = gpsProcMethodStr;
902
903 gpsEnabled = true;
904 }
905
906 // WHITE_BALANCE
907 int wbMode = wbModeStringToEnum(
908 newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
909 if (wbMode != mParameters.wbMode) {
910 camera_metadata_entry_t availableWbModes =
911 staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
912 for (i = 0; i < availableWbModes.count; i++) {
913 if (wbMode == availableWbModes.data.u8[i]) break;
914 }
915 if (i == availableWbModes.count) {
916 ALOGE("%s: Requested white balance mode %s is not supported",
917 __FUNCTION__,
918 newParams.get(CameraParameters::KEY_WHITE_BALANCE));
919 return BAD_VALUE;
920 }
921 }
922
923 // EFFECT
924 int effectMode = effectModeStringToEnum(
925 newParams.get(CameraParameters::KEY_EFFECT) );
926 if (effectMode != mParameters.effectMode) {
927 camera_metadata_entry_t availableEffectModes =
928 staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
929 for (i = 0; i < availableEffectModes.count; i++) {
930 if (effectMode == availableEffectModes.data.u8[i]) break;
931 }
932 if (i == availableEffectModes.count) {
933 ALOGE("%s: Requested effect mode \"%s\" is not supported",
934 __FUNCTION__,
935 newParams.get(CameraParameters::KEY_EFFECT) );
936 return BAD_VALUE;
937 }
938 }
939
940 // ANTIBANDING
941 int antibandingMode = abModeStringToEnum(
942 newParams.get(CameraParameters::KEY_ANTIBANDING) );
943 if (antibandingMode != mParameters.antibandingMode) {
944 camera_metadata_entry_t availableAbModes =
945 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
946 for (i = 0; i < availableAbModes.count; i++) {
947 if (antibandingMode == availableAbModes.data.u8[i]) break;
948 }
949 if (i == availableAbModes.count) {
950 ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
951 __FUNCTION__,
952 newParams.get(CameraParameters::KEY_ANTIBANDING));
953 return BAD_VALUE;
954 }
955 }
956
957 // SCENE_MODE
958 int sceneMode = sceneModeStringToEnum(
959 newParams.get(CameraParameters::KEY_SCENE_MODE) );
960 if (sceneMode != mParameters.sceneMode) {
961 camera_metadata_entry_t availableSceneModes =
962 staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
963 for (i = 0; i < availableSceneModes.count; i++) {
964 if (sceneMode == availableSceneModes.data.u8[i]) break;
965 }
966 if (i == availableSceneModes.count) {
967 ALOGE("%s: Requested scene mode \"%s\" is not supported",
968 __FUNCTION__,
969 newParams.get(CameraParameters::KEY_SCENE_MODE));
970 return BAD_VALUE;
971 }
972 }
973
974 // FLASH_MODE
975 Parameters::flashMode_t flashMode = flashModeStringToEnum(
976 newParams.get(CameraParameters::KEY_FLASH_MODE) );
977 if (flashMode != mParameters.flashMode) {
978 camera_metadata_entry_t flashAvailable =
979 staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
980 if (!flashAvailable.data.u8[0] &&
981 flashMode != Parameters::FLASH_MODE_OFF) {
982 ALOGE("%s: Requested flash mode \"%s\" is not supported: "
983 "No flash on device", __FUNCTION__,
984 newParams.get(CameraParameters::KEY_FLASH_MODE));
985 return BAD_VALUE;
986 } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) {
987 camera_metadata_entry_t availableAeModes =
988 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
989 for (i = 0; i < availableAeModes.count; i++) {
990 if (flashMode == availableAeModes.data.u8[i]) break;
991 }
992 if (i == availableAeModes.count) {
993 ALOGE("%s: Requested flash mode \"%s\" is not supported",
994 __FUNCTION__,
995 newParams.get(CameraParameters::KEY_FLASH_MODE));
996 return BAD_VALUE;
997 }
998 } else if (flashMode == -1) {
999 ALOGE("%s: Requested flash mode \"%s\" is unknown",
1000 __FUNCTION__,
1001 newParams.get(CameraParameters::KEY_FLASH_MODE));
1002 return BAD_VALUE;
1003 }
1004 }
1005
1006 // FOCUS_MODE
1007 Parameters::focusMode_t focusMode = focusModeStringToEnum(
1008 newParams.get(CameraParameters::KEY_FOCUS_MODE));
1009 if (focusMode != mParameters.focusMode) {
1010 if (focusMode != Parameters::FOCUS_MODE_FIXED) {
1011 camera_metadata_entry_t minFocusDistance =
1012 staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE);
1013 if (minFocusDistance.data.f[0] == 0) {
1014 ALOGE("%s: Requested focus mode \"%s\" is not available: "
1015 "fixed focus lens",
1016 __FUNCTION__,
1017 newParams.get(CameraParameters::KEY_FOCUS_MODE));
1018 return BAD_VALUE;
1019 } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) {
1020 camera_metadata_entry_t availableFocusModes =
1021 staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
1022 for (i = 0; i < availableFocusModes.count; i++) {
1023 if (focusMode == availableFocusModes.data.u8[i]) break;
1024 }
1025 if (i == availableFocusModes.count) {
1026 ALOGE("%s: Requested focus mode \"%s\" is not supported",
1027 __FUNCTION__,
1028 newParams.get(CameraParameters::KEY_FOCUS_MODE));
1029 return BAD_VALUE;
1030 }
1031 }
1032 }
1033 }
1034
1035 // FOCUS_AREAS
1036 Vector<Parameters::Area> focusingAreas;
1037 res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
1038 &focusingAreas);
1039 size_t max3aRegions =
1040 (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0];
1041 if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
1042 if (res != OK) {
1043 ALOGE("%s: Requested focus areas are malformed: %s",
1044 __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
1045 return BAD_VALUE;
1046 }
1047
1048 // EXPOSURE_COMPENSATION
1049 int exposureCompensation =
1050 newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
1051 camera_metadata_entry_t exposureCompensationRange =
1052 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE);
1053 if (exposureCompensation < exposureCompensationRange.data.i32[0] ||
1054 exposureCompensation > exposureCompensationRange.data.i32[1]) {
1055 ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
1056 __FUNCTION__, exposureCompensation);
1057 return BAD_VALUE;
1058 }
1059
1060 // AUTO_EXPOSURE_LOCK (always supported)
1061 bool autoExposureLock = boolFromString(
1062 newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
1063
1064 // AUTO_WHITEBALANCE_LOCK (always supported)
1065 bool autoWhiteBalanceLock = boolFromString(
1066 newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
1067
1068 // METERING_AREAS
1069 Vector<Parameters::Area> meteringAreas;
1070 res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
1071 &meteringAreas);
1072 if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
1073 if (res != OK) {
1074 ALOGE("%s: Requested metering areas are malformed: %s",
1075 __FUNCTION__,
1076 newParams.get(CameraParameters::KEY_METERING_AREAS));
1077 return BAD_VALUE;
1078 }
1079
1080 // ZOOM
1081 int zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
1082 if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) {
1083 ALOGE("%s: Requested zoom level %d is not supported",
1084 __FUNCTION__, zoom);
1085 return BAD_VALUE;
1086 }
1087
1088 // VIDEO_SIZE
1089 int videoWidth, videoHeight;
1090 newParams.getVideoSize(&videoWidth, &videoHeight);
1091 if (videoWidth != mParameters.videoWidth ||
1092 videoHeight != mParameters.videoHeight) {
1093 if (mState == RECORD) {
1094 ALOGE("%s: Video size cannot be updated when recording is active!",
1095 __FUNCTION__);
1096 return BAD_VALUE;
1097 }
1098 camera_metadata_entry_t availableVideoSizes =
1099 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
1100 for (i = 0; i < availableVideoSizes.count; i += 2 ) {
1101 if (availableVideoSizes.data.i32[i] == videoWidth &&
1102 availableVideoSizes.data.i32[i+1] == videoHeight) break;
1103 }
1104 if (i == availableVideoSizes.count) {
1105 ALOGE("%s: Requested video size %d x %d is not supported",
1106 __FUNCTION__, videoWidth, videoHeight);
1107 return BAD_VALUE;
1108 }
1109 }
1110
1111 // RECORDING_HINT (always supported)
1112 bool recordingHint = boolFromString(
1113 newParams.get(CameraParameters::KEY_RECORDING_HINT) );
1114
1115 // VIDEO_STABILIZATION
1116 bool videoStabilization = boolFromString(
1117 newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
1118 camera_metadata_entry_t availableVideoStabilizationModes =
1119 staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
1120 if (videoStabilization && availableVideoStabilizationModes.count == 1) {
1121 ALOGE("%s: Video stabilization not supported", __FUNCTION__);
1122 }
1123
1124 /** Update internal parameters */
1125 mParameters.previewWidth = previewWidth;
1126 mParameters.previewHeight = previewHeight;
1127 mParameters.previewFpsRangeMin = previewFpsRangeMin;
1128 mParameters.previewFpsRangeMax = previewFpsRangeMax;
1129 mParameters.previewFps = previewFps;
1130 mParameters.previewFormat = previewFormat;
1131
1132 mParameters.pictureWidth = pictureWidth;
1133 mParameters.pictureHeight = pictureHeight;
1134
1135 mParameters.jpegThumbWidth = jpegThumbWidth;
1136 mParameters.jpegThumbHeight = jpegThumbHeight;
1137 mParameters.jpegQuality = jpegQuality;
1138 mParameters.jpegThumbQuality = jpegThumbQuality;
1139
1140 mParameters.gpsEnabled = gpsEnabled;
1141 mParameters.gpsLatitude = gpsLatitude;
1142 mParameters.gpsLongitude = gpsLongitude;
1143 mParameters.gpsAltitude = gpsAltitude;
1144 mParameters.gpsTimestamp = gpsTimestamp;
1145 mParameters.gpsProcessingMethod = gpsProcessingMethod;
1146
1147 mParameters.wbMode = wbMode;
1148 mParameters.effectMode = effectMode;
1149 mParameters.antibandingMode = antibandingMode;
1150 mParameters.sceneMode = sceneMode;
1151
1152 mParameters.flashMode = flashMode;
1153 mParameters.focusMode = focusMode;
1154
1155 mParameters.focusingAreas = focusingAreas;
1156 mParameters.exposureCompensation = exposureCompensation;
1157 mParameters.autoExposureLock = autoExposureLock;
1158 mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock;
1159 mParameters.meteringAreas = meteringAreas;
1160 mParameters.zoom = zoom;
1161
1162 mParameters.videoWidth = videoWidth;
1163 mParameters.videoHeight = videoHeight;
1164
1165 mParameters.recordingHint = recordingHint;
1166 mParameters.videoStabilization = videoStabilization;
1167
1168 updatePreviewRequest();
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001169 updateCaptureRequest();
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07001170
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001171 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001172}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001173
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001174String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001175 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001176 Mutex::Autolock icl(mICameraLock);
1177
1178 Mutex::Autolock pl(mParamsLock);
1179
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001180 // TODO: Deal with focus distances
1181 return mParamsFlattened;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001182}
1183
1184status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001185 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001186 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001187 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001188}
1189
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001190/** Device-related methods */
1191
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001192void Camera2Client::onCaptureAvailable() {
1193 ATRACE_CALL();
1194 status_t res;
1195 sp<ICameraClient> currentClient;
1196 CpuConsumer::LockedBuffer imgBuffer;
1197 {
1198 Mutex::Autolock icl(mICameraLock);
1199
1200 // TODO: Signal errors here upstream
1201 if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) {
1202 ALOGE("%s: Camera %d: Still image produced unexpectedly!",
1203 __FUNCTION__, mCameraId);
1204 return;
1205 }
1206
1207 res = mCaptureConsumer->lockNextBuffer(&imgBuffer);
1208 if (res != OK) {
1209 ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)",
1210 __FUNCTION__, mCameraId, strerror(-res), res);
1211 return;
1212 }
1213
1214 if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) {
1215 ALOGE("%s: Camera %d: Unexpected format for still image: "
1216 "%x, expected %x", __FUNCTION__, mCameraId,
1217 imgBuffer.format,
1218 HAL_PIXEL_FORMAT_BLOB);
1219 mCaptureConsumer->unlockBuffer(imgBuffer);
1220 return;
1221 }
1222
1223 // TODO: Optimize this to avoid memcopy
1224 void* captureMemory = mCaptureHeap->getBase();
1225 size_t size = mCaptureHeap->getSize();
1226 memcpy(captureMemory, imgBuffer.data, size);
1227
1228 mCaptureConsumer->unlockBuffer(imgBuffer);
1229
1230 currentClient = mCameraClient;
1231 switch (mState) {
1232 case STILL_CAPTURE:
1233 mState = STOPPED;
1234 break;
1235 case VIDEO_SNAPSHOT:
1236 mState = RECORD;
1237 break;
1238 default:
1239 ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__,
1240 mCameraId, mState);
1241 break;
1242 }
1243 }
1244 // Call outside mICameraLock to allow re-entrancy from notification
1245 if (currentClient != 0) {
1246 currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
1247 mCaptureMemory, NULL);
1248 }
1249}
1250
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001251camera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag,
1252 size_t minCount, size_t maxCount) {
1253 status_t res;
1254 camera_metadata_entry_t entry;
1255 res = find_camera_metadata_entry(mDevice->info(),
1256 tag,
1257 &entry);
1258 if (CC_UNLIKELY( res != OK )) {
1259 const char* tagSection = get_camera_metadata_section_name(tag);
1260 if (tagSection == NULL) tagSection = "<unknown>";
1261 const char* tagName = get_camera_metadata_tag_name(tag);
1262 if (tagName == NULL) tagName = "<unknown>";
1263
1264 ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)",
1265 tagSection, tagName, tag, strerror(-res), res);
1266 entry.count = 0;
1267 entry.data.u8 = NULL;
1268 } else if (CC_UNLIKELY(
1269 (minCount != 0 && entry.count < minCount) ||
1270 (maxCount != 0 && entry.count > maxCount) ) ) {
1271 const char* tagSection = get_camera_metadata_section_name(tag);
1272 if (tagSection == NULL) tagSection = "<unknown>";
1273 const char* tagName = get_camera_metadata_tag_name(tag);
1274 if (tagName == NULL) tagName = "<unknown>";
1275 ALOGE("Malformed static metadata entry '%s.%s' (%x):"
1276 "Expected between %d and %d values, but got %d values",
1277 tagSection, tagName, tag, minCount, maxCount, entry.count);
1278 entry.count = 0;
1279 entry.data.u8 = NULL;
1280 }
1281
1282 return entry;
1283}
1284
1285/** Utility methods */
1286
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001287
1288status_t Camera2Client::buildDefaultParameters() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001289 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -07001290 Mutex::Autolock pl(mParamsLock);
1291
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001292 status_t res;
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001293 CameraParameters params;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001294
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001295 camera_metadata_entry_t availableProcessedSizes =
1296 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
1297 if (!availableProcessedSizes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001298
1299 // TODO: Pick more intelligently
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001300 mParameters.previewWidth = availableProcessedSizes.data.i32[0];
1301 mParameters.previewHeight = availableProcessedSizes.data.i32[1];
1302 mParameters.videoWidth = mParameters.previewWidth;
1303 mParameters.videoHeight = mParameters.previewHeight;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001304
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001305 params.setPreviewSize(mParameters.previewWidth, mParameters.previewHeight);
1306 params.setVideoSize(mParameters.videoWidth, mParameters.videoHeight);
1307 params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
1308 String8::format("%dx%d",
1309 mParameters.previewWidth, mParameters.previewHeight));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001310 {
1311 String8 supportedPreviewSizes;
1312 for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
1313 if (i != 0) supportedPreviewSizes += ",";
1314 supportedPreviewSizes += String8::format("%dx%d",
1315 availableProcessedSizes.data.i32[i],
1316 availableProcessedSizes.data.i32[i+1]);
1317 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001318 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001319 supportedPreviewSizes);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001320 params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001321 supportedPreviewSizes);
1322 }
1323
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001324 camera_metadata_entry_t availableFpsRanges =
1325 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
1326 if (!availableFpsRanges.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001327
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001328 mParameters.previewFpsRangeMin = availableFpsRanges.data.i32[0];
1329 mParameters.previewFpsRangeMax = availableFpsRanges.data.i32[1];
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001330
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001331 params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
1332 String8::format("%d,%d",
1333 mParameters.previewFpsRangeMin,
1334 mParameters.previewFpsRangeMax));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001335
1336 {
1337 String8 supportedPreviewFpsRange;
1338 for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1339 if (i != 0) supportedPreviewFpsRange += ",";
1340 supportedPreviewFpsRange += String8::format("(%d,%d)",
1341 availableFpsRanges.data.i32[i],
1342 availableFpsRanges.data.i32[i+1]);
1343 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001344 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001345 supportedPreviewFpsRange);
1346 }
1347
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001348 mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1349 params.set(CameraParameters::KEY_PREVIEW_FORMAT,
1350 formatEnumToString(mParameters.previewFormat)); // NV21
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001351
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001352 camera_metadata_entry_t availableFormats =
1353 staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
1354
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001355 {
1356 String8 supportedPreviewFormats;
1357 bool addComma = false;
1358 for (size_t i=0; i < availableFormats.count; i++) {
1359 if (addComma) supportedPreviewFormats += ",";
1360 addComma = true;
1361 switch (availableFormats.data.i32[i]) {
1362 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001363 supportedPreviewFormats +=
1364 CameraParameters::PIXEL_FORMAT_YUV422SP;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001365 break;
1366 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001367 supportedPreviewFormats +=
1368 CameraParameters::PIXEL_FORMAT_YUV420SP;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001369 break;
1370 case HAL_PIXEL_FORMAT_YCbCr_422_I:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001371 supportedPreviewFormats +=
1372 CameraParameters::PIXEL_FORMAT_YUV422I;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001373 break;
1374 case HAL_PIXEL_FORMAT_YV12:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001375 supportedPreviewFormats +=
1376 CameraParameters::PIXEL_FORMAT_YUV420P;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001377 break;
1378 case HAL_PIXEL_FORMAT_RGB_565:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001379 supportedPreviewFormats +=
1380 CameraParameters::PIXEL_FORMAT_RGB565;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001381 break;
1382 // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
1383 case HAL_PIXEL_FORMAT_RAW_SENSOR:
1384 addComma = false;
1385 break;
1386 default:
1387 ALOGW("%s: Camera %d: Unknown preview format: %x",
1388 __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
1389 addComma = false;
1390 break;
1391 }
1392 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001393 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001394 supportedPreviewFormats);
1395 }
1396
1397 // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
1398 // still have to do something sane for them
1399
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001400 params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
1401 mParameters.previewFpsRangeMin);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001402
1403 {
1404 String8 supportedPreviewFrameRates;
1405 for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1406 if (i != 0) supportedPreviewFrameRates += ",";
1407 supportedPreviewFrameRates += String8::format("%d",
1408 availableFpsRanges.data.i32[i]);
1409 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001410 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001411 supportedPreviewFrameRates);
1412 }
1413
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001414 camera_metadata_entry_t availableJpegSizes =
1415 staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
1416 if (!availableJpegSizes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001417
1418 // TODO: Pick maximum
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001419 mParameters.pictureWidth = availableJpegSizes.data.i32[0];
1420 mParameters.pictureHeight = availableJpegSizes.data.i32[1];
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001421
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001422 params.setPictureSize(mParameters.pictureWidth,
1423 mParameters.pictureHeight);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001424
1425 {
1426 String8 supportedPictureSizes;
1427 for (size_t i=0; i < availableJpegSizes.count; i += 2) {
1428 if (i != 0) supportedPictureSizes += ",";
1429 supportedPictureSizes += String8::format("%dx%d",
1430 availableJpegSizes.data.i32[i],
1431 availableJpegSizes.data.i32[i+1]);
1432 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001433 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001434 supportedPictureSizes);
1435 }
1436
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001437 params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
1438 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
1439 CameraParameters::PIXEL_FORMAT_JPEG);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001440
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001441 camera_metadata_entry_t availableJpegThumbnailSizes =
1442 staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2);
1443 if (!availableJpegThumbnailSizes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001444
1445 // TODO: Pick default thumbnail size sensibly
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001446 mParameters.jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0];
1447 mParameters.jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1];
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001448
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001449 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
1450 mParameters.jpegThumbWidth);
1451 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
1452 mParameters.jpegThumbHeight);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001453
1454 {
1455 String8 supportedJpegThumbSizes;
1456 for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
1457 if (i != 0) supportedJpegThumbSizes += ",";
1458 supportedJpegThumbSizes += String8::format("%dx%d",
1459 availableJpegThumbnailSizes.data.i32[i],
1460 availableJpegThumbnailSizes.data.i32[i+1]);
1461 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001462 params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001463 supportedJpegThumbSizes);
1464 }
1465
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001466 mParameters.jpegThumbQuality = 90;
1467 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
1468 mParameters.jpegThumbQuality);
1469 mParameters.jpegQuality = 90;
1470 params.set(CameraParameters::KEY_JPEG_QUALITY,
1471 mParameters.jpegQuality);
1472 mParameters.jpegRotation = 0;
1473 params.set(CameraParameters::KEY_ROTATION,
1474 mParameters.jpegRotation);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001475
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001476 mParameters.gpsEnabled = false;
1477 mParameters.gpsProcessingMethod = "unknown";
1478 // GPS fields in CameraParameters are not set by implementation
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001479
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001480 mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO;
1481 params.set(CameraParameters::KEY_WHITE_BALANCE,
1482 CameraParameters::WHITE_BALANCE_AUTO);
1483
1484 camera_metadata_entry_t availableWhiteBalanceModes =
1485 staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001486 {
1487 String8 supportedWhiteBalance;
1488 bool addComma = false;
1489 for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
1490 if (addComma) supportedWhiteBalance += ",";
1491 addComma = true;
1492 switch (availableWhiteBalanceModes.data.u8[i]) {
1493 case ANDROID_CONTROL_AWB_AUTO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001494 supportedWhiteBalance +=
1495 CameraParameters::WHITE_BALANCE_AUTO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001496 break;
1497 case ANDROID_CONTROL_AWB_INCANDESCENT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001498 supportedWhiteBalance +=
1499 CameraParameters::WHITE_BALANCE_INCANDESCENT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001500 break;
1501 case ANDROID_CONTROL_AWB_FLUORESCENT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001502 supportedWhiteBalance +=
1503 CameraParameters::WHITE_BALANCE_FLUORESCENT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001504 break;
1505 case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001506 supportedWhiteBalance +=
1507 CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001508 break;
1509 case ANDROID_CONTROL_AWB_DAYLIGHT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001510 supportedWhiteBalance +=
1511 CameraParameters::WHITE_BALANCE_DAYLIGHT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001512 break;
1513 case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001514 supportedWhiteBalance +=
1515 CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001516 break;
1517 case ANDROID_CONTROL_AWB_TWILIGHT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001518 supportedWhiteBalance +=
1519 CameraParameters::WHITE_BALANCE_TWILIGHT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001520 break;
1521 case ANDROID_CONTROL_AWB_SHADE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001522 supportedWhiteBalance +=
1523 CameraParameters::WHITE_BALANCE_SHADE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001524 break;
1525 // Skipping values not mappable to v1 API
1526 case ANDROID_CONTROL_AWB_OFF:
1527 addComma = false;
1528 break;
1529 default:
1530 ALOGW("%s: Camera %d: Unknown white balance value: %d",
1531 __FUNCTION__, mCameraId,
1532 availableWhiteBalanceModes.data.u8[i]);
1533 addComma = false;
1534 break;
1535 }
1536 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001537 params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001538 supportedWhiteBalance);
1539 }
1540
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001541 mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF;
1542 params.set(CameraParameters::KEY_EFFECT,
1543 CameraParameters::EFFECT_NONE);
1544
1545 camera_metadata_entry_t availableEffects =
1546 staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
1547 if (!availableEffects.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001548 {
1549 String8 supportedEffects;
1550 bool addComma = false;
1551 for (size_t i=0; i < availableEffects.count; i++) {
1552 if (addComma) supportedEffects += ",";
1553 addComma = true;
1554 switch (availableEffects.data.u8[i]) {
1555 case ANDROID_CONTROL_EFFECT_OFF:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001556 supportedEffects +=
1557 CameraParameters::EFFECT_NONE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001558 break;
1559 case ANDROID_CONTROL_EFFECT_MONO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001560 supportedEffects +=
1561 CameraParameters::EFFECT_MONO;
1562 break;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001563 case ANDROID_CONTROL_EFFECT_NEGATIVE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001564 supportedEffects +=
1565 CameraParameters::EFFECT_NEGATIVE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001566 break;
1567 case ANDROID_CONTROL_EFFECT_SOLARIZE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001568 supportedEffects +=
1569 CameraParameters::EFFECT_SOLARIZE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001570 break;
1571 case ANDROID_CONTROL_EFFECT_SEPIA:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001572 supportedEffects +=
1573 CameraParameters::EFFECT_SEPIA;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001574 break;
1575 case ANDROID_CONTROL_EFFECT_POSTERIZE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001576 supportedEffects +=
1577 CameraParameters::EFFECT_POSTERIZE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001578 break;
1579 case ANDROID_CONTROL_EFFECT_WHITEBOARD:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001580 supportedEffects +=
1581 CameraParameters::EFFECT_WHITEBOARD;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001582 break;
1583 case ANDROID_CONTROL_EFFECT_BLACKBOARD:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001584 supportedEffects +=
1585 CameraParameters::EFFECT_BLACKBOARD;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001586 break;
1587 case ANDROID_CONTROL_EFFECT_AQUA:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001588 supportedEffects +=
1589 CameraParameters::EFFECT_AQUA;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001590 break;
1591 default:
1592 ALOGW("%s: Camera %d: Unknown effect value: %d",
1593 __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
1594 addComma = false;
1595 break;
1596 }
1597 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001598 params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001599 }
1600
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001601 mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
1602 params.set(CameraParameters::KEY_ANTIBANDING,
1603 CameraParameters::ANTIBANDING_AUTO);
1604
1605 camera_metadata_entry_t availableAntibandingModes =
1606 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
1607 if (!availableAntibandingModes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001608 {
1609 String8 supportedAntibanding;
1610 bool addComma = false;
1611 for (size_t i=0; i < availableAntibandingModes.count; i++) {
1612 if (addComma) supportedAntibanding += ",";
1613 addComma = true;
1614 switch (availableAntibandingModes.data.u8[i]) {
1615 case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001616 supportedAntibanding +=
1617 CameraParameters::ANTIBANDING_OFF;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001618 break;
1619 case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001620 supportedAntibanding +=
1621 CameraParameters::ANTIBANDING_50HZ;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001622 break;
1623 case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001624 supportedAntibanding +=
1625 CameraParameters::ANTIBANDING_60HZ;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001626 break;
1627 case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001628 supportedAntibanding +=
1629 CameraParameters::ANTIBANDING_AUTO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001630 break;
1631 default:
1632 ALOGW("%s: Camera %d: Unknown antibanding value: %d",
1633 __FUNCTION__, mCameraId,
1634 availableAntibandingModes.data.u8[i]);
1635 addComma = false;
1636 break;
1637 }
1638 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001639 params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001640 supportedAntibanding);
1641 }
1642
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001643 mParameters.sceneMode = ANDROID_CONTROL_OFF;
1644 params.set(CameraParameters::KEY_SCENE_MODE,
1645 CameraParameters::SCENE_MODE_AUTO);
1646
1647 camera_metadata_entry_t availableSceneModes =
1648 staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
1649 if (!availableSceneModes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001650 {
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001651 String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001652 bool addComma = true;
1653 bool noSceneModes = false;
1654 for (size_t i=0; i < availableSceneModes.count; i++) {
1655 if (addComma) supportedSceneModes += ",";
1656 addComma = true;
1657 switch (availableSceneModes.data.u8[i]) {
1658 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
1659 noSceneModes = true;
1660 break;
1661 case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
1662 // Not in old API
1663 addComma = false;
1664 break;
1665 case ANDROID_CONTROL_SCENE_MODE_ACTION:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001666 supportedSceneModes +=
1667 CameraParameters::SCENE_MODE_ACTION;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001668 break;
1669 case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001670 supportedSceneModes +=
1671 CameraParameters::SCENE_MODE_PORTRAIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001672 break;
1673 case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001674 supportedSceneModes +=
1675 CameraParameters::SCENE_MODE_LANDSCAPE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001676 break;
1677 case ANDROID_CONTROL_SCENE_MODE_NIGHT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001678 supportedSceneModes +=
1679 CameraParameters::SCENE_MODE_NIGHT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001680 break;
1681 case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001682 supportedSceneModes +=
1683 CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001684 break;
1685 case ANDROID_CONTROL_SCENE_MODE_THEATRE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001686 supportedSceneModes +=
1687 CameraParameters::SCENE_MODE_THEATRE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001688 break;
1689 case ANDROID_CONTROL_SCENE_MODE_BEACH:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001690 supportedSceneModes +=
1691 CameraParameters::SCENE_MODE_BEACH;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001692 break;
1693 case ANDROID_CONTROL_SCENE_MODE_SNOW:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001694 supportedSceneModes +=
1695 CameraParameters::SCENE_MODE_SNOW;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001696 break;
1697 case ANDROID_CONTROL_SCENE_MODE_SUNSET:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001698 supportedSceneModes +=
1699 CameraParameters::SCENE_MODE_SUNSET;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001700 break;
1701 case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001702 supportedSceneModes +=
1703 CameraParameters::SCENE_MODE_STEADYPHOTO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001704 break;
1705 case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001706 supportedSceneModes +=
1707 CameraParameters::SCENE_MODE_FIREWORKS;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001708 break;
1709 case ANDROID_CONTROL_SCENE_MODE_SPORTS:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001710 supportedSceneModes +=
1711 CameraParameters::SCENE_MODE_SPORTS;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001712 break;
1713 case ANDROID_CONTROL_SCENE_MODE_PARTY:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001714 supportedSceneModes +=
1715 CameraParameters::SCENE_MODE_PARTY;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001716 break;
1717 case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001718 supportedSceneModes +=
1719 CameraParameters::SCENE_MODE_CANDLELIGHT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001720 break;
1721 case ANDROID_CONTROL_SCENE_MODE_BARCODE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001722 supportedSceneModes +=
1723 CameraParameters::SCENE_MODE_BARCODE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001724 break;
1725 default:
1726 ALOGW("%s: Camera %d: Unknown scene mode value: %d",
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001727 __FUNCTION__, mCameraId,
1728 availableSceneModes.data.u8[i]);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001729 addComma = false;
1730 break;
1731 }
1732 }
1733 if (!noSceneModes) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001734 params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001735 supportedSceneModes);
1736 }
1737 }
1738
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001739 camera_metadata_entry_t flashAvailable =
1740 staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
1741 if (!flashAvailable.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001742
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001743 camera_metadata_entry_t availableAeModes =
1744 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
1745 if (!availableAeModes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001746
1747 if (flashAvailable.data.u8[0]) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001748 mParameters.flashMode = Parameters::FLASH_MODE_AUTO;
1749 params.set(CameraParameters::KEY_FLASH_MODE,
1750 CameraParameters::FLASH_MODE_AUTO);
1751
1752 String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
1753 supportedFlashModes = supportedFlashModes +
1754 "," + CameraParameters::FLASH_MODE_AUTO +
1755 "," + CameraParameters::FLASH_MODE_ON +
1756 "," + CameraParameters::FLASH_MODE_TORCH;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001757 for (size_t i=0; i < availableAeModes.count; i++) {
1758 if (availableAeModes.data.u8[i] ==
1759 ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001760 supportedFlashModes = supportedFlashModes + "," +
1761 CameraParameters::FLASH_MODE_RED_EYE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001762 break;
1763 }
1764 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001765 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001766 supportedFlashModes);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001767 } else {
1768 mParameters.flashMode = Parameters::FLASH_MODE_OFF;
1769 params.set(CameraParameters::KEY_FLASH_MODE,
1770 CameraParameters::FLASH_MODE_OFF);
1771 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
1772 CameraParameters::FLASH_MODE_OFF);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001773 }
1774
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001775 camera_metadata_entry_t minFocusDistance =
1776 staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
1777 if (!minFocusDistance.count) return NO_INIT;
1778
1779 camera_metadata_entry_t availableAfModes =
1780 staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
1781 if (!availableAfModes.count) return NO_INIT;
1782
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001783 if (minFocusDistance.data.f[0] == 0) {
1784 // Fixed-focus lens
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001785 mParameters.focusMode = Parameters::FOCUS_MODE_FIXED;
1786 params.set(CameraParameters::KEY_FOCUS_MODE,
1787 CameraParameters::FOCUS_MODE_FIXED);
1788 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
1789 CameraParameters::FOCUS_MODE_FIXED);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001790 } else {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001791 mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
1792 params.set(CameraParameters::KEY_FOCUS_MODE,
1793 CameraParameters::FOCUS_MODE_AUTO);
1794 String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED);
1795 supportedFocusModes = supportedFocusModes + "," +
1796 CameraParameters::FOCUS_MODE_INFINITY;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001797 bool addComma = true;
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001798
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001799 for (size_t i=0; i < availableAfModes.count; i++) {
1800 if (addComma) supportedFocusModes += ",";
1801 addComma = true;
1802 switch (availableAfModes.data.u8[i]) {
1803 case ANDROID_CONTROL_AF_AUTO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001804 supportedFocusModes +=
1805 CameraParameters::FOCUS_MODE_AUTO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001806 break;
1807 case ANDROID_CONTROL_AF_MACRO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001808 supportedFocusModes +=
1809 CameraParameters::FOCUS_MODE_MACRO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001810 break;
1811 case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001812 supportedFocusModes +=
1813 CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001814 break;
1815 case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001816 supportedFocusModes +=
1817 CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001818 break;
1819 case ANDROID_CONTROL_AF_EDOF:
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001820 supportedFocusModes +=
1821 CameraParameters::FOCUS_MODE_EDOF;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001822 break;
Eino-Ville Talvalabd47b7b2012-06-07 10:34:20 -07001823 // Not supported in old API
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001824 case ANDROID_CONTROL_AF_OFF:
1825 addComma = false;
1826 break;
1827 default:
1828 ALOGW("%s: Camera %d: Unknown AF mode value: %d",
1829 __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
1830 addComma = false;
1831 break;
1832 }
1833 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001834 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001835 supportedFocusModes);
1836 }
1837
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001838 camera_metadata_entry_t max3aRegions =
1839 staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
1840 if (!max3aRegions.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001841
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001842 params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001843 max3aRegions.data.i32[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001844 params.set(CameraParameters::KEY_FOCUS_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001845 "(0,0,0,0,0)");
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001846 mParameters.focusingAreas.clear();
1847 mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001848
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001849 camera_metadata_entry_t availableFocalLengths =
1850 staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
1851 if (!availableFocalLengths.count) return NO_INIT;
1852
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001853 float minFocalLength = availableFocalLengths.data.f[0];
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001854 params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001855
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001856 camera_metadata_entry_t sensorSize =
1857 staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
1858 if (!sensorSize.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001859
1860 // The fields of view here assume infinity focus, maximum wide angle
1861 float horizFov = 180 / M_PI *
1862 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
1863 float vertFov = 180 / M_PI *
1864 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001865 params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
1866 params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001867
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001868 mParameters.exposureCompensation = 0;
1869 params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
1870 mParameters.exposureCompensation);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001871
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001872 camera_metadata_entry_t exposureCompensationRange =
1873 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
1874 if (!exposureCompensationRange.count) return NO_INIT;
1875
1876 params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001877 exposureCompensationRange.data.i32[1]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001878 params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001879 exposureCompensationRange.data.i32[0]);
1880
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001881 camera_metadata_entry_t exposureCompensationStep =
1882 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
1883 if (!exposureCompensationStep.count) return NO_INIT;
1884
1885 params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001886 exposureCompensationStep.data.r[0].numerator /
1887 exposureCompensationStep.data.r[0].denominator);
1888
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001889 mParameters.autoExposureLock = false;
1890 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
1891 CameraParameters::FALSE);
1892 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
1893 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001894
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001895 mParameters.autoWhiteBalanceLock = false;
1896 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
1897 CameraParameters::FALSE);
1898 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
1899 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001900
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001901 mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
1902 params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001903 max3aRegions.data.i32[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001904 params.set(CameraParameters::KEY_METERING_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001905 "(0,0,0,0,0)");
1906
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001907 mParameters.zoom = 0;
1908 params.set(CameraParameters::KEY_ZOOM, mParameters.zoom);
1909 params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001910
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001911 camera_metadata_entry_t maxDigitalZoom =
1912 staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
1913 if (!maxDigitalZoom.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001914
1915 {
1916 String8 zoomRatios;
1917 float zoom = 1.f;
1918 float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001919 (NUM_ZOOM_STEPS-1);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001920 bool addComma = false;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001921 for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001922 if (addComma) zoomRatios += ",";
1923 addComma = true;
1924 zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
1925 zoom += zoomIncrement;
1926 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001927 params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001928 }
1929
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001930 params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
1931 CameraParameters::TRUE);
1932 params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
1933 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001934
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001935 params.set(CameraParameters::KEY_FOCUS_DISTANCES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001936 "Infinity,Infinity,Infinity");
1937
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001938 camera_metadata_entry_t maxFacesDetected =
1939 staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
1940 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001941 maxFacesDetected.data.i32[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001942 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001943 0);
1944
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001945 params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
1946 formatEnumToString(HAL_PIXEL_FORMAT_YCrCb_420_SP));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001947
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001948 params.set(CameraParameters::KEY_RECORDING_HINT,
1949 CameraParameters::FALSE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001950
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001951 params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
1952 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001953
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001954 params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
1955 CameraParameters::FALSE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001956
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001957 camera_metadata_entry_t availableVideoStabilizationModes =
1958 staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
1959 if (!availableVideoStabilizationModes.count) return NO_INIT;
1960
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001961 if (availableVideoStabilizationModes.count > 1) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001962 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
1963 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001964 } else {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001965 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
1966 CameraParameters::FALSE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001967 }
1968
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001969 mParamsFlattened = params.flatten();
1970
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001971 return OK;
1972}
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001973
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001974status_t Camera2Client::updatePreviewRequest() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001975 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001976 status_t res;
1977 if (mPreviewRequest == NULL) {
1978 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
1979 &mPreviewRequest);
1980 if (res != OK) {
1981 ALOGE("%s: Camera %d: Unable to create default preview request: "
1982 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1983 return res;
1984 }
1985 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001986 // TODO: Adjust for params changes
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001987 return OK;
1988}
1989
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -07001990status_t Camera2Client::updateCaptureStream() {
1991 status_t res;
1992 // Find out buffer size for JPEG
1993 camera_metadata_entry_t maxJpegSize =
1994 staticInfo(ANDROID_JPEG_MAX_SIZE);
1995 if (maxJpegSize.count == 0) {
1996 ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!",
1997 __FUNCTION__, mCameraId);
1998 return INVALID_OPERATION;
1999 }
2000
2001 if (mCaptureConsumer == 0) {
2002 // Create CPU buffer queue endpoint
2003 mCaptureConsumer = new CpuConsumer(1);
2004 mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this));
2005 mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer"));
2006 mCaptureWindow = new SurfaceTextureClient(
2007 mCaptureConsumer->getProducerInterface());
2008 // Create memory for API consumption
2009 mCaptureHeap = new MemoryHeapBase(maxJpegSize.data.i32[0], 0,
2010 "Camera2Client::CaptureHeap");
2011 if (mCaptureHeap->getSize() == 0) {
2012 ALOGE("%s: Camera %d: Unable to allocate memory for capture",
2013 __FUNCTION__, mCameraId);
2014 return NO_MEMORY;
2015 }
2016 mCaptureMemory = new MemoryBase(mCaptureHeap,
2017 0, maxJpegSize.data.i32[0]);
2018 }
2019 if (mCaptureStreamId == NO_STREAM) {
2020 // Create stream for HAL production
2021 res = mDevice->createStream(mCaptureWindow,
2022 mParameters.pictureWidth, mParameters.pictureHeight,
2023 HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0],
2024 &mCaptureStreamId);
2025 if (res != OK) {
2026 ALOGE("%s: Camera %d: Can't create output stream for capture: "
2027 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2028 return res;
2029 }
2030
2031 } else {
2032 // Check if stream parameters have to change
2033 uint32_t currentWidth, currentHeight;
2034 res = mDevice->getStreamInfo(mCaptureStreamId,
2035 &currentWidth, &currentHeight, 0);
2036 if (res != OK) {
2037 ALOGE("%s: Camera %d: Error querying capture output stream info: "
2038 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2039 return res;
2040 }
2041 if (currentWidth != (uint32_t)mParameters.pictureWidth ||
2042 currentHeight != (uint32_t)mParameters.pictureHeight) {
2043 res = mDevice->deleteStream(mCaptureStreamId);
2044 if (res != OK) {
2045 ALOGE("%s: Camera %d: Unable to delete old output stream "
2046 "for capture: %s (%d)", __FUNCTION__, mCameraId,
2047 strerror(-res), res);
2048 return res;
2049 }
2050 mCaptureStreamId = NO_STREAM;
2051 return updateCaptureStream();
2052 }
2053 }
2054 return OK;
2055}
2056status_t Camera2Client::updateCaptureRequest() {
2057 ATRACE_CALL();
2058 status_t res;
2059 if (mCaptureRequest == NULL) {
2060 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE,
2061 &mCaptureRequest);
2062 if (res != OK) {
2063 ALOGE("%s: Camera %d: Unable to create default still image request:"
2064 " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2065 return res;
2066 }
2067 }
2068 // TODO: Adjust for params changes
2069 return OK;
2070}
2071
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07002072int Camera2Client::formatStringToEnum(const char *format) {
2073 return
2074 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ?
2075 HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
2076 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ?
2077 HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
2078 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ?
2079 HAL_PIXEL_FORMAT_YCbCr_422_I : // YUY2
2080 !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ?
2081 HAL_PIXEL_FORMAT_YV12 : // YV12
2082 !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ?
2083 HAL_PIXEL_FORMAT_RGB_565 : // RGB565
2084 !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ?
2085 HAL_PIXEL_FORMAT_RGBA_8888 : // RGB8888
2086 !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ?
2087 HAL_PIXEL_FORMAT_RAW_SENSOR : // Raw sensor data
2088 -1;
2089}
2090
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07002091const char* Camera2Client::formatEnumToString(int format) {
2092 const char *fmt;
2093 switch(format) {
2094 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
2095 fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
2096 break;
2097 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
2098 fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
2099 break;
2100 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
2101 fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
2102 break;
2103 case HAL_PIXEL_FORMAT_YV12: // YV12
2104 fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
2105 break;
2106 case HAL_PIXEL_FORMAT_RGB_565: // RGB565
2107 fmt = CameraParameters::PIXEL_FORMAT_RGB565;
2108 break;
2109 case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888
2110 fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
2111 break;
2112 case HAL_PIXEL_FORMAT_RAW_SENSOR:
2113 ALOGW("Raw sensor preview format requested.");
2114 fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
2115 break;
2116 default:
2117 ALOGE("%s: Unknown preview format: %x",
2118 __FUNCTION__, format);
2119 fmt = NULL;
2120 break;
2121 }
2122 return fmt;
2123}
Eino-Ville Talvala6861a4e2012-06-07 10:32:12 -07002124
2125int Camera2Client::wbModeStringToEnum(const char *wbMode) {
2126 return
2127 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
2128 ANDROID_CONTROL_AWB_AUTO :
2129 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
2130 ANDROID_CONTROL_AWB_INCANDESCENT :
2131 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
2132 ANDROID_CONTROL_AWB_FLUORESCENT :
2133 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
2134 ANDROID_CONTROL_AWB_WARM_FLUORESCENT :
2135 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
2136 ANDROID_CONTROL_AWB_DAYLIGHT :
2137 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
2138 ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT :
2139 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
2140 ANDROID_CONTROL_AWB_TWILIGHT :
2141 !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
2142 ANDROID_CONTROL_AWB_SHADE :
2143 -1;
2144}
2145
2146int Camera2Client::effectModeStringToEnum(const char *effectMode) {
2147 return
2148 !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
2149 ANDROID_CONTROL_EFFECT_OFF :
2150 !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
2151 ANDROID_CONTROL_EFFECT_MONO :
2152 !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
2153 ANDROID_CONTROL_EFFECT_NEGATIVE :
2154 !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
2155 ANDROID_CONTROL_EFFECT_SOLARIZE :
2156 !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
2157 ANDROID_CONTROL_EFFECT_SEPIA :
2158 !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
2159 ANDROID_CONTROL_EFFECT_POSTERIZE :
2160 !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
2161 ANDROID_CONTROL_EFFECT_WHITEBOARD :
2162 !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
2163 ANDROID_CONTROL_EFFECT_BLACKBOARD :
2164 !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
2165 ANDROID_CONTROL_EFFECT_AQUA :
2166 -1;
2167}
2168
2169int Camera2Client::abModeStringToEnum(const char *abMode) {
2170 return
2171 !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
2172 ANDROID_CONTROL_AE_ANTIBANDING_AUTO :
2173 !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
2174 ANDROID_CONTROL_AE_ANTIBANDING_OFF :
2175 !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
2176 ANDROID_CONTROL_AE_ANTIBANDING_50HZ :
2177 !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
2178 ANDROID_CONTROL_AE_ANTIBANDING_60HZ :
2179 -1;
2180}
2181
2182int Camera2Client::sceneModeStringToEnum(const char *sceneMode) {
2183 return
2184 !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
2185 ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
2186 !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
2187 ANDROID_CONTROL_SCENE_MODE_ACTION :
2188 !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
2189 ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
2190 !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
2191 ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
2192 !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
2193 ANDROID_CONTROL_SCENE_MODE_NIGHT :
2194 !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
2195 ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
2196 !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
2197 ANDROID_CONTROL_SCENE_MODE_THEATRE :
2198 !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
2199 ANDROID_CONTROL_SCENE_MODE_BEACH :
2200 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
2201 ANDROID_CONTROL_SCENE_MODE_SNOW :
2202 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
2203 ANDROID_CONTROL_SCENE_MODE_SUNSET :
2204 !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
2205 ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
2206 !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
2207 ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
2208 !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
2209 ANDROID_CONTROL_SCENE_MODE_SPORTS :
2210 !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
2211 ANDROID_CONTROL_SCENE_MODE_PARTY :
2212 !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
2213 ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
2214 !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
2215 ANDROID_CONTROL_SCENE_MODE_BARCODE:
2216 -1;
2217}
2218
2219Camera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum(
2220 const char *flashMode) {
2221 return
2222 !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
2223 Parameters::FLASH_MODE_OFF :
2224 !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
2225 Parameters::FLASH_MODE_AUTO :
2226 !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
2227 Parameters::FLASH_MODE_ON :
2228 !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
2229 Parameters::FLASH_MODE_RED_EYE :
2230 !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
2231 Parameters::FLASH_MODE_TORCH :
2232 Parameters::FLASH_MODE_INVALID;
2233}
2234
2235Camera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum(
2236 const char *focusMode) {
2237 return
2238 !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
2239 Parameters::FOCUS_MODE_AUTO :
2240 !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
2241 Parameters::FOCUS_MODE_INFINITY :
2242 !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
2243 Parameters::FOCUS_MODE_MACRO :
2244 !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
2245 Parameters::FOCUS_MODE_FIXED :
2246 !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
2247 Parameters::FOCUS_MODE_EDOF :
2248 !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
2249 Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
2250 !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
2251 Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
2252 Parameters::FOCUS_MODE_INVALID;
2253}
2254
2255status_t Camera2Client::parseAreas(const char *areasCStr,
2256 Vector<Parameters::Area> *areas) {
2257 static const size_t NUM_FIELDS = 5;
2258 areas->clear();
2259 if (areasCStr == NULL) {
2260 // If no key exists, use default (0,0,0,0,0)
2261 areas->push();
2262 return OK;
2263 }
2264 String8 areasStr(areasCStr);
2265 ssize_t areaStart = areasStr.find("(", 0) + 1;
2266 while (areaStart != 0) {
2267 const char* area = areasStr.string() + areaStart;
2268 char *numEnd;
2269 int vals[NUM_FIELDS];
2270 for (size_t i = 0; i < NUM_FIELDS; i++) {
2271 errno = 0;
2272 vals[i] = strtol(area, &numEnd, 10);
2273 if (errno || numEnd == area) return BAD_VALUE;
2274 area = numEnd + 1;
2275 }
2276 areas->push(Parameters::Area(
2277 vals[0], vals[1], vals[2], vals[3], vals[4]) );
2278 areaStart = areasStr.find("(", areaStart) + 1;
2279 }
2280 return OK;
2281}
2282
2283status_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas,
2284 size_t maxRegions) {
2285 // Definition of valid area can be found in
2286 // include/camera/CameraParameters.h
2287 if (areas.size() == 0) return BAD_VALUE;
2288 if (areas.size() == 1) {
2289 if (areas[0].left == 0 &&
2290 areas[0].top == 0 &&
2291 areas[0].right == 0 &&
2292 areas[0].bottom == 0 &&
2293 areas[0].weight == 0) {
2294 // Single (0,0,0,0,0) entry is always valid (== driver decides)
2295 return OK;
2296 }
2297 }
2298 if (areas.size() > maxRegions) {
2299 ALOGE("%s: Too many areas requested: %d",
2300 __FUNCTION__, areas.size());
2301 return BAD_VALUE;
2302 }
2303
2304 for (Vector<Parameters::Area>::const_iterator a = areas.begin();
2305 a != areas.end(); a++) {
2306 if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
2307 if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
2308 if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
2309 if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
2310 if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
2311 if (a->left >= a->right) return BAD_VALUE;
2312 if (a->top >= a->bottom) return BAD_VALUE;
2313 }
2314 return OK;
2315}
2316
2317bool Camera2Client::boolFromString(const char *boolStr) {
2318 return !boolStr ? false :
2319 !strcmp(boolStr, CameraParameters::TRUE) ? true :
2320 false;
2321}
2322
2323
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07002324} // namespace android