blob: e138cd1ae5fa33e60a45b1ba5f0763e4e1c488a3 [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"
18//#define LOG_NDEBUG 0
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070019#include <utils/Log.h>
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070020
21#include <cutils/properties.h>
22#include <gui/SurfaceTextureClient.h>
23#include <gui/Surface.h>
24
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070025#include <math.h>
26
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070027#include "Camera2Client.h"
28
29namespace android {
30
31#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
32#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
33
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070034#define ALOG1_ENTRY \
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070035 int callingPid = getCallingPid(); \
36 ALOG1("%s: E (pid %d, id %d) ", __FUNCTION__, \
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070037 callingPid, mCameraId)
38
39#define ALOG1_EXIT \
40 ALOG1("%s: X (pid %d, id %d) ", __FUNCTION__, \
41 callingPid, mCameraId)
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070042
43static int getCallingPid() {
44 return IPCThreadState::self()->getCallingPid();
45}
46
47static int getCallingUid() {
48 return IPCThreadState::self()->getCallingUid();
49}
50
51// Interface used by CameraService
52
53Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
54 const sp<ICameraClient>& cameraClient,
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070055 int cameraId,
56 int cameraFacing,
57 int clientPid):
58 Client(cameraService, cameraClient,
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070059 cameraId, cameraFacing, clientPid),
60 mParams(NULL)
61{
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070062 ALOG1_ENTRY;
63
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070064 mDevice = new Camera2Device(cameraId);
65
66 ALOG1_EXIT;
67}
68
69status_t Camera2Client::initialize(camera_module_t *module)
70{
71 ALOG1_ENTRY;
72 status_t res;
73
74 res = mDevice->initialize(module);
75 if (res != OK) {
76 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
77 __FUNCTION__, mCameraId, strerror(-res), res);
78 return NO_INIT;
79 }
80
81 res = buildDefaultParameters();
82 if (res != OK) {
83 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
84 __FUNCTION__, mCameraId, strerror(-res), res);
85 return NO_INIT;
86 }
87 if (gLogLevel >= 1) {
88 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
89 mCameraId);
90 mParams->dump();
91 }
92
93 ALOG1_EXIT;
94 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070095}
96
97Camera2Client::~Camera2Client() {
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070098 mDestructionStarted = true;
99
100 if (mParams) delete mParams;
101
102 disconnect();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700103}
104
105status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
106 return BAD_VALUE;
107}
108
109// ICamera interface
110
111void Camera2Client::disconnect() {
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700112
113 if (mDevice == 0) return;
114
115 mDevice->setStreamingRequest(NULL);
116
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700117 CameraService::Client::disconnect();
118}
119
120status_t Camera2Client::connect(const sp<ICameraClient>& client) {
121 return BAD_VALUE;
122}
123
124status_t Camera2Client::lock() {
125 return BAD_VALUE;
126}
127
128status_t Camera2Client::unlock() {
129 return BAD_VALUE;
130}
131
132status_t Camera2Client::setPreviewDisplay(const sp<Surface>& surface) {
133 return BAD_VALUE;
134}
135
136status_t Camera2Client::setPreviewTexture(const sp<ISurfaceTexture>& surfaceTexture) {
137 return BAD_VALUE;
138}
139
140void Camera2Client::setPreviewCallbackFlag(int flag) {
141
142}
143
144status_t Camera2Client::startPreview() {
145 return BAD_VALUE;
146}
147
148void Camera2Client::stopPreview() {
149
150}
151
152bool Camera2Client::previewEnabled() {
153 return false;
154}
155
156status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
157 return BAD_VALUE;
158}
159
160status_t Camera2Client::startRecording() {
161 return BAD_VALUE;
162}
163
164void Camera2Client::stopRecording() {
165}
166
167bool Camera2Client::recordingEnabled() {
168 return BAD_VALUE;
169}
170
171void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
172
173}
174
175status_t Camera2Client::autoFocus() {
176 return BAD_VALUE;
177}
178
179status_t Camera2Client::cancelAutoFocus() {
180 return BAD_VALUE;
181}
182
183status_t Camera2Client::takePicture(int msgType) {
184 return BAD_VALUE;
185}
186
187status_t Camera2Client::setParameters(const String8& params) {
188 return BAD_VALUE;
189}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700190
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700191String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700192 return mParams->flatten();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700193}
194
195status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
196 return BAD_VALUE;
197}
198
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700199// private methods
200
201status_t Camera2Client::buildDefaultParameters() {
202 status_t res;
203 if (mParams) {
204 delete mParams;
205 }
206 mParams = new CameraParameters;
207
208 camera_metadata_entry_t availableProcessedSizes;
209 res = find_camera_metadata_entry(mDevice->info(),
210 ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
211 &availableProcessedSizes);
212 if (res != OK) return res;
213 if (availableProcessedSizes.count < 2) {
214 ALOGE("%s: Camera %d: "
215 "Malformed %s entry",
216 __FUNCTION__, mCameraId,
217 get_camera_metadata_tag_name(
218 ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES));
219 return NO_INIT;
220 }
221
222 // TODO: Pick more intelligently
223 int previewWidth = availableProcessedSizes.data.i32[0];
224 int previewHeight = availableProcessedSizes.data.i32[1];
225
226 mParams->setPreviewSize(previewWidth, previewHeight);
227 mParams->setVideoSize(previewWidth, previewHeight);
228 mParams->set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
229 String8::format("%dx%d",previewWidth,previewHeight));
230 {
231 String8 supportedPreviewSizes;
232 for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
233 if (i != 0) supportedPreviewSizes += ",";
234 supportedPreviewSizes += String8::format("%dx%d",
235 availableProcessedSizes.data.i32[i],
236 availableProcessedSizes.data.i32[i+1]);
237 }
238 mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
239 supportedPreviewSizes);
240 mParams->set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
241 supportedPreviewSizes);
242 }
243
244 camera_metadata_entry_t availableFpsRanges;
245 res = find_camera_metadata_entry(mDevice->info(),
246 ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
247 &availableFpsRanges);
248 if (res != OK) return res;
249 if (availableFpsRanges.count < 2) {
250 ALOGE("%s: Camera %d: "
251 "Malformed %s entry",
252 __FUNCTION__, mCameraId,
253 get_camera_metadata_tag_name(
254 ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES));
255 return NO_INIT;
256 }
257
258 int previewFpsRangeMin = availableFpsRanges.data.i32[0];
259 int previewFpsRangeMax = availableFpsRanges.data.i32[1];
260
261 mParams->set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
262 String8::format("%d,%d", previewFpsRangeMin, previewFpsRangeMax));
263
264 {
265 String8 supportedPreviewFpsRange;
266 for (size_t i=0; i < availableFpsRanges.count; i += 2) {
267 if (i != 0) supportedPreviewFpsRange += ",";
268 supportedPreviewFpsRange += String8::format("(%d,%d)",
269 availableFpsRanges.data.i32[i],
270 availableFpsRanges.data.i32[i+1]);
271 }
272 mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
273 supportedPreviewFpsRange);
274 }
275
276 mParams->set(CameraParameters::KEY_PREVIEW_FORMAT,
277 "yuv420sp"); // NV21
278
279 camera_metadata_entry_t availableFormats;
280 res = find_camera_metadata_entry(mDevice->info(),
281 ANDROID_SCALER_AVAILABLE_FORMATS,
282 &availableFormats);
283 {
284 String8 supportedPreviewFormats;
285 bool addComma = false;
286 for (size_t i=0; i < availableFormats.count; i++) {
287 if (addComma) supportedPreviewFormats += ",";
288 addComma = true;
289 switch (availableFormats.data.i32[i]) {
290 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
291 supportedPreviewFormats += "yuv422sp";
292 break;
293 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
294 supportedPreviewFormats += "yuv420sp";
295 break;
296 case HAL_PIXEL_FORMAT_YCbCr_422_I:
297 supportedPreviewFormats += "yuv422i-yuyv";
298 break;
299 case HAL_PIXEL_FORMAT_YV12:
300 supportedPreviewFormats += "yuv420p";
301 break;
302 case HAL_PIXEL_FORMAT_RGB_565:
303 supportedPreviewFormats += "rgb565";
304 break;
305 // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
306 case HAL_PIXEL_FORMAT_RAW_SENSOR:
307 addComma = false;
308 break;
309 default:
310 ALOGW("%s: Camera %d: Unknown preview format: %x",
311 __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
312 addComma = false;
313 break;
314 }
315 }
316 mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
317 supportedPreviewFormats);
318 }
319
320 // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
321 // still have to do something sane for them
322
323 mParams->set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
324 previewFpsRangeMin);
325
326 {
327 String8 supportedPreviewFrameRates;
328 for (size_t i=0; i < availableFpsRanges.count; i += 2) {
329 if (i != 0) supportedPreviewFrameRates += ",";
330 supportedPreviewFrameRates += String8::format("%d",
331 availableFpsRanges.data.i32[i]);
332 }
333 mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
334 supportedPreviewFrameRates);
335 }
336
337 camera_metadata_entry_t availableJpegSizes;
338 res = find_camera_metadata_entry(mDevice->info(),
339 ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
340 &availableJpegSizes);
341 if (res != OK) return res;
342 if (availableJpegSizes.count < 2) {
343 ALOGE("%s: Camera %d: "
344 "Malformed %s entry",
345 __FUNCTION__, mCameraId,
346 get_camera_metadata_tag_name(
347 ANDROID_SCALER_AVAILABLE_JPEG_SIZES));
348 return NO_INIT;
349 }
350
351 // TODO: Pick maximum
352 int32_t pictureWidth = availableJpegSizes.data.i32[0];
353 int32_t pictureHeight = availableJpegSizes.data.i32[1];
354
355 mParams->setPictureSize(pictureWidth, pictureHeight);
356
357 {
358 String8 supportedPictureSizes;
359 for (size_t i=0; i < availableJpegSizes.count; i += 2) {
360 if (i != 0) supportedPictureSizes += ",";
361 supportedPictureSizes += String8::format("%dx%d",
362 availableJpegSizes.data.i32[i],
363 availableJpegSizes.data.i32[i+1]);
364 }
365 mParams->set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
366 supportedPictureSizes);
367 }
368
369 mParams->setPictureFormat("jpeg");
370
371 mParams->set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
372 "jpeg");
373
374 camera_metadata_entry_t availableJpegThumbnailSizes;
375 res = find_camera_metadata_entry(mDevice->info(),
376 ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
377 &availableJpegThumbnailSizes);
378 if (res != OK) return res;
379 if (availableJpegThumbnailSizes.count < 2) {
380 ALOGE("%s: Camera %d: "
381 "Malformed %s entry",
382 __FUNCTION__, mCameraId,
383 get_camera_metadata_tag_name(
384 ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES));
385 return NO_INIT;
386 }
387
388 // TODO: Pick default thumbnail size sensibly
389 int32_t jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0];
390 int32_t jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1];
391
392 mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
393 jpegThumbWidth);
394 mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
395 jpegThumbHeight);
396
397 {
398 String8 supportedJpegThumbSizes;
399 for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
400 if (i != 0) supportedJpegThumbSizes += ",";
401 supportedJpegThumbSizes += String8::format("%dx%d",
402 availableJpegThumbnailSizes.data.i32[i],
403 availableJpegThumbnailSizes.data.i32[i+1]);
404 }
405 mParams->set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
406 supportedJpegThumbSizes);
407 }
408
409 mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
410 "90");
411 mParams->set(CameraParameters::KEY_JPEG_QUALITY,
412 "90");
413 mParams->set(CameraParameters::KEY_ROTATION,
414 "0");
415 // Not settting GPS fields
416
417 mParams->set(CameraParameters::KEY_WHITE_BALANCE,
418 "auto");
419
420 camera_metadata_entry_t availableWhiteBalanceModes;
421 res = find_camera_metadata_entry(mDevice->info(),
422 ANDROID_CONTROL_AWB_AVAILABLE_MODES,
423 &availableWhiteBalanceModes);
424 {
425 String8 supportedWhiteBalance;
426 bool addComma = false;
427 for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
428 if (addComma) supportedWhiteBalance += ",";
429 addComma = true;
430 switch (availableWhiteBalanceModes.data.u8[i]) {
431 case ANDROID_CONTROL_AWB_AUTO:
432 supportedWhiteBalance += "auto";
433 break;
434 case ANDROID_CONTROL_AWB_INCANDESCENT:
435 supportedWhiteBalance += "incandescent";
436 break;
437 case ANDROID_CONTROL_AWB_FLUORESCENT:
438 supportedWhiteBalance += "fluorescent";
439 break;
440 case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
441 supportedWhiteBalance += "warm-fluorescent";
442 break;
443 case ANDROID_CONTROL_AWB_DAYLIGHT:
444 supportedWhiteBalance += "daylight";
445 break;
446 case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
447 supportedWhiteBalance += "cloudy-daylight";
448 break;
449 case ANDROID_CONTROL_AWB_TWILIGHT:
450 supportedWhiteBalance += "twilight";
451 break;
452 case ANDROID_CONTROL_AWB_SHADE:
453 supportedWhiteBalance += "shade";
454 break;
455 // Skipping values not mappable to v1 API
456 case ANDROID_CONTROL_AWB_OFF:
457 addComma = false;
458 break;
459 default:
460 ALOGW("%s: Camera %d: Unknown white balance value: %d",
461 __FUNCTION__, mCameraId,
462 availableWhiteBalanceModes.data.u8[i]);
463 addComma = false;
464 break;
465 }
466 }
467 mParams->set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
468 supportedWhiteBalance);
469 }
470
471 mParams->set(CameraParameters::KEY_EFFECT, "none");
472 camera_metadata_entry_t availableEffects;
473 res = find_camera_metadata_entry(mDevice->info(),
474 ANDROID_CONTROL_AVAILABLE_EFFECTS,
475 &availableEffects);
476 if (res != OK) return res;
477 {
478 String8 supportedEffects;
479 bool addComma = false;
480 for (size_t i=0; i < availableEffects.count; i++) {
481 if (addComma) supportedEffects += ",";
482 addComma = true;
483 switch (availableEffects.data.u8[i]) {
484 case ANDROID_CONTROL_EFFECT_OFF:
485 supportedEffects += "none";
486 break;
487 case ANDROID_CONTROL_EFFECT_MONO:
488 supportedEffects += "mono";
489 case ANDROID_CONTROL_EFFECT_NEGATIVE:
490 supportedEffects += "negative";
491 break;
492 case ANDROID_CONTROL_EFFECT_SOLARIZE:
493 supportedEffects += "solarize";
494 break;
495 case ANDROID_CONTROL_EFFECT_SEPIA:
496 supportedEffects += "sepia";
497 break;
498 case ANDROID_CONTROL_EFFECT_POSTERIZE:
499 supportedEffects += "posterize";
500 break;
501 case ANDROID_CONTROL_EFFECT_WHITEBOARD:
502 supportedEffects += "whiteboard";
503 break;
504 case ANDROID_CONTROL_EFFECT_BLACKBOARD:
505 supportedEffects += "blackboard";
506 break;
507 case ANDROID_CONTROL_EFFECT_AQUA:
508 supportedEffects += "aqua";
509 break;
510 default:
511 ALOGW("%s: Camera %d: Unknown effect value: %d",
512 __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
513 addComma = false;
514 break;
515 }
516 }
517 mParams->set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
518 }
519
520 mParams->set(CameraParameters::KEY_ANTIBANDING, "auto");
521 camera_metadata_entry_t availableAntibandingModes;
522 res = find_camera_metadata_entry(mDevice->info(),
523 ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
524 &availableAntibandingModes);
525 if (res != OK) return res;
526 {
527 String8 supportedAntibanding;
528 bool addComma = false;
529 for (size_t i=0; i < availableAntibandingModes.count; i++) {
530 if (addComma) supportedAntibanding += ",";
531 addComma = true;
532 switch (availableAntibandingModes.data.u8[i]) {
533 case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
534 supportedAntibanding += "off";
535 break;
536 case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
537 supportedAntibanding += "50hz";
538 break;
539 case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
540 supportedAntibanding += "60hz";
541 break;
542 case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
543 supportedAntibanding += "auto";
544 break;
545 default:
546 ALOGW("%s: Camera %d: Unknown antibanding value: %d",
547 __FUNCTION__, mCameraId,
548 availableAntibandingModes.data.u8[i]);
549 addComma = false;
550 break;
551 }
552 }
553 mParams->set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
554 supportedAntibanding);
555 }
556
557 mParams->set(CameraParameters::KEY_SCENE_MODE, "auto");
558 camera_metadata_entry_t availableSceneModes;
559 res = find_camera_metadata_entry(mDevice->info(),
560 ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
561 &availableSceneModes);
562 if (res != OK) return res;
563 {
564 String8 supportedSceneModes("auto");
565 bool addComma = true;
566 bool noSceneModes = false;
567 for (size_t i=0; i < availableSceneModes.count; i++) {
568 if (addComma) supportedSceneModes += ",";
569 addComma = true;
570 switch (availableSceneModes.data.u8[i]) {
571 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
572 noSceneModes = true;
573 break;
574 case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
575 // Not in old API
576 addComma = false;
577 break;
578 case ANDROID_CONTROL_SCENE_MODE_ACTION:
579 supportedSceneModes += "action";
580 break;
581 case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
582 supportedSceneModes += "portrait";
583 break;
584 case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
585 supportedSceneModes += "landscape";
586 break;
587 case ANDROID_CONTROL_SCENE_MODE_NIGHT:
588 supportedSceneModes += "night";
589 break;
590 case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
591 supportedSceneModes += "night-portrait";
592 break;
593 case ANDROID_CONTROL_SCENE_MODE_THEATRE:
594 supportedSceneModes += "theatre";
595 break;
596 case ANDROID_CONTROL_SCENE_MODE_BEACH:
597 supportedSceneModes += "beach";
598 break;
599 case ANDROID_CONTROL_SCENE_MODE_SNOW:
600 supportedSceneModes += "snow";
601 break;
602 case ANDROID_CONTROL_SCENE_MODE_SUNSET:
603 supportedSceneModes += "sunset";
604 break;
605 case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
606 supportedSceneModes += "steadyphoto";
607 break;
608 case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
609 supportedSceneModes += "fireworks";
610 break;
611 case ANDROID_CONTROL_SCENE_MODE_SPORTS:
612 supportedSceneModes += "sports";
613 break;
614 case ANDROID_CONTROL_SCENE_MODE_PARTY:
615 supportedSceneModes += "party";
616 break;
617 case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
618 supportedSceneModes += "candlelight";
619 break;
620 case ANDROID_CONTROL_SCENE_MODE_BARCODE:
621 supportedSceneModes += "barcode";
622 break;
623 default:
624 ALOGW("%s: Camera %d: Unknown scene mode value: %d",
625 __FUNCTION__, mCameraId, availableSceneModes.data.u8[i]);
626 addComma = false;
627 break;
628 }
629 }
630 if (!noSceneModes) {
631 mParams->set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
632 supportedSceneModes);
633 }
634 }
635
636 camera_metadata_entry_t flashAvailable;
637 res = find_camera_metadata_entry(mDevice->info(),
638 ANDROID_FLASH_AVAILABLE, &flashAvailable);
639 if (res != OK) return res;
640
641 camera_metadata_entry_t availableAeModes;
642 res = find_camera_metadata_entry(mDevice->info(),
643 ANDROID_CONTROL_AE_AVAILABLE_MODES,
644 &availableAeModes);
645 if (res != OK) return res;
646
647 if (flashAvailable.data.u8[0]) {
648 mParams->set(CameraParameters::KEY_FLASH_MODE, "auto");
649 String8 supportedFlashModes("off,auto,on,torch");
650 for (size_t i=0; i < availableAeModes.count; i++) {
651 if (availableAeModes.data.u8[i] ==
652 ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
653 supportedFlashModes += ",red-eye";
654 break;
655 }
656 }
657 mParams->set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
658 supportedFlashModes);
659 }
660
661 camera_metadata_entry_t minFocusDistance;
662 res = find_camera_metadata_entry(mDevice->info(),
663 ANDROID_LENS_MINIMUM_FOCUS_DISTANCE,
664 &minFocusDistance);
665 if (res != OK) return res;
666 camera_metadata_entry_t availableAfModes;
667 res = find_camera_metadata_entry(mDevice->info(),
668 ANDROID_CONTROL_AF_AVAILABLE_MODES,
669 &availableAfModes);
670 if (res != OK) return res;
671 if (minFocusDistance.data.f[0] == 0) {
672 // Fixed-focus lens
673 mParams->set(CameraParameters::KEY_FOCUS_MODE, "fixed");
674 mParams->set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, "fixed");
675 } else {
676 mParams->set(CameraParameters::KEY_FOCUS_MODE, "auto");
677 String8 supportedFocusModes("fixed,infinity");
678 bool addComma = true;
679 for (size_t i=0; i < availableAfModes.count; i++) {
680 if (addComma) supportedFocusModes += ",";
681 addComma = true;
682 switch (availableAfModes.data.u8[i]) {
683 case ANDROID_CONTROL_AF_AUTO:
684 supportedFocusModes += "auto";
685 break;
686 case ANDROID_CONTROL_AF_MACRO:
687 supportedFocusModes += "macro";
688 break;
689 case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
690 supportedFocusModes += "continuous-video";
691 break;
692 case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
693 supportedFocusModes += "continuous-picture";
694 break;
695 case ANDROID_CONTROL_AF_EDOF:
696 supportedFocusModes += "edof";
697 break;
698 // Not supported in v1 API
699 case ANDROID_CONTROL_AF_OFF:
700 addComma = false;
701 break;
702 default:
703 ALOGW("%s: Camera %d: Unknown AF mode value: %d",
704 __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
705 addComma = false;
706 break;
707 }
708 }
709 mParams->set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
710 supportedFocusModes);
711 }
712
713 camera_metadata_entry_t max3aRegions;
714 res = find_camera_metadata_entry(mDevice->info(),
715 ANDROID_CONTROL_MAX_REGIONS, &max3aRegions);
716 if (res != OK) return res;
717
718 mParams->set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
719 max3aRegions.data.i32[0]);
720 mParams->set(CameraParameters::KEY_FOCUS_AREAS,
721 "(0,0,0,0,0)");
722
723 camera_metadata_entry_t availableFocalLengths;
724 res = find_camera_metadata_entry(mDevice->info(),
725 ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS,
726 &availableFocalLengths);
727 if (res != OK) return res;
728 float minFocalLength = availableFocalLengths.data.f[0];
729 mParams->setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
730
731 camera_metadata_entry_t sensorSize;
732 res = find_camera_metadata_entry(mDevice->info(),
733 ANDROID_SENSOR_PHYSICAL_SIZE,
734 &sensorSize);
735 if (res != OK) return res;
736
737 // The fields of view here assume infinity focus, maximum wide angle
738 float horizFov = 180 / M_PI *
739 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
740 float vertFov = 180 / M_PI *
741 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
742 mParams->setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
743 mParams->setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
744
745 mParams->set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 0);
746
747 camera_metadata_entry_t exposureCompensationRange;
748 res = find_camera_metadata_entry(mDevice->info(),
749 ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE,
750 &exposureCompensationRange);
751 if (res != OK) return res;
752 mParams->set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
753 exposureCompensationRange.data.i32[1]);
754 mParams->set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
755 exposureCompensationRange.data.i32[0]);
756
757 camera_metadata_entry_t exposureCompensationStep;
758 res = find_camera_metadata_entry(mDevice->info(),
759 ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP,
760 &exposureCompensationStep);
761 if (res != OK) return res;
762 mParams->setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
763 exposureCompensationStep.data.r[0].numerator /
764 exposureCompensationStep.data.r[0].denominator);
765
766 mParams->set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, "false");
767 mParams->set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, "true");
768
769 mParams->set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, "false");
770 mParams->set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, "true");
771
772 mParams->set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
773 max3aRegions.data.i32[0]);
774 mParams->set(CameraParameters::KEY_METERING_AREAS,
775 "(0,0,0,0,0)");
776
777 mParams->set(CameraParameters::KEY_ZOOM, 0);
778 mParams->set(CameraParameters::KEY_MAX_ZOOM, kNumZoomSteps - 1);
779
780 camera_metadata_entry_t maxDigitalZoom;
781 res = find_camera_metadata_entry(mDevice->info(),
782 ANDROID_SCALER_AVAILABLE_MAX_ZOOM, &maxDigitalZoom);
783 if (res != OK) return res;
784
785 {
786 String8 zoomRatios;
787 float zoom = 1.f;
788 float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
789 (kNumZoomSteps-1);
790 bool addComma = false;
791 for (size_t i=0; i < kNumZoomSteps; i++) {
792 if (addComma) zoomRatios += ",";
793 addComma = true;
794 zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
795 zoom += zoomIncrement;
796 }
797 mParams->set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
798 }
799
800 mParams->set(CameraParameters::KEY_ZOOM_SUPPORTED, "true");
801 mParams->set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "true");
802
803 mParams->set(CameraParameters::KEY_FOCUS_DISTANCES,
804 "Infinity,Infinity,Infinity");
805
806 camera_metadata_entry_t maxFacesDetected;
807 res = find_camera_metadata_entry(mDevice->info(),
808 ANDROID_STATS_MAX_FACE_COUNT,
809 &maxFacesDetected);
810 mParams->set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
811 maxFacesDetected.data.i32[0]);
812 mParams->set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
813 0);
814
815 mParams->set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
816 "yuv420sp");
817
818 mParams->set(CameraParameters::KEY_RECORDING_HINT,
819 "false");
820
821 mParams->set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
822 "true");
823
824 mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION,
825 "false");
826
827 camera_metadata_entry_t availableVideoStabilizationModes;
828 res = find_camera_metadata_entry(mDevice->info(),
829 ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
830 &availableVideoStabilizationModes);
831 if (res != OK) return res;
832 if (availableVideoStabilizationModes.count > 1) {
833 mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
834 "true");
835 } else {
836 mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
837 "false");
838 }
839
840 return OK;
841}
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700842
843} // namespace android