blob: 9825af779775c8f1e925a9cc058cf7382bc94e02 [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),
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -070060 mState(NOT_INITIALIZED),
61 mParams(NULL),
62 mPreviewStreamId(NO_PREVIEW_STREAM),
63 mPreviewRequest(NULL)
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070064{
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070065 ALOG1_ENTRY;
66
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070067 mDevice = new Camera2Device(cameraId);
68
69 ALOG1_EXIT;
70}
71
72status_t Camera2Client::initialize(camera_module_t *module)
73{
74 ALOG1_ENTRY;
75 status_t res;
76
77 res = mDevice->initialize(module);
78 if (res != OK) {
79 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
80 __FUNCTION__, mCameraId, strerror(-res), res);
81 return NO_INIT;
82 }
83
84 res = buildDefaultParameters();
85 if (res != OK) {
86 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
87 __FUNCTION__, mCameraId, strerror(-res), res);
88 return NO_INIT;
89 }
90 if (gLogLevel >= 1) {
91 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
92 mCameraId);
93 mParams->dump();
94 }
95
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -070096 mState = STOPPED;
97
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -070098 ALOG1_EXIT;
99 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700100}
101
102Camera2Client::~Camera2Client() {
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700103 mDestructionStarted = true;
104
105 if (mParams) delete mParams;
106
107 disconnect();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700108}
109
110status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
Eino-Ville Talvala611f6192012-05-31 12:28:23 -0700111 String8 result;
112 result.appendFormat("Client2[%d] (%p) PID: %d:\n",
113 mCameraId,
114 getCameraClient()->asBinder().get(),
115 mClientPid);
116 write(fd, result.string(), result.size());
117 return NO_ERROR;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700118}
119
120// ICamera interface
121
122void Camera2Client::disconnect() {
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700123
124 if (mDevice == 0) return;
125
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700126 stopPreview();
127
128 if (mPreviewStreamId != NO_PREVIEW_STREAM) {
129 mDevice->deleteStream(mPreviewStreamId);
130 mPreviewStreamId = NO_PREVIEW_STREAM;
131 }
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700132
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700133 CameraService::Client::disconnect();
134}
135
136status_t Camera2Client::connect(const sp<ICameraClient>& client) {
137 return BAD_VALUE;
138}
139
140status_t Camera2Client::lock() {
141 return BAD_VALUE;
142}
143
144status_t Camera2Client::unlock() {
145 return BAD_VALUE;
146}
147
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700148status_t Camera2Client::setPreviewDisplay(
149 const sp<Surface>& surface) {
150 ALOG1_ENTRY;
151 if (mState == PREVIEW) return INVALID_OPERATION;
152
153 sp<IBinder> binder;
154 sp<ANativeWindow> window;
155 if (surface != 0) {
156 binder = surface->asBinder();
157 window = surface;
158 }
159
160 return setPreviewWindow(binder,window);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700161}
162
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700163status_t Camera2Client::setPreviewTexture(
164 const sp<ISurfaceTexture>& surfaceTexture) {
165 ALOG1_ENTRY;
166 if (mState == PREVIEW) return INVALID_OPERATION;
167
168 sp<IBinder> binder;
169 sp<ANativeWindow> window;
170 if (surfaceTexture != 0) {
171 binder = surfaceTexture->asBinder();
172 window = new SurfaceTextureClient(surfaceTexture);
173 }
174 return setPreviewWindow(binder, window);
175}
176
177status_t Camera2Client::setPreviewWindow(const sp<IBinder>& binder,
178 const sp<ANativeWindow>& window) {
179 ALOG1_ENTRY;
180 status_t res;
181
182 if (binder == mPreviewSurface) {
183 return NO_ERROR;
184 }
185
186 if (mPreviewStreamId != NO_PREVIEW_STREAM) {
187 res = mDevice->deleteStream(mPreviewStreamId);
188 if (res != OK) {
189 return res;
190 }
191 }
192
193 int previewWidth, previewHeight;
194 mParams->getPreviewSize(&previewWidth, &previewHeight);
195
196 res = mDevice->createStream(window,
197 previewWidth, previewHeight, CAMERA2_HAL_PIXEL_FORMAT_OPAQUE,
198 &mPreviewStreamId);
199 if (res != OK) {
200 return res;
201 }
202
203 if (mState == WAITING_FOR_PREVIEW_WINDOW) {
204 return startPreview();
205 }
206
207 ALOG1_EXIT;
208 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700209}
210
211void Camera2Client::setPreviewCallbackFlag(int flag) {
212
213}
214
215status_t Camera2Client::startPreview() {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700216 ALOG1_ENTRY;
217 status_t res;
218 if (mState == PREVIEW) return INVALID_OPERATION;
219
220 if (mPreviewStreamId == NO_PREVIEW_STREAM) {
221 mState = WAITING_FOR_PREVIEW_WINDOW;
222 return OK;
223 }
224
225 if (mPreviewRequest == NULL) {
226 updatePreviewRequest();
227 }
228
229 uint8_t outputStream = mPreviewStreamId;
230
231 camera_metadata_entry_t outputStreams;
232 res = find_camera_metadata_entry(mPreviewRequest,
233 ANDROID_REQUEST_OUTPUT_STREAMS,
234 &outputStreams);
235 if (res == NAME_NOT_FOUND) {
236 res = add_camera_metadata_entry(mPreviewRequest,
237 ANDROID_REQUEST_OUTPUT_STREAMS,
238 &outputStream, 1);
239 } else if (res == OK) {
240 res = update_camera_metadata_entry(mPreviewRequest,
241 outputStreams.index, &outputStream, 1, NULL);
242 }
243
244 if (res != OK) {
245 ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
246 __FUNCTION__, mCameraId, strerror(-res), res);
247 mState = STOPPED;
248 return res;
249 }
250
251 res = mDevice->setStreamingRequest(mPreviewRequest);
252 if (res != OK) {
253 ALOGE("%s: Camera %d: Unable to set preview request to start preview: %s (%d)",
254 __FUNCTION__, mCameraId, strerror(-res), res);
255 mState = STOPPED;
256 return res;
257 }
258 mState = PREVIEW;
259
260 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700261}
262
263void Camera2Client::stopPreview() {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700264 ALOG1_ENTRY;
265 if (mState != PREVIEW) return;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700266
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700267 mDevice->setStreamingRequest(NULL);
268 mState = STOPPED;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700269}
270
271bool Camera2Client::previewEnabled() {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700272 return mState == PREVIEW;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700273}
274
275status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
276 return BAD_VALUE;
277}
278
279status_t Camera2Client::startRecording() {
280 return BAD_VALUE;
281}
282
283void Camera2Client::stopRecording() {
284}
285
286bool Camera2Client::recordingEnabled() {
287 return BAD_VALUE;
288}
289
290void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
291
292}
293
294status_t Camera2Client::autoFocus() {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700295 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700296}
297
298status_t Camera2Client::cancelAutoFocus() {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700299 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700300}
301
302status_t Camera2Client::takePicture(int msgType) {
303 return BAD_VALUE;
304}
305
306status_t Camera2Client::setParameters(const String8& params) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700307 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700308}
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700309
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700310String8 Camera2Client::getParameters() const {
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700311 return mParams->flatten();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700312}
313
314status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700315 return OK;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700316}
317
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700318// private methods
319
320status_t Camera2Client::buildDefaultParameters() {
321 status_t res;
322 if (mParams) {
323 delete mParams;
324 }
325 mParams = new CameraParameters;
326
327 camera_metadata_entry_t availableProcessedSizes;
328 res = find_camera_metadata_entry(mDevice->info(),
329 ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
330 &availableProcessedSizes);
331 if (res != OK) return res;
332 if (availableProcessedSizes.count < 2) {
333 ALOGE("%s: Camera %d: "
334 "Malformed %s entry",
335 __FUNCTION__, mCameraId,
336 get_camera_metadata_tag_name(
337 ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES));
338 return NO_INIT;
339 }
340
341 // TODO: Pick more intelligently
342 int previewWidth = availableProcessedSizes.data.i32[0];
343 int previewHeight = availableProcessedSizes.data.i32[1];
344
345 mParams->setPreviewSize(previewWidth, previewHeight);
346 mParams->setVideoSize(previewWidth, previewHeight);
347 mParams->set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
348 String8::format("%dx%d",previewWidth,previewHeight));
349 {
350 String8 supportedPreviewSizes;
351 for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
352 if (i != 0) supportedPreviewSizes += ",";
353 supportedPreviewSizes += String8::format("%dx%d",
354 availableProcessedSizes.data.i32[i],
355 availableProcessedSizes.data.i32[i+1]);
356 }
357 mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
358 supportedPreviewSizes);
359 mParams->set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
360 supportedPreviewSizes);
361 }
362
363 camera_metadata_entry_t availableFpsRanges;
364 res = find_camera_metadata_entry(mDevice->info(),
365 ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
366 &availableFpsRanges);
367 if (res != OK) return res;
368 if (availableFpsRanges.count < 2) {
369 ALOGE("%s: Camera %d: "
370 "Malformed %s entry",
371 __FUNCTION__, mCameraId,
372 get_camera_metadata_tag_name(
373 ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES));
374 return NO_INIT;
375 }
376
377 int previewFpsRangeMin = availableFpsRanges.data.i32[0];
378 int previewFpsRangeMax = availableFpsRanges.data.i32[1];
379
380 mParams->set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
381 String8::format("%d,%d", previewFpsRangeMin, previewFpsRangeMax));
382
383 {
384 String8 supportedPreviewFpsRange;
385 for (size_t i=0; i < availableFpsRanges.count; i += 2) {
386 if (i != 0) supportedPreviewFpsRange += ",";
387 supportedPreviewFpsRange += String8::format("(%d,%d)",
388 availableFpsRanges.data.i32[i],
389 availableFpsRanges.data.i32[i+1]);
390 }
391 mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
392 supportedPreviewFpsRange);
393 }
394
395 mParams->set(CameraParameters::KEY_PREVIEW_FORMAT,
396 "yuv420sp"); // NV21
397
398 camera_metadata_entry_t availableFormats;
399 res = find_camera_metadata_entry(mDevice->info(),
400 ANDROID_SCALER_AVAILABLE_FORMATS,
401 &availableFormats);
402 {
403 String8 supportedPreviewFormats;
404 bool addComma = false;
405 for (size_t i=0; i < availableFormats.count; i++) {
406 if (addComma) supportedPreviewFormats += ",";
407 addComma = true;
408 switch (availableFormats.data.i32[i]) {
409 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
410 supportedPreviewFormats += "yuv422sp";
411 break;
412 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
413 supportedPreviewFormats += "yuv420sp";
414 break;
415 case HAL_PIXEL_FORMAT_YCbCr_422_I:
416 supportedPreviewFormats += "yuv422i-yuyv";
417 break;
418 case HAL_PIXEL_FORMAT_YV12:
419 supportedPreviewFormats += "yuv420p";
420 break;
421 case HAL_PIXEL_FORMAT_RGB_565:
422 supportedPreviewFormats += "rgb565";
423 break;
424 // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
425 case HAL_PIXEL_FORMAT_RAW_SENSOR:
426 addComma = false;
427 break;
428 default:
429 ALOGW("%s: Camera %d: Unknown preview format: %x",
430 __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
431 addComma = false;
432 break;
433 }
434 }
435 mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
436 supportedPreviewFormats);
437 }
438
439 // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
440 // still have to do something sane for them
441
442 mParams->set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
443 previewFpsRangeMin);
444
445 {
446 String8 supportedPreviewFrameRates;
447 for (size_t i=0; i < availableFpsRanges.count; i += 2) {
448 if (i != 0) supportedPreviewFrameRates += ",";
449 supportedPreviewFrameRates += String8::format("%d",
450 availableFpsRanges.data.i32[i]);
451 }
452 mParams->set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
453 supportedPreviewFrameRates);
454 }
455
456 camera_metadata_entry_t availableJpegSizes;
457 res = find_camera_metadata_entry(mDevice->info(),
458 ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
459 &availableJpegSizes);
460 if (res != OK) return res;
461 if (availableJpegSizes.count < 2) {
462 ALOGE("%s: Camera %d: "
463 "Malformed %s entry",
464 __FUNCTION__, mCameraId,
465 get_camera_metadata_tag_name(
466 ANDROID_SCALER_AVAILABLE_JPEG_SIZES));
467 return NO_INIT;
468 }
469
470 // TODO: Pick maximum
471 int32_t pictureWidth = availableJpegSizes.data.i32[0];
472 int32_t pictureHeight = availableJpegSizes.data.i32[1];
473
474 mParams->setPictureSize(pictureWidth, pictureHeight);
475
476 {
477 String8 supportedPictureSizes;
478 for (size_t i=0; i < availableJpegSizes.count; i += 2) {
479 if (i != 0) supportedPictureSizes += ",";
480 supportedPictureSizes += String8::format("%dx%d",
481 availableJpegSizes.data.i32[i],
482 availableJpegSizes.data.i32[i+1]);
483 }
484 mParams->set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
485 supportedPictureSizes);
486 }
487
488 mParams->setPictureFormat("jpeg");
489
490 mParams->set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
491 "jpeg");
492
493 camera_metadata_entry_t availableJpegThumbnailSizes;
494 res = find_camera_metadata_entry(mDevice->info(),
495 ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
496 &availableJpegThumbnailSizes);
497 if (res != OK) return res;
498 if (availableJpegThumbnailSizes.count < 2) {
499 ALOGE("%s: Camera %d: "
500 "Malformed %s entry",
501 __FUNCTION__, mCameraId,
502 get_camera_metadata_tag_name(
503 ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES));
504 return NO_INIT;
505 }
506
507 // TODO: Pick default thumbnail size sensibly
508 int32_t jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0];
509 int32_t jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1];
510
511 mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
512 jpegThumbWidth);
513 mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
514 jpegThumbHeight);
515
516 {
517 String8 supportedJpegThumbSizes;
518 for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
519 if (i != 0) supportedJpegThumbSizes += ",";
520 supportedJpegThumbSizes += String8::format("%dx%d",
521 availableJpegThumbnailSizes.data.i32[i],
522 availableJpegThumbnailSizes.data.i32[i+1]);
523 }
524 mParams->set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
525 supportedJpegThumbSizes);
526 }
527
528 mParams->set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
529 "90");
530 mParams->set(CameraParameters::KEY_JPEG_QUALITY,
531 "90");
532 mParams->set(CameraParameters::KEY_ROTATION,
533 "0");
534 // Not settting GPS fields
535
536 mParams->set(CameraParameters::KEY_WHITE_BALANCE,
537 "auto");
538
539 camera_metadata_entry_t availableWhiteBalanceModes;
540 res = find_camera_metadata_entry(mDevice->info(),
541 ANDROID_CONTROL_AWB_AVAILABLE_MODES,
542 &availableWhiteBalanceModes);
543 {
544 String8 supportedWhiteBalance;
545 bool addComma = false;
546 for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
547 if (addComma) supportedWhiteBalance += ",";
548 addComma = true;
549 switch (availableWhiteBalanceModes.data.u8[i]) {
550 case ANDROID_CONTROL_AWB_AUTO:
551 supportedWhiteBalance += "auto";
552 break;
553 case ANDROID_CONTROL_AWB_INCANDESCENT:
554 supportedWhiteBalance += "incandescent";
555 break;
556 case ANDROID_CONTROL_AWB_FLUORESCENT:
557 supportedWhiteBalance += "fluorescent";
558 break;
559 case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
560 supportedWhiteBalance += "warm-fluorescent";
561 break;
562 case ANDROID_CONTROL_AWB_DAYLIGHT:
563 supportedWhiteBalance += "daylight";
564 break;
565 case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
566 supportedWhiteBalance += "cloudy-daylight";
567 break;
568 case ANDROID_CONTROL_AWB_TWILIGHT:
569 supportedWhiteBalance += "twilight";
570 break;
571 case ANDROID_CONTROL_AWB_SHADE:
572 supportedWhiteBalance += "shade";
573 break;
574 // Skipping values not mappable to v1 API
575 case ANDROID_CONTROL_AWB_OFF:
576 addComma = false;
577 break;
578 default:
579 ALOGW("%s: Camera %d: Unknown white balance value: %d",
580 __FUNCTION__, mCameraId,
581 availableWhiteBalanceModes.data.u8[i]);
582 addComma = false;
583 break;
584 }
585 }
586 mParams->set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
587 supportedWhiteBalance);
588 }
589
590 mParams->set(CameraParameters::KEY_EFFECT, "none");
591 camera_metadata_entry_t availableEffects;
592 res = find_camera_metadata_entry(mDevice->info(),
593 ANDROID_CONTROL_AVAILABLE_EFFECTS,
594 &availableEffects);
595 if (res != OK) return res;
596 {
597 String8 supportedEffects;
598 bool addComma = false;
599 for (size_t i=0; i < availableEffects.count; i++) {
600 if (addComma) supportedEffects += ",";
601 addComma = true;
602 switch (availableEffects.data.u8[i]) {
603 case ANDROID_CONTROL_EFFECT_OFF:
604 supportedEffects += "none";
605 break;
606 case ANDROID_CONTROL_EFFECT_MONO:
607 supportedEffects += "mono";
608 case ANDROID_CONTROL_EFFECT_NEGATIVE:
609 supportedEffects += "negative";
610 break;
611 case ANDROID_CONTROL_EFFECT_SOLARIZE:
612 supportedEffects += "solarize";
613 break;
614 case ANDROID_CONTROL_EFFECT_SEPIA:
615 supportedEffects += "sepia";
616 break;
617 case ANDROID_CONTROL_EFFECT_POSTERIZE:
618 supportedEffects += "posterize";
619 break;
620 case ANDROID_CONTROL_EFFECT_WHITEBOARD:
621 supportedEffects += "whiteboard";
622 break;
623 case ANDROID_CONTROL_EFFECT_BLACKBOARD:
624 supportedEffects += "blackboard";
625 break;
626 case ANDROID_CONTROL_EFFECT_AQUA:
627 supportedEffects += "aqua";
628 break;
629 default:
630 ALOGW("%s: Camera %d: Unknown effect value: %d",
631 __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
632 addComma = false;
633 break;
634 }
635 }
636 mParams->set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
637 }
638
639 mParams->set(CameraParameters::KEY_ANTIBANDING, "auto");
640 camera_metadata_entry_t availableAntibandingModes;
641 res = find_camera_metadata_entry(mDevice->info(),
642 ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
643 &availableAntibandingModes);
644 if (res != OK) return res;
645 {
646 String8 supportedAntibanding;
647 bool addComma = false;
648 for (size_t i=0; i < availableAntibandingModes.count; i++) {
649 if (addComma) supportedAntibanding += ",";
650 addComma = true;
651 switch (availableAntibandingModes.data.u8[i]) {
652 case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
653 supportedAntibanding += "off";
654 break;
655 case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
656 supportedAntibanding += "50hz";
657 break;
658 case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
659 supportedAntibanding += "60hz";
660 break;
661 case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
662 supportedAntibanding += "auto";
663 break;
664 default:
665 ALOGW("%s: Camera %d: Unknown antibanding value: %d",
666 __FUNCTION__, mCameraId,
667 availableAntibandingModes.data.u8[i]);
668 addComma = false;
669 break;
670 }
671 }
672 mParams->set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
673 supportedAntibanding);
674 }
675
676 mParams->set(CameraParameters::KEY_SCENE_MODE, "auto");
677 camera_metadata_entry_t availableSceneModes;
678 res = find_camera_metadata_entry(mDevice->info(),
679 ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
680 &availableSceneModes);
681 if (res != OK) return res;
682 {
683 String8 supportedSceneModes("auto");
684 bool addComma = true;
685 bool noSceneModes = false;
686 for (size_t i=0; i < availableSceneModes.count; i++) {
687 if (addComma) supportedSceneModes += ",";
688 addComma = true;
689 switch (availableSceneModes.data.u8[i]) {
690 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
691 noSceneModes = true;
692 break;
693 case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
694 // Not in old API
695 addComma = false;
696 break;
697 case ANDROID_CONTROL_SCENE_MODE_ACTION:
698 supportedSceneModes += "action";
699 break;
700 case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
701 supportedSceneModes += "portrait";
702 break;
703 case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
704 supportedSceneModes += "landscape";
705 break;
706 case ANDROID_CONTROL_SCENE_MODE_NIGHT:
707 supportedSceneModes += "night";
708 break;
709 case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
710 supportedSceneModes += "night-portrait";
711 break;
712 case ANDROID_CONTROL_SCENE_MODE_THEATRE:
713 supportedSceneModes += "theatre";
714 break;
715 case ANDROID_CONTROL_SCENE_MODE_BEACH:
716 supportedSceneModes += "beach";
717 break;
718 case ANDROID_CONTROL_SCENE_MODE_SNOW:
719 supportedSceneModes += "snow";
720 break;
721 case ANDROID_CONTROL_SCENE_MODE_SUNSET:
722 supportedSceneModes += "sunset";
723 break;
724 case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
725 supportedSceneModes += "steadyphoto";
726 break;
727 case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
728 supportedSceneModes += "fireworks";
729 break;
730 case ANDROID_CONTROL_SCENE_MODE_SPORTS:
731 supportedSceneModes += "sports";
732 break;
733 case ANDROID_CONTROL_SCENE_MODE_PARTY:
734 supportedSceneModes += "party";
735 break;
736 case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
737 supportedSceneModes += "candlelight";
738 break;
739 case ANDROID_CONTROL_SCENE_MODE_BARCODE:
740 supportedSceneModes += "barcode";
741 break;
742 default:
743 ALOGW("%s: Camera %d: Unknown scene mode value: %d",
744 __FUNCTION__, mCameraId, availableSceneModes.data.u8[i]);
745 addComma = false;
746 break;
747 }
748 }
749 if (!noSceneModes) {
750 mParams->set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
751 supportedSceneModes);
752 }
753 }
754
755 camera_metadata_entry_t flashAvailable;
756 res = find_camera_metadata_entry(mDevice->info(),
757 ANDROID_FLASH_AVAILABLE, &flashAvailable);
758 if (res != OK) return res;
759
760 camera_metadata_entry_t availableAeModes;
761 res = find_camera_metadata_entry(mDevice->info(),
762 ANDROID_CONTROL_AE_AVAILABLE_MODES,
763 &availableAeModes);
764 if (res != OK) return res;
765
766 if (flashAvailable.data.u8[0]) {
767 mParams->set(CameraParameters::KEY_FLASH_MODE, "auto");
768 String8 supportedFlashModes("off,auto,on,torch");
769 for (size_t i=0; i < availableAeModes.count; i++) {
770 if (availableAeModes.data.u8[i] ==
771 ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
772 supportedFlashModes += ",red-eye";
773 break;
774 }
775 }
776 mParams->set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
777 supportedFlashModes);
778 }
779
780 camera_metadata_entry_t minFocusDistance;
781 res = find_camera_metadata_entry(mDevice->info(),
782 ANDROID_LENS_MINIMUM_FOCUS_DISTANCE,
783 &minFocusDistance);
784 if (res != OK) return res;
785 camera_metadata_entry_t availableAfModes;
786 res = find_camera_metadata_entry(mDevice->info(),
787 ANDROID_CONTROL_AF_AVAILABLE_MODES,
788 &availableAfModes);
789 if (res != OK) return res;
790 if (minFocusDistance.data.f[0] == 0) {
791 // Fixed-focus lens
792 mParams->set(CameraParameters::KEY_FOCUS_MODE, "fixed");
793 mParams->set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, "fixed");
794 } else {
795 mParams->set(CameraParameters::KEY_FOCUS_MODE, "auto");
796 String8 supportedFocusModes("fixed,infinity");
797 bool addComma = true;
798 for (size_t i=0; i < availableAfModes.count; i++) {
799 if (addComma) supportedFocusModes += ",";
800 addComma = true;
801 switch (availableAfModes.data.u8[i]) {
802 case ANDROID_CONTROL_AF_AUTO:
803 supportedFocusModes += "auto";
804 break;
805 case ANDROID_CONTROL_AF_MACRO:
806 supportedFocusModes += "macro";
807 break;
808 case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
809 supportedFocusModes += "continuous-video";
810 break;
811 case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
812 supportedFocusModes += "continuous-picture";
813 break;
814 case ANDROID_CONTROL_AF_EDOF:
815 supportedFocusModes += "edof";
816 break;
817 // Not supported in v1 API
818 case ANDROID_CONTROL_AF_OFF:
819 addComma = false;
820 break;
821 default:
822 ALOGW("%s: Camera %d: Unknown AF mode value: %d",
823 __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
824 addComma = false;
825 break;
826 }
827 }
828 mParams->set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
829 supportedFocusModes);
830 }
831
832 camera_metadata_entry_t max3aRegions;
833 res = find_camera_metadata_entry(mDevice->info(),
834 ANDROID_CONTROL_MAX_REGIONS, &max3aRegions);
835 if (res != OK) return res;
836
837 mParams->set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
838 max3aRegions.data.i32[0]);
839 mParams->set(CameraParameters::KEY_FOCUS_AREAS,
840 "(0,0,0,0,0)");
841
842 camera_metadata_entry_t availableFocalLengths;
843 res = find_camera_metadata_entry(mDevice->info(),
844 ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS,
845 &availableFocalLengths);
846 if (res != OK) return res;
847 float minFocalLength = availableFocalLengths.data.f[0];
848 mParams->setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
849
850 camera_metadata_entry_t sensorSize;
851 res = find_camera_metadata_entry(mDevice->info(),
852 ANDROID_SENSOR_PHYSICAL_SIZE,
853 &sensorSize);
854 if (res != OK) return res;
855
856 // The fields of view here assume infinity focus, maximum wide angle
857 float horizFov = 180 / M_PI *
858 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
859 float vertFov = 180 / M_PI *
860 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
861 mParams->setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
862 mParams->setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
863
864 mParams->set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 0);
865
866 camera_metadata_entry_t exposureCompensationRange;
867 res = find_camera_metadata_entry(mDevice->info(),
868 ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE,
869 &exposureCompensationRange);
870 if (res != OK) return res;
871 mParams->set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
872 exposureCompensationRange.data.i32[1]);
873 mParams->set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
874 exposureCompensationRange.data.i32[0]);
875
876 camera_metadata_entry_t exposureCompensationStep;
877 res = find_camera_metadata_entry(mDevice->info(),
878 ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP,
879 &exposureCompensationStep);
880 if (res != OK) return res;
881 mParams->setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
882 exposureCompensationStep.data.r[0].numerator /
883 exposureCompensationStep.data.r[0].denominator);
884
885 mParams->set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, "false");
886 mParams->set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, "true");
887
888 mParams->set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, "false");
889 mParams->set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, "true");
890
891 mParams->set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
892 max3aRegions.data.i32[0]);
893 mParams->set(CameraParameters::KEY_METERING_AREAS,
894 "(0,0,0,0,0)");
895
896 mParams->set(CameraParameters::KEY_ZOOM, 0);
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700897 mParams->set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700898
899 camera_metadata_entry_t maxDigitalZoom;
900 res = find_camera_metadata_entry(mDevice->info(),
901 ANDROID_SCALER_AVAILABLE_MAX_ZOOM, &maxDigitalZoom);
902 if (res != OK) return res;
903
904 {
905 String8 zoomRatios;
906 float zoom = 1.f;
907 float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700908 (NUM_ZOOM_STEPS-1);
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700909 bool addComma = false;
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700910 for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700911 if (addComma) zoomRatios += ",";
912 addComma = true;
913 zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
914 zoom += zoomIncrement;
915 }
916 mParams->set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
917 }
918
919 mParams->set(CameraParameters::KEY_ZOOM_SUPPORTED, "true");
920 mParams->set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, "true");
921
922 mParams->set(CameraParameters::KEY_FOCUS_DISTANCES,
923 "Infinity,Infinity,Infinity");
924
925 camera_metadata_entry_t maxFacesDetected;
926 res = find_camera_metadata_entry(mDevice->info(),
927 ANDROID_STATS_MAX_FACE_COUNT,
928 &maxFacesDetected);
929 mParams->set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
930 maxFacesDetected.data.i32[0]);
931 mParams->set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
932 0);
933
934 mParams->set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
935 "yuv420sp");
936
937 mParams->set(CameraParameters::KEY_RECORDING_HINT,
938 "false");
939
940 mParams->set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
941 "true");
942
943 mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION,
944 "false");
945
946 camera_metadata_entry_t availableVideoStabilizationModes;
947 res = find_camera_metadata_entry(mDevice->info(),
948 ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
949 &availableVideoStabilizationModes);
950 if (res != OK) return res;
951 if (availableVideoStabilizationModes.count > 1) {
952 mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
953 "true");
954 } else {
955 mParams->set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
956 "false");
957 }
958
959 return OK;
960}
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700961
Eino-Ville Talvala6db981c2012-05-21 18:54:30 -0700962status_t Camera2Client::updatePreviewRequest() {
963 ALOG1_ENTRY
964 status_t res;
965 if (mPreviewRequest == NULL) {
966 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
967 &mPreviewRequest);
968 if (res != OK) {
969 ALOGE("%s: Camera %d: Unable to create default preview request: "
970 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
971 return res;
972 }
973 }
974 // TODO: Adjust for mParams changes
975 ALOG1_EXIT
976 return OK;
977}
978
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700979} // namespace android