blob: 97dbade26f4930dd0e3df40058693d2866e8c391 [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 Talvala6db981c2012-05-21 18:54:30 -070055 mPreviewStreamId(NO_PREVIEW_STREAM),
56 mPreviewRequest(NULL)
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070057{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070058 ATRACE_CALL();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070059
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070060 mDevice = new Camera2Device(cameraId);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070061}
62
63status_t Camera2Client::initialize(camera_module_t *module)
64{
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070065 ATRACE_CALL();
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070066 status_t res;
67
68 res = mDevice->initialize(module);
69 if (res != OK) {
70 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
71 __FUNCTION__, mCameraId, strerror(-res), res);
72 return NO_INIT;
73 }
74
75 res = buildDefaultParameters();
76 if (res != OK) {
77 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
78 __FUNCTION__, mCameraId, strerror(-res), res);
79 return NO_INIT;
80 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -070081
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070082 if (gLogLevel >= 1) {
83 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
84 mCameraId);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -070085 ALOGD("%s", mParamsFlattened.string());
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070086 }
87
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -070088 mState = STOPPED;
89
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070090 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070091}
92
93Camera2Client::~Camera2Client() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -070094 ATRACE_CALL();
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070095 mDestructionStarted = true;
96
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070097 disconnect();
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -070098
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070099}
100
101status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700102 String8 result;
103 result.appendFormat("Client2[%d] (%p) PID: %d:\n",
104 mCameraId,
105 getCameraClient()->asBinder().get(),
106 mClientPid);
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700107 result.append(" State: ");
108#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
109
110 switch (mState) {
111 CASE_APPEND_ENUM(NOT_INITIALIZED)
112 CASE_APPEND_ENUM(STOPPED)
113 CASE_APPEND_ENUM(WAITING_FOR_PREVIEW_WINDOW)
114 CASE_APPEND_ENUM(PREVIEW)
115 CASE_APPEND_ENUM(RECORD)
116 CASE_APPEND_ENUM(STILL_CAPTURE)
117 default: result.append("UNKNOWN\n"); break;
118 }
119
120 result.append(" Current parameters:\n");
121 result.appendFormat(" Preview size: %d x %d\n",
122 mParameters.previewWidth, mParameters.previewHeight);
123 result.appendFormat(" Preview FPS range: %d - %d\n",
124 mParameters.previewFpsRangeMin, mParameters.previewFpsRangeMax);
125 result.appendFormat(" Preview HAL pixel format: 0x%x\n",
126 mParameters.previewFormat);
127 result.appendFormat(" Picture size: %d x %d\n",
128 mParameters.pictureWidth, mParameters.pictureHeight);
129 result.appendFormat(" Jpeg thumbnail size: %d x %d\n",
130 mParameters.jpegThumbWidth, mParameters.jpegThumbHeight);
131 result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n",
132 mParameters.jpegQuality, mParameters.jpegThumbQuality);
133 result.appendFormat(" Jpeg rotation: %d\n", mParameters.jpegRotation);
134 result.appendFormat(" GPS tags %s\n",
135 mParameters.gpsEnabled ? "enabled" : "disabled");
136 if (mParameters.gpsEnabled) {
137 result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n",
138 mParameters.gpsLatitude, mParameters.gpsLongitude,
139 mParameters.gpsAltitude);
140 result.appendFormat(" GPS timestamp: %lld\n",
141 mParameters.gpsTimestamp);
142 result.appendFormat(" GPS processing method: %s\n",
143 mParameters.gpsProcessingMethod.string());
144 }
145
146 result.append(" White balance mode: ");
147 switch (mParameters.wbMode) {
148 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
149 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
150 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
151 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
152 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
153 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
154 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
155 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
156 default: result.append("UNKNOWN\n");
157 }
158
159 result.append(" Effect mode: ");
160 switch (mParameters.effectMode) {
161 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
162 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
163 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
164 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
165 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
166 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
167 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
168 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
169 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
170 default: result.append("UNKNOWN\n");
171 }
172
173 result.append(" Antibanding mode: ");
174 switch (mParameters.antibandingMode) {
175 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
176 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
177 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
178 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
179 default: result.append("UNKNOWN\n");
180 }
181
182 result.append(" Scene mode: ");
183 switch (mParameters.sceneMode) {
184 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
185 result.append("AUTO\n"); break;
186 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
187 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
188 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
189 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
190 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
191 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
192 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
193 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
194 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
195 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
196 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
197 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
198 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
199 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
200 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
201 default: result.append("UNKNOWN\n");
202 }
203
204 result.append(" Flash mode: ");
205 switch (mParameters.flashMode) {
206 CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
207 CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
208 CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
209 CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
210 CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
211 CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
212 default: result.append("UNKNOWN\n");
213 }
214
215 result.append(" Focus mode: ");
216 switch (mParameters.focusMode) {
217 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
218 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
219 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
220 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
221 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
222 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
223 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
224 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
225 default: result.append("UNKNOWN\n");
226 }
227
228 result.append(" Focusing areas:\n");
229 for (size_t i = 0; i < mParameters.focusingAreas.size(); i++) {
230 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
231 mParameters.focusingAreas[i].left,
232 mParameters.focusingAreas[i].top,
233 mParameters.focusingAreas[i].right,
234 mParameters.focusingAreas[i].bottom,
235 mParameters.focusingAreas[i].weight);
236 }
237
238 result.appendFormat(" Exposure compensation index: %d\n",
239 mParameters.exposureCompensation);
240
241 result.appendFormat(" AE lock %s, AWB lock %s\n",
242 mParameters.autoExposureLock ? "enabled" : "disabled",
243 mParameters.autoWhiteBalanceLock ? "enabled" : "disabled" );
244
245 result.appendFormat(" Metering areas:\n");
246 for (size_t i = 0; i < mParameters.meteringAreas.size(); i++) {
247 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n",
248 mParameters.meteringAreas[i].left,
249 mParameters.meteringAreas[i].top,
250 mParameters.meteringAreas[i].right,
251 mParameters.meteringAreas[i].bottom,
252 mParameters.meteringAreas[i].weight);
253 }
254
255 result.appendFormat(" Zoom index: %d\n", mParameters.zoom);
256 result.appendFormat(" Video size: %d x %d\n", mParameters.videoWidth,
257 mParameters.videoHeight);
258
259 result.appendFormat(" Recording hint is %s\n",
260 mParameters.recordingHint ? "set" : "not set");
261
262 result.appendFormat(" Video stabilization is %s\n",
263 mParameters.videoStabilization ? "enabled" : "disabled");
264
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700265 write(fd, result.string(), result.size());
Eino-Ville Talvala7f610842012-06-07 10:20:51 -0700266
267 // TODO: Dump Camera2Device
268
269#undef CASE_APPEND_ENUM
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700270 return NO_ERROR;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700271}
272
273// ICamera interface
274
275void Camera2Client::disconnect() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700276 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700277 Mutex::Autolock icl(mICameraLock);
278
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700279 if (mDevice == 0) return;
280
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700281 stopPreviewLocked();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700282
283 if (mPreviewStreamId != NO_PREVIEW_STREAM) {
284 mDevice->deleteStream(mPreviewStreamId);
285 mPreviewStreamId = NO_PREVIEW_STREAM;
286 }
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700287
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700288 CameraService::Client::disconnect();
289}
290
291status_t Camera2Client::connect(const sp<ICameraClient>& client) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700292 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700293 Mutex::Autolock icl(mICameraLock);
294
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700295 return BAD_VALUE;
296}
297
298status_t Camera2Client::lock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700299 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700300 Mutex::Autolock icl(mICameraLock);
301
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700302 return BAD_VALUE;
303}
304
305status_t Camera2Client::unlock() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700306 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700307 Mutex::Autolock icl(mICameraLock);
308
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700309 return BAD_VALUE;
310}
311
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700312status_t Camera2Client::setPreviewDisplay(
313 const sp<Surface>& surface) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700314 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700315 Mutex::Autolock icl(mICameraLock);
316
317 if (mState >= PREVIEW) return INVALID_OPERATION;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700318
319 sp<IBinder> binder;
320 sp<ANativeWindow> window;
321 if (surface != 0) {
322 binder = surface->asBinder();
323 window = surface;
324 }
325
326 return setPreviewWindow(binder,window);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700327}
328
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700329status_t Camera2Client::setPreviewTexture(
330 const sp<ISurfaceTexture>& surfaceTexture) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700331 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700332 Mutex::Autolock icl(mICameraLock);
333
334 if (mState >= PREVIEW) return INVALID_OPERATION;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700335
336 sp<IBinder> binder;
337 sp<ANativeWindow> window;
338 if (surfaceTexture != 0) {
339 binder = surfaceTexture->asBinder();
340 window = new SurfaceTextureClient(surfaceTexture);
341 }
342 return setPreviewWindow(binder, window);
343}
344
345status_t Camera2Client::setPreviewWindow(const sp<IBinder>& binder,
346 const sp<ANativeWindow>& window) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700347 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700348 status_t res;
349
350 if (binder == mPreviewSurface) {
351 return NO_ERROR;
352 }
353
354 if (mPreviewStreamId != NO_PREVIEW_STREAM) {
355 res = mDevice->deleteStream(mPreviewStreamId);
356 if (res != OK) {
357 return res;
358 }
359 }
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700360 res = mDevice->createStream(window,
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700361 mParameters.previewWidth, mParameters.previewHeight,
362 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE,
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700363 &mPreviewStreamId);
364 if (res != OK) {
365 return res;
366 }
367
368 if (mState == WAITING_FOR_PREVIEW_WINDOW) {
369 return startPreview();
370 }
371
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700372 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700373}
374
375void Camera2Client::setPreviewCallbackFlag(int flag) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700376 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700377 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700378}
379
380status_t Camera2Client::startPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700381 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700382 Mutex::Autolock icl(mICameraLock);
383
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700384 status_t res;
385 if (mState == PREVIEW) return INVALID_OPERATION;
386
387 if (mPreviewStreamId == NO_PREVIEW_STREAM) {
388 mState = WAITING_FOR_PREVIEW_WINDOW;
389 return OK;
390 }
391
392 if (mPreviewRequest == NULL) {
393 updatePreviewRequest();
394 }
395
396 uint8_t outputStream = mPreviewStreamId;
397
398 camera_metadata_entry_t outputStreams;
399 res = find_camera_metadata_entry(mPreviewRequest,
400 ANDROID_REQUEST_OUTPUT_STREAMS,
401 &outputStreams);
402 if (res == NAME_NOT_FOUND) {
403 res = add_camera_metadata_entry(mPreviewRequest,
404 ANDROID_REQUEST_OUTPUT_STREAMS,
405 &outputStream, 1);
406 } else if (res == OK) {
407 res = update_camera_metadata_entry(mPreviewRequest,
408 outputStreams.index, &outputStream, 1, NULL);
409 }
410
411 if (res != OK) {
412 ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
413 __FUNCTION__, mCameraId, strerror(-res), res);
414 mState = STOPPED;
415 return res;
416 }
417
418 res = mDevice->setStreamingRequest(mPreviewRequest);
419 if (res != OK) {
420 ALOGE("%s: Camera %d: Unable to set preview request to start preview: %s (%d)",
421 __FUNCTION__, mCameraId, strerror(-res), res);
422 mState = STOPPED;
423 return res;
424 }
425 mState = PREVIEW;
426
427 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700428}
429
430void Camera2Client::stopPreview() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700431 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700432 Mutex::Autolock icl(mICameraLock);
433 stopPreviewLocked();
434}
435
436void Camera2Client::stopPreviewLocked() {
437 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700438 if (mState != PREVIEW) return;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700439
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700440 mDevice->setStreamingRequest(NULL);
441 mState = STOPPED;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700442}
443
444bool Camera2Client::previewEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700445 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700446 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700447 return mState == PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700448}
449
450status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700451 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700452 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700453 return BAD_VALUE;
454}
455
456status_t Camera2Client::startRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700457 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700458 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700459 return BAD_VALUE;
460}
461
462void Camera2Client::stopRecording() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700463 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700464 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700465}
466
467bool Camera2Client::recordingEnabled() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700468 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700469 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700470 return BAD_VALUE;
471}
472
473void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700474 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700475 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700476}
477
478status_t Camera2Client::autoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700479 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700480 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700481 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700482}
483
484status_t Camera2Client::cancelAutoFocus() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700485 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700486 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700487 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700488}
489
490status_t Camera2Client::takePicture(int msgType) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700491 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700492 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700493 return BAD_VALUE;
494}
495
496status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700497 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700498 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700499 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700500}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700501
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700502String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700503 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700504 Mutex::Autolock icl(mICameraLock);
505
506 Mutex::Autolock pl(mParamsLock);
507
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700508 // TODO: Deal with focus distances
509 return mParamsFlattened;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700510}
511
512status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700513 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700514 Mutex::Autolock icl(mICameraLock);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700515 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700516}
517
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700518/** Device-related methods */
519
520camera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag,
521 size_t minCount, size_t maxCount) {
522 status_t res;
523 camera_metadata_entry_t entry;
524 res = find_camera_metadata_entry(mDevice->info(),
525 tag,
526 &entry);
527 if (CC_UNLIKELY( res != OK )) {
528 const char* tagSection = get_camera_metadata_section_name(tag);
529 if (tagSection == NULL) tagSection = "<unknown>";
530 const char* tagName = get_camera_metadata_tag_name(tag);
531 if (tagName == NULL) tagName = "<unknown>";
532
533 ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)",
534 tagSection, tagName, tag, strerror(-res), res);
535 entry.count = 0;
536 entry.data.u8 = NULL;
537 } else if (CC_UNLIKELY(
538 (minCount != 0 && entry.count < minCount) ||
539 (maxCount != 0 && entry.count > maxCount) ) ) {
540 const char* tagSection = get_camera_metadata_section_name(tag);
541 if (tagSection == NULL) tagSection = "<unknown>";
542 const char* tagName = get_camera_metadata_tag_name(tag);
543 if (tagName == NULL) tagName = "<unknown>";
544 ALOGE("Malformed static metadata entry '%s.%s' (%x):"
545 "Expected between %d and %d values, but got %d values",
546 tagSection, tagName, tag, minCount, maxCount, entry.count);
547 entry.count = 0;
548 entry.data.u8 = NULL;
549 }
550
551 return entry;
552}
553
554/** Utility methods */
555
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700556
557status_t Camera2Client::buildDefaultParameters() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -0700558 ATRACE_CALL();
Eino-Ville Talvalaac45eb32012-06-07 10:24:51 -0700559 Mutex::Autolock pl(mParamsLock);
560
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700561 status_t res;
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700562 CameraParameters params;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700563
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700564 camera_metadata_entry_t availableProcessedSizes =
565 staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
566 if (!availableProcessedSizes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700567
568 // TODO: Pick more intelligently
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700569 mParameters.previewWidth = availableProcessedSizes.data.i32[0];
570 mParameters.previewHeight = availableProcessedSizes.data.i32[1];
571 mParameters.videoWidth = mParameters.previewWidth;
572 mParameters.videoHeight = mParameters.previewHeight;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700573
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700574 params.setPreviewSize(mParameters.previewWidth, mParameters.previewHeight);
575 params.setVideoSize(mParameters.videoWidth, mParameters.videoHeight);
576 params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
577 String8::format("%dx%d",
578 mParameters.previewWidth, mParameters.previewHeight));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700579 {
580 String8 supportedPreviewSizes;
581 for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
582 if (i != 0) supportedPreviewSizes += ",";
583 supportedPreviewSizes += String8::format("%dx%d",
584 availableProcessedSizes.data.i32[i],
585 availableProcessedSizes.data.i32[i+1]);
586 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700587 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700588 supportedPreviewSizes);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700589 params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700590 supportedPreviewSizes);
591 }
592
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700593 camera_metadata_entry_t availableFpsRanges =
594 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
595 if (!availableFpsRanges.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700596
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700597 mParameters.previewFpsRangeMin = availableFpsRanges.data.i32[0];
598 mParameters.previewFpsRangeMax = availableFpsRanges.data.i32[1];
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700599
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700600 params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
601 String8::format("%d,%d",
602 mParameters.previewFpsRangeMin,
603 mParameters.previewFpsRangeMax));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700604
605 {
606 String8 supportedPreviewFpsRange;
607 for (size_t i=0; i < availableFpsRanges.count; i += 2) {
608 if (i != 0) supportedPreviewFpsRange += ",";
609 supportedPreviewFpsRange += String8::format("(%d,%d)",
610 availableFpsRanges.data.i32[i],
611 availableFpsRanges.data.i32[i+1]);
612 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700613 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700614 supportedPreviewFpsRange);
615 }
616
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700617 mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
618 params.set(CameraParameters::KEY_PREVIEW_FORMAT,
619 formatEnumToString(mParameters.previewFormat)); // NV21
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700620
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700621 camera_metadata_entry_t availableFormats =
622 staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
623
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700624 {
625 String8 supportedPreviewFormats;
626 bool addComma = false;
627 for (size_t i=0; i < availableFormats.count; i++) {
628 if (addComma) supportedPreviewFormats += ",";
629 addComma = true;
630 switch (availableFormats.data.i32[i]) {
631 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
632 supportedPreviewFormats += "yuv422sp";
633 break;
634 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
635 supportedPreviewFormats += "yuv420sp";
636 break;
637 case HAL_PIXEL_FORMAT_YCbCr_422_I:
638 supportedPreviewFormats += "yuv422i-yuyv";
639 break;
640 case HAL_PIXEL_FORMAT_YV12:
641 supportedPreviewFormats += "yuv420p";
642 break;
643 case HAL_PIXEL_FORMAT_RGB_565:
644 supportedPreviewFormats += "rgb565";
645 break;
646 // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
647 case HAL_PIXEL_FORMAT_RAW_SENSOR:
648 addComma = false;
649 break;
650 default:
651 ALOGW("%s: Camera %d: Unknown preview format: %x",
652 __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
653 addComma = false;
654 break;
655 }
656 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700657 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700658 supportedPreviewFormats);
659 }
660
661 // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
662 // still have to do something sane for them
663
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700664 params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
665 mParameters.previewFpsRangeMin);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700666
667 {
668 String8 supportedPreviewFrameRates;
669 for (size_t i=0; i < availableFpsRanges.count; i += 2) {
670 if (i != 0) supportedPreviewFrameRates += ",";
671 supportedPreviewFrameRates += String8::format("%d",
672 availableFpsRanges.data.i32[i]);
673 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700674 params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700675 supportedPreviewFrameRates);
676 }
677
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700678 camera_metadata_entry_t availableJpegSizes =
679 staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
680 if (!availableJpegSizes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700681
682 // TODO: Pick maximum
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700683 mParameters.pictureWidth = availableJpegSizes.data.i32[0];
684 mParameters.pictureHeight = availableJpegSizes.data.i32[1];
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700685
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700686 params.setPictureSize(mParameters.pictureWidth,
687 mParameters.pictureHeight);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700688
689 {
690 String8 supportedPictureSizes;
691 for (size_t i=0; i < availableJpegSizes.count; i += 2) {
692 if (i != 0) supportedPictureSizes += ",";
693 supportedPictureSizes += String8::format("%dx%d",
694 availableJpegSizes.data.i32[i],
695 availableJpegSizes.data.i32[i+1]);
696 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700697 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700698 supportedPictureSizes);
699 }
700
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700701 params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
702 params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
703 CameraParameters::PIXEL_FORMAT_JPEG);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700704
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700705 camera_metadata_entry_t availableJpegThumbnailSizes =
706 staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2);
707 if (!availableJpegThumbnailSizes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700708
709 // TODO: Pick default thumbnail size sensibly
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700710 mParameters.jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0];
711 mParameters.jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1];
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700712
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700713 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
714 mParameters.jpegThumbWidth);
715 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
716 mParameters.jpegThumbHeight);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700717
718 {
719 String8 supportedJpegThumbSizes;
720 for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
721 if (i != 0) supportedJpegThumbSizes += ",";
722 supportedJpegThumbSizes += String8::format("%dx%d",
723 availableJpegThumbnailSizes.data.i32[i],
724 availableJpegThumbnailSizes.data.i32[i+1]);
725 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700726 params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700727 supportedJpegThumbSizes);
728 }
729
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700730 mParameters.jpegThumbQuality = 90;
731 params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
732 mParameters.jpegThumbQuality);
733 mParameters.jpegQuality = 90;
734 params.set(CameraParameters::KEY_JPEG_QUALITY,
735 mParameters.jpegQuality);
736 mParameters.jpegRotation = 0;
737 params.set(CameraParameters::KEY_ROTATION,
738 mParameters.jpegRotation);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700739
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700740 mParameters.gpsEnabled = false;
741 mParameters.gpsProcessingMethod = "unknown";
742 // GPS fields in CameraParameters are not set by implementation
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700743
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700744 mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO;
745 params.set(CameraParameters::KEY_WHITE_BALANCE,
746 CameraParameters::WHITE_BALANCE_AUTO);
747
748 camera_metadata_entry_t availableWhiteBalanceModes =
749 staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700750 {
751 String8 supportedWhiteBalance;
752 bool addComma = false;
753 for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
754 if (addComma) supportedWhiteBalance += ",";
755 addComma = true;
756 switch (availableWhiteBalanceModes.data.u8[i]) {
757 case ANDROID_CONTROL_AWB_AUTO:
758 supportedWhiteBalance += "auto";
759 break;
760 case ANDROID_CONTROL_AWB_INCANDESCENT:
761 supportedWhiteBalance += "incandescent";
762 break;
763 case ANDROID_CONTROL_AWB_FLUORESCENT:
764 supportedWhiteBalance += "fluorescent";
765 break;
766 case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
767 supportedWhiteBalance += "warm-fluorescent";
768 break;
769 case ANDROID_CONTROL_AWB_DAYLIGHT:
770 supportedWhiteBalance += "daylight";
771 break;
772 case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
773 supportedWhiteBalance += "cloudy-daylight";
774 break;
775 case ANDROID_CONTROL_AWB_TWILIGHT:
776 supportedWhiteBalance += "twilight";
777 break;
778 case ANDROID_CONTROL_AWB_SHADE:
779 supportedWhiteBalance += "shade";
780 break;
781 // Skipping values not mappable to v1 API
782 case ANDROID_CONTROL_AWB_OFF:
783 addComma = false;
784 break;
785 default:
786 ALOGW("%s: Camera %d: Unknown white balance value: %d",
787 __FUNCTION__, mCameraId,
788 availableWhiteBalanceModes.data.u8[i]);
789 addComma = false;
790 break;
791 }
792 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700793 params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700794 supportedWhiteBalance);
795 }
796
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700797 mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF;
798 params.set(CameraParameters::KEY_EFFECT,
799 CameraParameters::EFFECT_NONE);
800
801 camera_metadata_entry_t availableEffects =
802 staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
803 if (!availableEffects.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700804 {
805 String8 supportedEffects;
806 bool addComma = false;
807 for (size_t i=0; i < availableEffects.count; i++) {
808 if (addComma) supportedEffects += ",";
809 addComma = true;
810 switch (availableEffects.data.u8[i]) {
811 case ANDROID_CONTROL_EFFECT_OFF:
812 supportedEffects += "none";
813 break;
814 case ANDROID_CONTROL_EFFECT_MONO:
815 supportedEffects += "mono";
816 case ANDROID_CONTROL_EFFECT_NEGATIVE:
817 supportedEffects += "negative";
818 break;
819 case ANDROID_CONTROL_EFFECT_SOLARIZE:
820 supportedEffects += "solarize";
821 break;
822 case ANDROID_CONTROL_EFFECT_SEPIA:
823 supportedEffects += "sepia";
824 break;
825 case ANDROID_CONTROL_EFFECT_POSTERIZE:
826 supportedEffects += "posterize";
827 break;
828 case ANDROID_CONTROL_EFFECT_WHITEBOARD:
829 supportedEffects += "whiteboard";
830 break;
831 case ANDROID_CONTROL_EFFECT_BLACKBOARD:
832 supportedEffects += "blackboard";
833 break;
834 case ANDROID_CONTROL_EFFECT_AQUA:
835 supportedEffects += "aqua";
836 break;
837 default:
838 ALOGW("%s: Camera %d: Unknown effect value: %d",
839 __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
840 addComma = false;
841 break;
842 }
843 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700844 params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700845 }
846
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700847 mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
848 params.set(CameraParameters::KEY_ANTIBANDING,
849 CameraParameters::ANTIBANDING_AUTO);
850
851 camera_metadata_entry_t availableAntibandingModes =
852 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
853 if (!availableAntibandingModes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700854 {
855 String8 supportedAntibanding;
856 bool addComma = false;
857 for (size_t i=0; i < availableAntibandingModes.count; i++) {
858 if (addComma) supportedAntibanding += ",";
859 addComma = true;
860 switch (availableAntibandingModes.data.u8[i]) {
861 case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
862 supportedAntibanding += "off";
863 break;
864 case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
865 supportedAntibanding += "50hz";
866 break;
867 case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
868 supportedAntibanding += "60hz";
869 break;
870 case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
871 supportedAntibanding += "auto";
872 break;
873 default:
874 ALOGW("%s: Camera %d: Unknown antibanding value: %d",
875 __FUNCTION__, mCameraId,
876 availableAntibandingModes.data.u8[i]);
877 addComma = false;
878 break;
879 }
880 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700881 params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700882 supportedAntibanding);
883 }
884
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700885 mParameters.sceneMode = ANDROID_CONTROL_OFF;
886 params.set(CameraParameters::KEY_SCENE_MODE,
887 CameraParameters::SCENE_MODE_AUTO);
888
889 camera_metadata_entry_t availableSceneModes =
890 staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
891 if (!availableSceneModes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700892 {
893 String8 supportedSceneModes("auto");
894 bool addComma = true;
895 bool noSceneModes = false;
896 for (size_t i=0; i < availableSceneModes.count; i++) {
897 if (addComma) supportedSceneModes += ",";
898 addComma = true;
899 switch (availableSceneModes.data.u8[i]) {
900 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
901 noSceneModes = true;
902 break;
903 case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
904 // Not in old API
905 addComma = false;
906 break;
907 case ANDROID_CONTROL_SCENE_MODE_ACTION:
908 supportedSceneModes += "action";
909 break;
910 case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
911 supportedSceneModes += "portrait";
912 break;
913 case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
914 supportedSceneModes += "landscape";
915 break;
916 case ANDROID_CONTROL_SCENE_MODE_NIGHT:
917 supportedSceneModes += "night";
918 break;
919 case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
920 supportedSceneModes += "night-portrait";
921 break;
922 case ANDROID_CONTROL_SCENE_MODE_THEATRE:
923 supportedSceneModes += "theatre";
924 break;
925 case ANDROID_CONTROL_SCENE_MODE_BEACH:
926 supportedSceneModes += "beach";
927 break;
928 case ANDROID_CONTROL_SCENE_MODE_SNOW:
929 supportedSceneModes += "snow";
930 break;
931 case ANDROID_CONTROL_SCENE_MODE_SUNSET:
932 supportedSceneModes += "sunset";
933 break;
934 case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
935 supportedSceneModes += "steadyphoto";
936 break;
937 case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
938 supportedSceneModes += "fireworks";
939 break;
940 case ANDROID_CONTROL_SCENE_MODE_SPORTS:
941 supportedSceneModes += "sports";
942 break;
943 case ANDROID_CONTROL_SCENE_MODE_PARTY:
944 supportedSceneModes += "party";
945 break;
946 case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
947 supportedSceneModes += "candlelight";
948 break;
949 case ANDROID_CONTROL_SCENE_MODE_BARCODE:
950 supportedSceneModes += "barcode";
951 break;
952 default:
953 ALOGW("%s: Camera %d: Unknown scene mode value: %d",
954 __FUNCTION__, mCameraId, availableSceneModes.data.u8[i]);
955 addComma = false;
956 break;
957 }
958 }
959 if (!noSceneModes) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700960 params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700961 supportedSceneModes);
962 }
963 }
964
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700965 camera_metadata_entry_t flashAvailable =
966 staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
967 if (!flashAvailable.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700968
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700969 camera_metadata_entry_t availableAeModes =
970 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
971 if (!availableAeModes.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700972
973 if (flashAvailable.data.u8[0]) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700974 mParameters.flashMode = Parameters::FLASH_MODE_AUTO;
975 params.set(CameraParameters::KEY_FLASH_MODE,
976 CameraParameters::FLASH_MODE_AUTO);
977
978 String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
979 supportedFlashModes = supportedFlashModes +
980 "," + CameraParameters::FLASH_MODE_AUTO +
981 "," + CameraParameters::FLASH_MODE_ON +
982 "," + CameraParameters::FLASH_MODE_TORCH;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700983 for (size_t i=0; i < availableAeModes.count; i++) {
984 if (availableAeModes.data.u8[i] ==
985 ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700986 supportedFlashModes = supportedFlashModes + "," +
987 CameraParameters::FLASH_MODE_RED_EYE;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700988 break;
989 }
990 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700991 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700992 supportedFlashModes);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700993 } else {
994 mParameters.flashMode = Parameters::FLASH_MODE_OFF;
995 params.set(CameraParameters::KEY_FLASH_MODE,
996 CameraParameters::FLASH_MODE_OFF);
997 params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
998 CameraParameters::FLASH_MODE_OFF);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700999 }
1000
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001001 camera_metadata_entry_t minFocusDistance =
1002 staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
1003 if (!minFocusDistance.count) return NO_INIT;
1004
1005 camera_metadata_entry_t availableAfModes =
1006 staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
1007 if (!availableAfModes.count) return NO_INIT;
1008
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001009 if (minFocusDistance.data.f[0] == 0) {
1010 // Fixed-focus lens
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001011 mParameters.focusMode = Parameters::FOCUS_MODE_FIXED;
1012 params.set(CameraParameters::KEY_FOCUS_MODE,
1013 CameraParameters::FOCUS_MODE_FIXED);
1014 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
1015 CameraParameters::FOCUS_MODE_FIXED);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001016 } else {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001017 mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
1018 params.set(CameraParameters::KEY_FOCUS_MODE,
1019 CameraParameters::FOCUS_MODE_AUTO);
1020 String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED);
1021 supportedFocusModes = supportedFocusModes + "," +
1022 CameraParameters::FOCUS_MODE_INFINITY;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001023 bool addComma = true;
1024 for (size_t i=0; i < availableAfModes.count; i++) {
1025 if (addComma) supportedFocusModes += ",";
1026 addComma = true;
1027 switch (availableAfModes.data.u8[i]) {
1028 case ANDROID_CONTROL_AF_AUTO:
1029 supportedFocusModes += "auto";
1030 break;
1031 case ANDROID_CONTROL_AF_MACRO:
1032 supportedFocusModes += "macro";
1033 break;
1034 case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
1035 supportedFocusModes += "continuous-video";
1036 break;
1037 case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
1038 supportedFocusModes += "continuous-picture";
1039 break;
1040 case ANDROID_CONTROL_AF_EDOF:
1041 supportedFocusModes += "edof";
1042 break;
1043 // Not supported in v1 API
1044 case ANDROID_CONTROL_AF_OFF:
1045 addComma = false;
1046 break;
1047 default:
1048 ALOGW("%s: Camera %d: Unknown AF mode value: %d",
1049 __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
1050 addComma = false;
1051 break;
1052 }
1053 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001054 params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001055 supportedFocusModes);
1056 }
1057
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001058 camera_metadata_entry_t max3aRegions =
1059 staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
1060 if (!max3aRegions.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001061
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001062 params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001063 max3aRegions.data.i32[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001064 params.set(CameraParameters::KEY_FOCUS_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001065 "(0,0,0,0,0)");
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001066 mParameters.focusingAreas.clear();
1067 mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001068
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001069 camera_metadata_entry_t availableFocalLengths =
1070 staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
1071 if (!availableFocalLengths.count) return NO_INIT;
1072
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001073 float minFocalLength = availableFocalLengths.data.f[0];
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001074 params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001075
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001076 camera_metadata_entry_t sensorSize =
1077 staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
1078 if (!sensorSize.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001079
1080 // The fields of view here assume infinity focus, maximum wide angle
1081 float horizFov = 180 / M_PI *
1082 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
1083 float vertFov = 180 / M_PI *
1084 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001085 params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
1086 params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001087
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001088 mParameters.exposureCompensation = 0;
1089 params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
1090 mParameters.exposureCompensation);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001091
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001092 camera_metadata_entry_t exposureCompensationRange =
1093 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
1094 if (!exposureCompensationRange.count) return NO_INIT;
1095
1096 params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001097 exposureCompensationRange.data.i32[1]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001098 params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001099 exposureCompensationRange.data.i32[0]);
1100
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001101 camera_metadata_entry_t exposureCompensationStep =
1102 staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
1103 if (!exposureCompensationStep.count) return NO_INIT;
1104
1105 params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001106 exposureCompensationStep.data.r[0].numerator /
1107 exposureCompensationStep.data.r[0].denominator);
1108
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001109 mParameters.autoExposureLock = false;
1110 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
1111 CameraParameters::FALSE);
1112 params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
1113 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001114
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001115 mParameters.autoWhiteBalanceLock = false;
1116 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
1117 CameraParameters::FALSE);
1118 params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
1119 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001120
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001121 mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
1122 params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001123 max3aRegions.data.i32[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001124 params.set(CameraParameters::KEY_METERING_AREAS,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001125 "(0,0,0,0,0)");
1126
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001127 mParameters.zoom = 0;
1128 params.set(CameraParameters::KEY_ZOOM, mParameters.zoom);
1129 params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001130
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001131 camera_metadata_entry_t maxDigitalZoom =
1132 staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
1133 if (!maxDigitalZoom.count) return NO_INIT;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001134
1135 {
1136 String8 zoomRatios;
1137 float zoom = 1.f;
1138 float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001139 (NUM_ZOOM_STEPS-1);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001140 bool addComma = false;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001141 for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001142 if (addComma) zoomRatios += ",";
1143 addComma = true;
1144 zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
1145 zoom += zoomIncrement;
1146 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001147 params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001148 }
1149
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001150 params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
1151 CameraParameters::TRUE);
1152 params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
1153 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001154
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001155 params.set(CameraParameters::KEY_FOCUS_DISTANCES,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001156 "Infinity,Infinity,Infinity");
1157
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001158 camera_metadata_entry_t maxFacesDetected =
1159 staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
1160 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001161 maxFacesDetected.data.i32[0]);
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001162 params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001163 0);
1164
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001165 params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
1166 formatEnumToString(HAL_PIXEL_FORMAT_YCrCb_420_SP));
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001167
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001168 params.set(CameraParameters::KEY_RECORDING_HINT,
1169 CameraParameters::FALSE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001170
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001171 params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
1172 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001173
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001174 params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
1175 CameraParameters::FALSE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001176
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001177 camera_metadata_entry_t availableVideoStabilizationModes =
1178 staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
1179 if (!availableVideoStabilizationModes.count) return NO_INIT;
1180
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001181 if (availableVideoStabilizationModes.count > 1) {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001182 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
1183 CameraParameters::TRUE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001184 } else {
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001185 params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
1186 CameraParameters::FALSE);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001187 }
1188
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001189 mParamsFlattened = params.flatten();
1190
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -07001191 return OK;
1192}
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001193
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001194status_t Camera2Client::updatePreviewRequest() {
Eino-Ville Talvalaa1890972012-05-31 11:18:52 -07001195 ATRACE_CALL();
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001196 status_t res;
1197 if (mPreviewRequest == NULL) {
1198 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
1199 &mPreviewRequest);
1200 if (res != OK) {
1201 ALOGE("%s: Camera %d: Unable to create default preview request: "
1202 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1203 return res;
1204 }
1205 }
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001206 // TODO: Adjust for params changes
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -07001207 return OK;
1208}
1209
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -07001210const char* Camera2Client::formatEnumToString(int format) {
1211 const char *fmt;
1212 switch(format) {
1213 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1214 fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
1215 break;
1216 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1217 fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
1218 break;
1219 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1220 fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
1221 break;
1222 case HAL_PIXEL_FORMAT_YV12: // YV12
1223 fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
1224 break;
1225 case HAL_PIXEL_FORMAT_RGB_565: // RGB565
1226 fmt = CameraParameters::PIXEL_FORMAT_RGB565;
1227 break;
1228 case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888
1229 fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
1230 break;
1231 case HAL_PIXEL_FORMAT_RAW_SENSOR:
1232 ALOGW("Raw sensor preview format requested.");
1233 fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
1234 break;
1235 default:
1236 ALOGE("%s: Unknown preview format: %x",
1237 __FUNCTION__, format);
1238 fmt = NULL;
1239 break;
1240 }
1241 return fmt;
1242}
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001243} // namespace android