Camera2Client.cpp revision 4ecfec32aca8749baeb634f7c961f804cb1e8f3e
1/*
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 ATRACE_TAG ATRACE_TAG_CAMERA
19//#define LOG_NDEBUG 0
20
21#include <utils/Log.h>
22#include <utils/Trace.h>
23
24#include <cutils/properties.h>
25#include <gui/SurfaceTextureClient.h>
26#include <gui/Surface.h>
27
28#include <math.h>
29
30#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
37static 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,
49        int cameraId,
50        int cameraFacing,
51        int clientPid):
52        Client(cameraService, cameraClient,
53                cameraId, cameraFacing, clientPid),
54        mState(NOT_INITIALIZED),
55        mPreviewStreamId(NO_STREAM),
56        mPreviewRequest(NULL),
57        mCaptureStreamId(NO_STREAM),
58        mCaptureRequest(NULL)
59{
60    ATRACE_CALL();
61
62    mDevice = new Camera2Device(cameraId);
63}
64
65status_t Camera2Client::initialize(camera_module_t *module)
66{
67    ATRACE_CALL();
68    status_t res;
69
70    res = mDevice->initialize(module);
71    if (res != OK) {
72        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
73                __FUNCTION__, mCameraId, strerror(-res), res);
74        return NO_INIT;
75    }
76
77    res = buildDefaultParameters();
78    if (res != OK) {
79        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
80                __FUNCTION__, mCameraId, strerror(-res), res);
81        return NO_INIT;
82    }
83
84    if (gLogLevel >= 1) {
85        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
86              mCameraId);
87        ALOGD("%s", mParamsFlattened.string());
88    }
89
90    mState = STOPPED;
91
92    return OK;
93}
94
95Camera2Client::~Camera2Client() {
96    ATRACE_CALL();
97    ALOGV("%s: Camera %d: Shutting down", __FUNCTION__, mCameraId);
98
99    mDestructionStarted = true;
100
101    disconnect();
102
103}
104
105status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
106    String8 result;
107    result.appendFormat("Client2[%d] (%p) PID: %d:\n",
108            mCameraId,
109            getCameraClient()->asBinder().get(),
110            mClientPid);
111    result.append("  State: ");
112#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
113
114    result.append(getStateName(mState));
115
116    result.append("\n  Current parameters:\n");
117    result.appendFormat("    Preview size: %d x %d\n",
118            mParameters.previewWidth, mParameters.previewHeight);
119    result.appendFormat("    Preview FPS range: %d - %d\n",
120            mParameters.previewFpsRangeMin, mParameters.previewFpsRangeMax);
121    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
122            mParameters.previewFormat);
123    result.appendFormat("    Picture size: %d x %d\n",
124            mParameters.pictureWidth, mParameters.pictureHeight);
125    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
126            mParameters.jpegThumbWidth, mParameters.jpegThumbHeight);
127    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
128            mParameters.jpegQuality, mParameters.jpegThumbQuality);
129    result.appendFormat("    Jpeg rotation: %d\n", mParameters.jpegRotation);
130    result.appendFormat("    GPS tags %s\n",
131            mParameters.gpsEnabled ? "enabled" : "disabled");
132    if (mParameters.gpsEnabled) {
133        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
134                mParameters.gpsLatitude, mParameters.gpsLongitude,
135                mParameters.gpsAltitude);
136        result.appendFormat("    GPS timestamp: %lld\n",
137                mParameters.gpsTimestamp);
138        result.appendFormat("    GPS processing method: %s\n",
139                mParameters.gpsProcessingMethod.string());
140    }
141
142    result.append("    White balance mode: ");
143    switch (mParameters.wbMode) {
144        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
145        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
146        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
147        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
148        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
149        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
150        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
151        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
152        default: result.append("UNKNOWN\n");
153    }
154
155    result.append("    Effect mode: ");
156    switch (mParameters.effectMode) {
157        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
158        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
159        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
160        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
161        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
162        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
163        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
164        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
165        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
166        default: result.append("UNKNOWN\n");
167    }
168
169    result.append("    Antibanding mode: ");
170    switch (mParameters.antibandingMode) {
171        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
172        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
173        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
174        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
175        default: result.append("UNKNOWN\n");
176    }
177
178    result.append("    Scene mode: ");
179    switch (mParameters.sceneMode) {
180        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
181            result.append("AUTO\n"); break;
182        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
183        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
184        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
185        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
186        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
187        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
188        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
189        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
190        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
191        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
192        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
193        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
194        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
195        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
196        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
197        default: result.append("UNKNOWN\n");
198    }
199
200    result.append("    Flash mode: ");
201    switch (mParameters.flashMode) {
202        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
203        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
204        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
205        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
206        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
207        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
208        default: result.append("UNKNOWN\n");
209    }
210
211    result.append("    Focus mode: ");
212    switch (mParameters.focusMode) {
213        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
214        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
215        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
216        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
217        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
218        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
219        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
220        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
221        default: result.append("UNKNOWN\n");
222    }
223
224    result.append("    Focusing areas:\n");
225    for (size_t i = 0; i < mParameters.focusingAreas.size(); i++) {
226        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
227                mParameters.focusingAreas[i].left,
228                mParameters.focusingAreas[i].top,
229                mParameters.focusingAreas[i].right,
230                mParameters.focusingAreas[i].bottom,
231                mParameters.focusingAreas[i].weight);
232    }
233
234    result.appendFormat("    Exposure compensation index: %d\n",
235            mParameters.exposureCompensation);
236
237    result.appendFormat("    AE lock %s, AWB lock %s\n",
238            mParameters.autoExposureLock ? "enabled" : "disabled",
239            mParameters.autoWhiteBalanceLock ? "enabled" : "disabled" );
240
241    result.appendFormat("    Metering areas:\n");
242    for (size_t i = 0; i < mParameters.meteringAreas.size(); i++) {
243        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
244                mParameters.meteringAreas[i].left,
245                mParameters.meteringAreas[i].top,
246                mParameters.meteringAreas[i].right,
247                mParameters.meteringAreas[i].bottom,
248                mParameters.meteringAreas[i].weight);
249    }
250
251    result.appendFormat("   Zoom index: %d\n", mParameters.zoom);
252    result.appendFormat("   Video size: %d x %d\n", mParameters.videoWidth,
253            mParameters.videoHeight);
254
255    result.appendFormat("   Recording hint is %s\n",
256            mParameters.recordingHint ? "set" : "not set");
257
258    result.appendFormat("   Video stabilization is %s\n",
259            mParameters.videoStabilization ? "enabled" : "disabled");
260
261    write(fd, result.string(), result.size());
262
263    // TODO: Dump Camera2Device
264
265#undef CASE_APPEND_ENUM
266    return NO_ERROR;
267}
268
269const char* Camera2Client::getStateName(State state) {
270#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
271    switch(state) {
272        CASE_ENUM_TO_CHAR(NOT_INITIALIZED)
273        CASE_ENUM_TO_CHAR(STOPPED)
274        CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
275        CASE_ENUM_TO_CHAR(PREVIEW)
276        CASE_ENUM_TO_CHAR(RECORD)
277        CASE_ENUM_TO_CHAR(STILL_CAPTURE)
278        CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
279        default:
280            return "Unknown state!";
281            break;
282    }
283#undef CASE_ENUM_TO_CHAR
284}
285
286// ICamera interface
287
288void Camera2Client::disconnect() {
289    ATRACE_CALL();
290    Mutex::Autolock icl(mICameraLock);
291
292    if (mDevice == 0) return;
293
294    stopPreviewLocked();
295
296    mDevice->waitUntilDrained();
297
298    if (mPreviewStreamId != NO_STREAM) {
299        mDevice->deleteStream(mPreviewStreamId);
300        mPreviewStreamId = NO_STREAM;
301    }
302
303    if (mCaptureStreamId != NO_STREAM) {
304        mDevice->deleteStream(mCaptureStreamId);
305        mCaptureStreamId = NO_STREAM;
306    }
307
308    CameraService::Client::disconnect();
309}
310
311status_t Camera2Client::connect(const sp<ICameraClient>& client) {
312    ATRACE_CALL();
313    Mutex::Autolock icl(mICameraLock);
314
315    return BAD_VALUE;
316}
317
318status_t Camera2Client::lock() {
319    ATRACE_CALL();
320    Mutex::Autolock icl(mICameraLock);
321
322    return BAD_VALUE;
323}
324
325status_t Camera2Client::unlock() {
326    ATRACE_CALL();
327    Mutex::Autolock icl(mICameraLock);
328
329    return BAD_VALUE;
330}
331
332status_t Camera2Client::setPreviewDisplay(
333        const sp<Surface>& surface) {
334    ATRACE_CALL();
335    Mutex::Autolock icl(mICameraLock);
336
337    if (mState >= PREVIEW) return INVALID_OPERATION;
338
339    sp<IBinder> binder;
340    sp<ANativeWindow> window;
341    if (surface != 0) {
342        binder = surface->asBinder();
343        window = surface;
344    }
345
346    return setPreviewWindowLocked(binder,window);
347}
348
349status_t Camera2Client::setPreviewTexture(
350        const sp<ISurfaceTexture>& surfaceTexture) {
351    ATRACE_CALL();
352    Mutex::Autolock icl(mICameraLock);
353
354    if (mState >= PREVIEW) return INVALID_OPERATION;
355
356    sp<IBinder> binder;
357    sp<ANativeWindow> window;
358    if (surfaceTexture != 0) {
359        binder = surfaceTexture->asBinder();
360        window = new SurfaceTextureClient(surfaceTexture);
361    }
362    return setPreviewWindowLocked(binder, window);
363}
364
365status_t Camera2Client::setPreviewWindowLocked(const sp<IBinder>& binder,
366        const sp<ANativeWindow>& window) {
367    ATRACE_CALL();
368    status_t res;
369
370    if (binder == mPreviewSurface) {
371        return NO_ERROR;
372    }
373
374    // TODO: Should wait until HAL has no remaining requests
375
376    if (mPreviewStreamId != NO_STREAM) {
377        res = mDevice->deleteStream(mPreviewStreamId);
378        if (res != OK) {
379            return res;
380        }
381    }
382    res = mDevice->createStream(window,
383            mParameters.previewWidth, mParameters.previewHeight,
384            CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
385            &mPreviewStreamId);
386    if (res != OK) {
387        return res;
388    }
389
390    mPreviewSurface = binder;
391
392    if (mState == WAITING_FOR_PREVIEW_WINDOW) {
393        return startPreviewLocked();
394    }
395
396    return OK;
397}
398
399void Camera2Client::setPreviewCallbackFlag(int flag) {
400    ATRACE_CALL();
401    Mutex::Autolock icl(mICameraLock);
402}
403
404status_t Camera2Client::startPreview() {
405    ATRACE_CALL();
406    Mutex::Autolock icl(mICameraLock);
407    return startPreviewLocked();
408}
409
410status_t Camera2Client::startPreviewLocked() {
411    ATRACE_CALL();
412    status_t res;
413    if (mState >= PREVIEW) {
414        ALOGE("%s: Can't start preview in state %s",
415                __FUNCTION__, getStateName(mState));
416        return INVALID_OPERATION;
417    }
418
419    if (mPreviewStreamId == NO_STREAM) {
420        mState = WAITING_FOR_PREVIEW_WINDOW;
421        return OK;
422    }
423
424    if (mPreviewRequest == NULL) {
425        updatePreviewRequest();
426    }
427
428    uint8_t outputStream = mPreviewStreamId;
429
430    camera_metadata_entry_t outputStreams;
431    res = find_camera_metadata_entry(mPreviewRequest,
432            ANDROID_REQUEST_OUTPUT_STREAMS,
433            &outputStreams);
434    if (res == NAME_NOT_FOUND) {
435        res = add_camera_metadata_entry(mPreviewRequest,
436                ANDROID_REQUEST_OUTPUT_STREAMS,
437                &outputStream, 1);
438    } else if (res == OK) {
439        res = update_camera_metadata_entry(mPreviewRequest,
440                outputStreams.index, &outputStream, 1, NULL);
441    }
442
443    if (res != OK) {
444        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
445                __FUNCTION__, mCameraId, strerror(-res), res);
446        mState = STOPPED;
447        return res;
448    }
449
450    res = mDevice->setStreamingRequest(mPreviewRequest);
451    if (res != OK) {
452        ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
453                "%s (%d)",
454                __FUNCTION__, mCameraId, strerror(-res), res);
455        mState = STOPPED;
456        return res;
457    }
458    mState = PREVIEW;
459
460    return OK;
461}
462
463void Camera2Client::stopPreview() {
464    ATRACE_CALL();
465    Mutex::Autolock icl(mICameraLock);
466    stopPreviewLocked();
467}
468
469void Camera2Client::stopPreviewLocked() {
470    ATRACE_CALL();
471    switch (mState) {
472        case NOT_INITIALIZED:
473            ALOGE("%s: Camera %d: Call before initialized",
474                    __FUNCTION__, mCameraId);
475            break;
476        case STOPPED:
477            break;
478        case STILL_CAPTURE:
479            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
480                    __FUNCTION__, mCameraId);
481            break;
482        case RECORD:
483            // TODO: Handle record stop here
484        case PREVIEW:
485            mDevice->setStreamingRequest(NULL);
486        case WAITING_FOR_PREVIEW_WINDOW:
487            mState = STOPPED;
488            break;
489        default:
490            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
491                    mState);
492    }
493}
494
495bool Camera2Client::previewEnabled() {
496    ATRACE_CALL();
497    Mutex::Autolock icl(mICameraLock);
498    return mState == PREVIEW;
499}
500
501status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
502    ATRACE_CALL();
503    Mutex::Autolock icl(mICameraLock);
504    return BAD_VALUE;
505}
506
507status_t Camera2Client::startRecording() {
508    ATRACE_CALL();
509    Mutex::Autolock icl(mICameraLock);
510    return BAD_VALUE;
511}
512
513void Camera2Client::stopRecording() {
514    ATRACE_CALL();
515    Mutex::Autolock icl(mICameraLock);
516}
517
518bool Camera2Client::recordingEnabled() {
519    ATRACE_CALL();
520    Mutex::Autolock icl(mICameraLock);
521    return BAD_VALUE;
522}
523
524void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
525    ATRACE_CALL();
526    Mutex::Autolock icl(mICameraLock);
527}
528
529status_t Camera2Client::autoFocus() {
530    ATRACE_CALL();
531    Mutex::Autolock icl(mICameraLock);
532    return OK;
533}
534
535status_t Camera2Client::cancelAutoFocus() {
536    ATRACE_CALL();
537    Mutex::Autolock icl(mICameraLock);
538    return OK;
539}
540
541status_t Camera2Client::takePicture(int msgType) {
542    ATRACE_CALL();
543    Mutex::Autolock icl(mICameraLock);
544    status_t res;
545
546    switch (mState) {
547        case NOT_INITIALIZED:
548        case STOPPED:
549        case WAITING_FOR_PREVIEW_WINDOW:
550            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
551                    __FUNCTION__, mCameraId);
552            return INVALID_OPERATION;
553        case PREVIEW:
554        case RECORD:
555            // Good to go for takePicture
556            break;
557        case STILL_CAPTURE:
558        case VIDEO_SNAPSHOT:
559            ALOGE("%s: Camera %d: Already taking a picture",
560                    __FUNCTION__, mCameraId);
561            return INVALID_OPERATION;
562    }
563
564    Mutex::Autolock pl(mParamsLock);
565
566    res = updateCaptureStream();
567    if (res != OK) {
568        ALOGE("%s: Can't set up still image stream: %s (%d)",
569                __FUNCTION__, strerror(-res), res);
570        return res;
571    }
572
573    if (mCaptureRequest == NULL) {
574        res = updateCaptureRequest();
575        if (res != OK) {
576            ALOGE("%s: Can't set up still image capture request: %s (%d)",
577                    __FUNCTION__, strerror(-res), res);
578            return res;
579        }
580    }
581
582    // TODO: For video snapshot, need 3 streams here
583    camera_metadata_entry_t outputStreams;
584    uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId };
585    res = find_camera_metadata_entry(mCaptureRequest,
586            ANDROID_REQUEST_OUTPUT_STREAMS,
587            &outputStreams);
588    if (res == NAME_NOT_FOUND) {
589        res = add_camera_metadata_entry(mCaptureRequest,
590                ANDROID_REQUEST_OUTPUT_STREAMS,
591                streamIds, 2);
592    } else if (res == OK) {
593        res = update_camera_metadata_entry(mCaptureRequest,
594                outputStreams.index, streamIds, 2, NULL);
595    }
596
597    if (res != OK) {
598        ALOGE("%s: Camera %d: Unable to set up still image capture request: "
599                "%s (%d)",
600                __FUNCTION__, mCameraId, strerror(-res), res);
601        return res;
602    }
603
604    camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest);
605    if (captureCopy == NULL) {
606        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
607                __FUNCTION__, mCameraId);
608        return NO_MEMORY;
609    }
610
611    if (mState == PREVIEW) {
612        res = mDevice->setStreamingRequest(NULL);
613        if (res != OK) {
614            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
615                    "%s (%d)",
616                    __FUNCTION__, mCameraId, strerror(-res), res);
617            return res;
618        }
619    }
620
621    res = mDevice->capture(captureCopy);
622    if (res != OK) {
623        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
624                "%s (%d)",
625                __FUNCTION__, mCameraId, strerror(-res), res);
626        return res;
627    }
628
629    switch (mState) {
630        case PREVIEW:
631            mState = STILL_CAPTURE;
632            break;
633        case RECORD:
634            mState = VIDEO_SNAPSHOT;
635            break;
636        default:
637            ALOGE("%s: Camera %d: Unknown state for still capture!",
638                    __FUNCTION__, mCameraId);
639            return INVALID_OPERATION;
640    }
641
642    return OK;
643}
644
645status_t Camera2Client::setParameters(const String8& params) {
646    ATRACE_CALL();
647    Mutex::Autolock icl(mICameraLock);
648    Mutex::Autolock pl(mParamsLock);
649    status_t res;
650
651    CameraParameters newParams(params);
652
653    // TODO: Currently ignoring any changes to supposedly read-only
654    // parameters such as supported preview sizes, etc. Should probably
655    // produce an error if they're changed.
656
657    /** Extract and verify new parameters */
658
659    size_t i;
660
661    // PREVIEW_SIZE
662    int previewWidth, previewHeight;
663    newParams.getPreviewSize(&previewWidth, &previewHeight);
664
665    if (previewWidth != mParameters.previewWidth ||
666            previewHeight != mParameters.previewHeight) {
667        if (mState >= PREVIEW) {
668            ALOGE("%s: Preview size cannot be updated when preview "
669                    "is active!", __FUNCTION__);
670            return BAD_VALUE;
671        }
672        camera_metadata_entry_t availablePreviewSizes =
673            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
674        for (i = 0; i < availablePreviewSizes.count; i += 2 ) {
675            if (availablePreviewSizes.data.i32[i] == previewWidth &&
676                    availablePreviewSizes.data.i32[i+1] == previewHeight) break;
677        }
678        if (i == availablePreviewSizes.count) {
679            ALOGE("%s: Requested preview size %d x %d is not supported",
680                    __FUNCTION__, previewWidth, previewHeight);
681            return BAD_VALUE;
682        }
683    }
684
685    // PREVIEW_FPS_RANGE
686    int previewFpsRangeMin, previewFpsRangeMax, previewFps = 0;
687    bool fpsRangeChanged = false;
688    newParams.getPreviewFpsRange(&previewFpsRangeMin, &previewFpsRangeMax);
689    if (previewFpsRangeMin != mParameters.previewFpsRangeMin ||
690            previewFpsRangeMax != mParameters.previewFpsRangeMax) {
691        fpsRangeChanged = true;
692        camera_metadata_entry_t availablePreviewFpsRanges =
693            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
694        for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
695            if ((availablePreviewFpsRanges.data.i32[i] ==
696                    previewFpsRangeMin) &&
697                (availablePreviewFpsRanges.data.i32[i+1] ==
698                    previewFpsRangeMax) ) {
699                break;
700            }
701        }
702        if (i == availablePreviewFpsRanges.count) {
703            ALOGE("%s: Requested preview FPS range %d - %d is not supported",
704                __FUNCTION__, previewFpsRangeMin, previewFpsRangeMax);
705            return BAD_VALUE;
706        }
707        previewFps = previewFpsRangeMin;
708    }
709
710    // PREVIEW_FORMAT
711    int previewFormat = formatStringToEnum(newParams.getPreviewFormat());
712    if (previewFormat != mParameters.previewFormat) {
713        if (mState >= PREVIEW) {
714            ALOGE("%s: Preview format cannot be updated when preview "
715                    "is active!", __FUNCTION__);
716            return BAD_VALUE;
717        }
718        camera_metadata_entry_t availableFormats =
719            staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
720        for (i = 0; i < availableFormats.count; i++) {
721            if (availableFormats.data.i32[i] == previewFormat) break;
722        }
723        if (i == availableFormats.count) {
724            ALOGE("%s: Requested preview format %s (0x%x) is not supported",
725                    __FUNCTION__, newParams.getPreviewFormat(), previewFormat);
726            return BAD_VALUE;
727        }
728    }
729
730    // PREVIEW_FRAME_RATE
731    // Deprecated, only use if the preview fps range is unchanged this time.
732    // The single-value FPS is the same as the minimum of the range.
733    if (!fpsRangeChanged) {
734        previewFps = newParams.getPreviewFrameRate();
735        if (previewFps != mParameters.previewFps) {
736            camera_metadata_entry_t availableFrameRates =
737                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
738            for (i = 0; i < availableFrameRates.count; i+=2) {
739                if (availableFrameRates.data.i32[i] == previewFps) break;
740            }
741            if (i == availableFrameRates.count) {
742                ALOGE("%s: Requested preview frame rate %d is not supported",
743                        __FUNCTION__, previewFps);
744                return BAD_VALUE;
745            }
746            previewFpsRangeMin = availableFrameRates.data.i32[i];
747            previewFpsRangeMax = availableFrameRates.data.i32[i+1];
748        }
749    }
750
751    // PICTURE_SIZE
752    int pictureWidth, pictureHeight;
753    newParams.getPictureSize(&pictureWidth, &pictureHeight);
754    if (pictureWidth == mParameters.pictureWidth ||
755            pictureHeight == mParameters.pictureHeight) {
756        camera_metadata_entry_t availablePictureSizes =
757            staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
758        for (i = 0; i < availablePictureSizes.count; i+=2) {
759            if (availablePictureSizes.data.i32[i] == pictureWidth &&
760                    availablePictureSizes.data.i32[i+1] == pictureHeight) break;
761        }
762        if (i == availablePictureSizes.count) {
763            ALOGE("%s: Requested picture size %d x %d is not supported",
764                    __FUNCTION__, pictureWidth, pictureHeight);
765            return BAD_VALUE;
766        }
767    }
768
769    // JPEG_THUMBNAIL_WIDTH/HEIGHT
770    int jpegThumbWidth, jpegThumbHeight;
771    jpegThumbWidth =
772            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
773    jpegThumbHeight =
774            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
775    if (jpegThumbWidth != mParameters.jpegThumbWidth ||
776            jpegThumbHeight != mParameters.jpegThumbHeight) {
777        camera_metadata_entry_t availableJpegThumbSizes =
778            staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
779        for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
780            if (availableJpegThumbSizes.data.i32[i] == jpegThumbWidth &&
781                    availableJpegThumbSizes.data.i32[i+1] == jpegThumbHeight) {
782                break;
783            }
784        }
785        if (i == availableJpegThumbSizes.count) {
786            ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
787                    __FUNCTION__, jpegThumbWidth, jpegThumbHeight);
788            return BAD_VALUE;
789        }
790    }
791
792    // JPEG_THUMBNAIL_QUALITY
793    int jpegThumbQuality =
794            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
795    if (jpegThumbQuality < 0 || jpegThumbQuality > 100) {
796        ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
797                __FUNCTION__, jpegThumbQuality);
798        return BAD_VALUE;
799    }
800
801    // JPEG_QUALITY
802    int jpegQuality =
803            newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
804    if (jpegQuality < 0 || jpegQuality > 100) {
805        ALOGE("%s: Requested JPEG quality %d is not supported",
806                __FUNCTION__, jpegQuality);
807        return BAD_VALUE;
808    }
809
810    // ROTATION
811    int jpegRotation =
812            newParams.getInt(CameraParameters::KEY_ROTATION);
813    if (jpegRotation != 0 &&
814            jpegRotation != 90 &&
815            jpegRotation != 180 &&
816            jpegRotation != 270) {
817        ALOGE("%s: Requested picture rotation angle %d is not supported",
818                __FUNCTION__, jpegRotation);
819        return BAD_VALUE;
820    }
821
822    // GPS
823    bool gpsEnabled = false;
824    double gpsLatitude = 0, gpsLongitude = 0, gpsAltitude = 0;
825    int64_t gpsTimestamp = 0;
826    String8 gpsProcessingMethod;
827    const char *gpsLatStr =
828            newParams.get(CameraParameters::KEY_GPS_LATITUDE);
829    if (gpsLatStr != NULL) {
830        const char *gpsLongStr =
831                newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
832        const char *gpsAltitudeStr =
833                newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
834        const char *gpsTimeStr =
835                newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
836        const char *gpsProcMethodStr =
837                newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
838        if (gpsLongStr == NULL ||
839                gpsAltitudeStr == NULL ||
840                gpsTimeStr == NULL ||
841                gpsProcMethodStr == NULL) {
842            ALOGE("%s: Incomplete set of GPS parameters provided",
843                    __FUNCTION__);
844            return BAD_VALUE;
845        }
846        char *endPtr;
847        errno = 0;
848        gpsLatitude = strtod(gpsLatStr, &endPtr);
849        if (errno || endPtr == gpsLatStr) {
850            ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
851            return BAD_VALUE;
852        }
853        errno = 0;
854        gpsLongitude = strtod(gpsLongStr, &endPtr);
855        if (errno || endPtr == gpsLongStr) {
856            ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
857            return BAD_VALUE;
858        }
859        errno = 0;
860        gpsAltitude = strtod(gpsAltitudeStr, &endPtr);
861        if (errno || endPtr == gpsAltitudeStr) {
862            ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
863                    gpsAltitudeStr);
864            return BAD_VALUE;
865        }
866        errno = 0;
867        gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
868        if (errno || endPtr == gpsTimeStr) {
869            ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
870            return BAD_VALUE;
871        }
872        gpsProcessingMethod = gpsProcMethodStr;
873
874        gpsEnabled = true;
875    }
876
877    // WHITE_BALANCE
878    int wbMode = wbModeStringToEnum(
879        newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
880    if (wbMode != mParameters.wbMode) {
881        camera_metadata_entry_t availableWbModes =
882            staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
883        for (i = 0; i < availableWbModes.count; i++) {
884            if (wbMode == availableWbModes.data.u8[i]) break;
885        }
886        if (i == availableWbModes.count) {
887            ALOGE("%s: Requested white balance mode %s is not supported",
888                    __FUNCTION__,
889                    newParams.get(CameraParameters::KEY_WHITE_BALANCE));
890            return BAD_VALUE;
891        }
892    }
893
894    // EFFECT
895    int effectMode = effectModeStringToEnum(
896        newParams.get(CameraParameters::KEY_EFFECT) );
897    if (effectMode != mParameters.effectMode) {
898        camera_metadata_entry_t availableEffectModes =
899            staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
900        for (i = 0; i < availableEffectModes.count; i++) {
901            if (effectMode == availableEffectModes.data.u8[i]) break;
902        }
903        if (i == availableEffectModes.count) {
904            ALOGE("%s: Requested effect mode \"%s\" is not supported",
905                    __FUNCTION__,
906                    newParams.get(CameraParameters::KEY_EFFECT) );
907            return BAD_VALUE;
908        }
909    }
910
911    // ANTIBANDING
912    int antibandingMode = abModeStringToEnum(
913        newParams.get(CameraParameters::KEY_ANTIBANDING) );
914    if (antibandingMode != mParameters.antibandingMode) {
915        camera_metadata_entry_t availableAbModes =
916            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
917        for (i = 0; i < availableAbModes.count; i++) {
918            if (antibandingMode == availableAbModes.data.u8[i]) break;
919        }
920        if (i == availableAbModes.count) {
921            ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
922                    __FUNCTION__,
923                    newParams.get(CameraParameters::KEY_ANTIBANDING));
924            return BAD_VALUE;
925        }
926    }
927
928    // SCENE_MODE
929    int sceneMode = sceneModeStringToEnum(
930        newParams.get(CameraParameters::KEY_SCENE_MODE) );
931    if (sceneMode != mParameters.sceneMode) {
932        camera_metadata_entry_t availableSceneModes =
933            staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
934        for (i = 0; i < availableSceneModes.count; i++) {
935            if (sceneMode == availableSceneModes.data.u8[i]) break;
936        }
937        if (i == availableSceneModes.count) {
938            ALOGE("%s: Requested scene mode \"%s\" is not supported",
939                    __FUNCTION__,
940                    newParams.get(CameraParameters::KEY_SCENE_MODE));
941            return BAD_VALUE;
942        }
943    }
944
945    // FLASH_MODE
946    Parameters::flashMode_t flashMode = flashModeStringToEnum(
947        newParams.get(CameraParameters::KEY_FLASH_MODE) );
948    if (flashMode != mParameters.flashMode) {
949        camera_metadata_entry_t flashAvailable =
950            staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
951        if (!flashAvailable.data.u8[0] &&
952                flashMode != Parameters::FLASH_MODE_OFF) {
953            ALOGE("%s: Requested flash mode \"%s\" is not supported: "
954                    "No flash on device", __FUNCTION__,
955                    newParams.get(CameraParameters::KEY_FLASH_MODE));
956            return BAD_VALUE;
957        } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) {
958            camera_metadata_entry_t availableAeModes =
959                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
960            for (i = 0; i < availableAeModes.count; i++) {
961                if (flashMode == availableAeModes.data.u8[i]) break;
962            }
963            if (i == availableAeModes.count) {
964                ALOGE("%s: Requested flash mode \"%s\" is not supported",
965                        __FUNCTION__,
966                        newParams.get(CameraParameters::KEY_FLASH_MODE));
967                return BAD_VALUE;
968            }
969        } else if (flashMode == -1) {
970            ALOGE("%s: Requested flash mode \"%s\" is unknown",
971                    __FUNCTION__,
972                    newParams.get(CameraParameters::KEY_FLASH_MODE));
973            return BAD_VALUE;
974        }
975    }
976
977    // FOCUS_MODE
978    Parameters::focusMode_t focusMode = focusModeStringToEnum(
979        newParams.get(CameraParameters::KEY_FOCUS_MODE));
980    if (focusMode != mParameters.focusMode) {
981        if (focusMode != Parameters::FOCUS_MODE_FIXED) {
982            camera_metadata_entry_t minFocusDistance =
983                staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE);
984            if (minFocusDistance.data.f[0] == 0) {
985                ALOGE("%s: Requested focus mode \"%s\" is not available: "
986                        "fixed focus lens",
987                        __FUNCTION__,
988                        newParams.get(CameraParameters::KEY_FOCUS_MODE));
989                return BAD_VALUE;
990            } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) {
991                camera_metadata_entry_t availableFocusModes =
992                    staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
993                for (i = 0; i < availableFocusModes.count; i++) {
994                    if (focusMode == availableFocusModes.data.u8[i]) break;
995                }
996                if (i == availableFocusModes.count) {
997                    ALOGE("%s: Requested focus mode \"%s\" is not supported",
998                            __FUNCTION__,
999                            newParams.get(CameraParameters::KEY_FOCUS_MODE));
1000                    return BAD_VALUE;
1001                }
1002            }
1003        }
1004    }
1005
1006    // FOCUS_AREAS
1007    Vector<Parameters::Area> focusingAreas;
1008    res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
1009            &focusingAreas);
1010    size_t max3aRegions =
1011        (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0];
1012    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
1013    if (res != OK) {
1014        ALOGE("%s: Requested focus areas are malformed: %s",
1015                __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
1016        return BAD_VALUE;
1017    }
1018
1019    // EXPOSURE_COMPENSATION
1020    int exposureCompensation =
1021        newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
1022    camera_metadata_entry_t exposureCompensationRange =
1023        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE);
1024    if (exposureCompensation < exposureCompensationRange.data.i32[0] ||
1025            exposureCompensation > exposureCompensationRange.data.i32[1]) {
1026        ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
1027                __FUNCTION__, exposureCompensation);
1028        return BAD_VALUE;
1029    }
1030
1031    // AUTO_EXPOSURE_LOCK (always supported)
1032    bool autoExposureLock = boolFromString(
1033        newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
1034
1035    // AUTO_WHITEBALANCE_LOCK (always supported)
1036    bool autoWhiteBalanceLock = boolFromString(
1037        newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
1038
1039    // METERING_AREAS
1040    Vector<Parameters::Area> meteringAreas;
1041    res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
1042            &meteringAreas);
1043    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
1044    if (res != OK) {
1045        ALOGE("%s: Requested metering areas are malformed: %s",
1046                __FUNCTION__,
1047                newParams.get(CameraParameters::KEY_METERING_AREAS));
1048        return BAD_VALUE;
1049    }
1050
1051    // ZOOM
1052    int zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
1053    if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) {
1054        ALOGE("%s: Requested zoom level %d is not supported",
1055                __FUNCTION__, zoom);
1056        return BAD_VALUE;
1057    }
1058
1059    // VIDEO_SIZE
1060    int videoWidth, videoHeight;
1061    newParams.getVideoSize(&videoWidth, &videoHeight);
1062    if (videoWidth != mParameters.videoWidth ||
1063            videoHeight != mParameters.videoHeight) {
1064        if (mState == RECORD) {
1065            ALOGE("%s: Video size cannot be updated when recording is active!",
1066                    __FUNCTION__);
1067            return BAD_VALUE;
1068        }
1069        camera_metadata_entry_t availableVideoSizes =
1070            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
1071        for (i = 0; i < availableVideoSizes.count; i += 2 ) {
1072            if (availableVideoSizes.data.i32[i] == videoWidth &&
1073                    availableVideoSizes.data.i32[i+1] == videoHeight)  break;
1074        }
1075        if (i == availableVideoSizes.count) {
1076            ALOGE("%s: Requested video size %d x %d is not supported",
1077                    __FUNCTION__, videoWidth, videoHeight);
1078            return BAD_VALUE;
1079        }
1080    }
1081
1082    // RECORDING_HINT (always supported)
1083    bool recordingHint = boolFromString(
1084        newParams.get(CameraParameters::KEY_RECORDING_HINT) );
1085
1086    // VIDEO_STABILIZATION
1087    bool videoStabilization = boolFromString(
1088        newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
1089    camera_metadata_entry_t availableVideoStabilizationModes =
1090        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
1091    if (videoStabilization && availableVideoStabilizationModes.count == 1) {
1092        ALOGE("%s: Video stabilization not supported", __FUNCTION__);
1093    }
1094
1095    /** Update internal parameters */
1096    mParameters.previewWidth = previewWidth;
1097    mParameters.previewHeight = previewHeight;
1098    mParameters.previewFpsRangeMin = previewFpsRangeMin;
1099    mParameters.previewFpsRangeMax = previewFpsRangeMax;
1100    mParameters.previewFps = previewFps;
1101    mParameters.previewFormat = previewFormat;
1102
1103    mParameters.pictureWidth = pictureWidth;
1104    mParameters.pictureHeight = pictureHeight;
1105
1106    mParameters.jpegThumbWidth = jpegThumbWidth;
1107    mParameters.jpegThumbHeight = jpegThumbHeight;
1108    mParameters.jpegQuality = jpegQuality;
1109    mParameters.jpegThumbQuality = jpegThumbQuality;
1110
1111    mParameters.gpsEnabled = gpsEnabled;
1112    mParameters.gpsLatitude = gpsLatitude;
1113    mParameters.gpsLongitude = gpsLongitude;
1114    mParameters.gpsAltitude = gpsAltitude;
1115    mParameters.gpsTimestamp = gpsTimestamp;
1116    mParameters.gpsProcessingMethod = gpsProcessingMethod;
1117
1118    mParameters.wbMode = wbMode;
1119    mParameters.effectMode = effectMode;
1120    mParameters.antibandingMode = antibandingMode;
1121    mParameters.sceneMode = sceneMode;
1122
1123    mParameters.flashMode = flashMode;
1124    mParameters.focusMode = focusMode;
1125
1126    mParameters.focusingAreas = focusingAreas;
1127    mParameters.exposureCompensation = exposureCompensation;
1128    mParameters.autoExposureLock = autoExposureLock;
1129    mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock;
1130    mParameters.meteringAreas = meteringAreas;
1131    mParameters.zoom = zoom;
1132
1133    mParameters.videoWidth = videoWidth;
1134    mParameters.videoHeight = videoHeight;
1135
1136    mParameters.recordingHint = recordingHint;
1137    mParameters.videoStabilization = videoStabilization;
1138
1139    updatePreviewRequest();
1140    updateCaptureRequest();
1141
1142    return OK;
1143}
1144
1145String8 Camera2Client::getParameters() const {
1146    ATRACE_CALL();
1147    Mutex::Autolock icl(mICameraLock);
1148
1149    Mutex::Autolock pl(mParamsLock);
1150
1151    // TODO: Deal with focus distances
1152    return mParamsFlattened;
1153}
1154
1155status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1156    ATRACE_CALL();
1157    Mutex::Autolock icl(mICameraLock);
1158    return OK;
1159}
1160
1161/** Device-related methods */
1162
1163void Camera2Client::onCaptureAvailable() {
1164    ATRACE_CALL();
1165    status_t res;
1166    sp<ICameraClient> currentClient;
1167    CpuConsumer::LockedBuffer imgBuffer;
1168    {
1169        Mutex::Autolock icl(mICameraLock);
1170
1171        // TODO: Signal errors here upstream
1172        if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) {
1173            ALOGE("%s: Camera %d: Still image produced unexpectedly!",
1174                    __FUNCTION__, mCameraId);
1175            return;
1176        }
1177
1178        res = mCaptureConsumer->lockNextBuffer(&imgBuffer);
1179        if (res != OK) {
1180            ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)",
1181                    __FUNCTION__, mCameraId, strerror(-res), res);
1182            return;
1183        }
1184
1185        if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) {
1186            ALOGE("%s: Camera %d: Unexpected format for still image: "
1187                    "%x, expected %x", __FUNCTION__, mCameraId,
1188                    imgBuffer.format,
1189                    HAL_PIXEL_FORMAT_BLOB);
1190            mCaptureConsumer->unlockBuffer(imgBuffer);
1191            return;
1192        }
1193
1194        // TODO: Optimize this to avoid memcopy
1195        void* captureMemory = mCaptureHeap->getBase();
1196        size_t size = mCaptureHeap->getSize();
1197        memcpy(captureMemory, imgBuffer.data, size);
1198
1199        mCaptureConsumer->unlockBuffer(imgBuffer);
1200
1201        currentClient = mCameraClient;
1202        switch (mState) {
1203            case STILL_CAPTURE:
1204                mState = STOPPED;
1205                break;
1206            case VIDEO_SNAPSHOT:
1207                mState = RECORD;
1208                break;
1209            default:
1210                ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__,
1211                        mCameraId, mState);
1212                break;
1213        }
1214    }
1215    // Call outside mICameraLock to allow re-entrancy from notification
1216    if (currentClient != 0) {
1217        currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
1218                mCaptureMemory, NULL);
1219    }
1220}
1221
1222camera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag,
1223        size_t minCount, size_t maxCount) {
1224    status_t res;
1225    camera_metadata_entry_t entry;
1226    res = find_camera_metadata_entry(mDevice->info(),
1227            tag,
1228            &entry);
1229    if (CC_UNLIKELY( res != OK )) {
1230        const char* tagSection = get_camera_metadata_section_name(tag);
1231        if (tagSection == NULL) tagSection = "<unknown>";
1232        const char* tagName = get_camera_metadata_tag_name(tag);
1233        if (tagName == NULL) tagName = "<unknown>";
1234
1235        ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)",
1236                tagSection, tagName, tag, strerror(-res), res);
1237        entry.count = 0;
1238        entry.data.u8 = NULL;
1239    } else if (CC_UNLIKELY(
1240            (minCount != 0 && entry.count < minCount) ||
1241            (maxCount != 0 && entry.count > maxCount) ) ) {
1242        const char* tagSection = get_camera_metadata_section_name(tag);
1243        if (tagSection == NULL) tagSection = "<unknown>";
1244        const char* tagName = get_camera_metadata_tag_name(tag);
1245        if (tagName == NULL) tagName = "<unknown>";
1246        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
1247                "Expected between %d and %d values, but got %d values",
1248                tagSection, tagName, tag, minCount, maxCount, entry.count);
1249        entry.count = 0;
1250        entry.data.u8 = NULL;
1251    }
1252
1253    return entry;
1254}
1255
1256/** Utility methods */
1257
1258
1259status_t Camera2Client::buildDefaultParameters() {
1260    ATRACE_CALL();
1261    Mutex::Autolock pl(mParamsLock);
1262
1263    status_t res;
1264    CameraParameters params;
1265
1266    camera_metadata_entry_t availableProcessedSizes =
1267        staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
1268    if (!availableProcessedSizes.count) return NO_INIT;
1269
1270    // TODO: Pick more intelligently
1271    mParameters.previewWidth = availableProcessedSizes.data.i32[0];
1272    mParameters.previewHeight = availableProcessedSizes.data.i32[1];
1273    mParameters.videoWidth = mParameters.previewWidth;
1274    mParameters.videoHeight = mParameters.previewHeight;
1275
1276    params.setPreviewSize(mParameters.previewWidth, mParameters.previewHeight);
1277    params.setVideoSize(mParameters.videoWidth, mParameters.videoHeight);
1278    params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
1279            String8::format("%dx%d",
1280                    mParameters.previewWidth, mParameters.previewHeight));
1281    {
1282        String8 supportedPreviewSizes;
1283        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
1284            if (i != 0) supportedPreviewSizes += ",";
1285            supportedPreviewSizes += String8::format("%dx%d",
1286                    availableProcessedSizes.data.i32[i],
1287                    availableProcessedSizes.data.i32[i+1]);
1288        }
1289        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
1290                supportedPreviewSizes);
1291        params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
1292                supportedPreviewSizes);
1293    }
1294
1295    camera_metadata_entry_t availableFpsRanges =
1296        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
1297    if (!availableFpsRanges.count) return NO_INIT;
1298
1299    mParameters.previewFpsRangeMin = availableFpsRanges.data.i32[0];
1300    mParameters.previewFpsRangeMax = availableFpsRanges.data.i32[1];
1301
1302    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
1303            String8::format("%d,%d",
1304                    mParameters.previewFpsRangeMin,
1305                    mParameters.previewFpsRangeMax));
1306
1307    {
1308        String8 supportedPreviewFpsRange;
1309        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1310            if (i != 0) supportedPreviewFpsRange += ",";
1311            supportedPreviewFpsRange += String8::format("(%d,%d)",
1312                    availableFpsRanges.data.i32[i],
1313                    availableFpsRanges.data.i32[i+1]);
1314        }
1315        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
1316                supportedPreviewFpsRange);
1317    }
1318
1319    mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1320    params.set(CameraParameters::KEY_PREVIEW_FORMAT,
1321            formatEnumToString(mParameters.previewFormat)); // NV21
1322
1323    camera_metadata_entry_t availableFormats =
1324        staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
1325
1326    {
1327        String8 supportedPreviewFormats;
1328        bool addComma = false;
1329        for (size_t i=0; i < availableFormats.count; i++) {
1330            if (addComma) supportedPreviewFormats += ",";
1331            addComma = true;
1332            switch (availableFormats.data.i32[i]) {
1333            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1334                supportedPreviewFormats +=
1335                    CameraParameters::PIXEL_FORMAT_YUV422SP;
1336                break;
1337            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1338                supportedPreviewFormats +=
1339                    CameraParameters::PIXEL_FORMAT_YUV420SP;
1340                break;
1341            case HAL_PIXEL_FORMAT_YCbCr_422_I:
1342                supportedPreviewFormats +=
1343                    CameraParameters::PIXEL_FORMAT_YUV422I;
1344                break;
1345            case HAL_PIXEL_FORMAT_YV12:
1346                supportedPreviewFormats +=
1347                    CameraParameters::PIXEL_FORMAT_YUV420P;
1348                break;
1349            case HAL_PIXEL_FORMAT_RGB_565:
1350                supportedPreviewFormats +=
1351                    CameraParameters::PIXEL_FORMAT_RGB565;
1352                break;
1353                // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
1354            case HAL_PIXEL_FORMAT_RAW_SENSOR:
1355                addComma = false;
1356                break;
1357            default:
1358                ALOGW("%s: Camera %d: Unknown preview format: %x",
1359                        __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
1360                addComma = false;
1361                break;
1362            }
1363        }
1364        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
1365                supportedPreviewFormats);
1366    }
1367
1368    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
1369    // still have to do something sane for them
1370
1371    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
1372            mParameters.previewFpsRangeMin);
1373
1374    {
1375        String8 supportedPreviewFrameRates;
1376        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1377            if (i != 0) supportedPreviewFrameRates += ",";
1378            supportedPreviewFrameRates += String8::format("%d",
1379                    availableFpsRanges.data.i32[i]);
1380        }
1381        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
1382                supportedPreviewFrameRates);
1383    }
1384
1385    camera_metadata_entry_t availableJpegSizes =
1386        staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
1387    if (!availableJpegSizes.count) return NO_INIT;
1388
1389    // TODO: Pick maximum
1390    mParameters.pictureWidth = availableJpegSizes.data.i32[0];
1391    mParameters.pictureHeight = availableJpegSizes.data.i32[1];
1392
1393    params.setPictureSize(mParameters.pictureWidth,
1394            mParameters.pictureHeight);
1395
1396    {
1397        String8 supportedPictureSizes;
1398        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
1399            if (i != 0) supportedPictureSizes += ",";
1400            supportedPictureSizes += String8::format("%dx%d",
1401                    availableJpegSizes.data.i32[i],
1402                    availableJpegSizes.data.i32[i+1]);
1403        }
1404        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
1405                supportedPictureSizes);
1406    }
1407
1408    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
1409    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
1410            CameraParameters::PIXEL_FORMAT_JPEG);
1411
1412    camera_metadata_entry_t availableJpegThumbnailSizes =
1413        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2);
1414    if (!availableJpegThumbnailSizes.count) return NO_INIT;
1415
1416    // TODO: Pick default thumbnail size sensibly
1417    mParameters.jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0];
1418    mParameters.jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1];
1419
1420    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
1421            mParameters.jpegThumbWidth);
1422    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
1423            mParameters.jpegThumbHeight);
1424
1425    {
1426        String8 supportedJpegThumbSizes;
1427        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
1428            if (i != 0) supportedJpegThumbSizes += ",";
1429            supportedJpegThumbSizes += String8::format("%dx%d",
1430                    availableJpegThumbnailSizes.data.i32[i],
1431                    availableJpegThumbnailSizes.data.i32[i+1]);
1432        }
1433        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
1434                supportedJpegThumbSizes);
1435    }
1436
1437    mParameters.jpegThumbQuality = 90;
1438    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
1439            mParameters.jpegThumbQuality);
1440    mParameters.jpegQuality = 90;
1441    params.set(CameraParameters::KEY_JPEG_QUALITY,
1442            mParameters.jpegQuality);
1443    mParameters.jpegRotation = 0;
1444    params.set(CameraParameters::KEY_ROTATION,
1445            mParameters.jpegRotation);
1446
1447    mParameters.gpsEnabled = false;
1448    mParameters.gpsProcessingMethod = "unknown";
1449    // GPS fields in CameraParameters are not set by implementation
1450
1451    mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO;
1452    params.set(CameraParameters::KEY_WHITE_BALANCE,
1453            CameraParameters::WHITE_BALANCE_AUTO);
1454
1455    camera_metadata_entry_t availableWhiteBalanceModes =
1456        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
1457    {
1458        String8 supportedWhiteBalance;
1459        bool addComma = false;
1460        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
1461            if (addComma) supportedWhiteBalance += ",";
1462            addComma = true;
1463            switch (availableWhiteBalanceModes.data.u8[i]) {
1464            case ANDROID_CONTROL_AWB_AUTO:
1465                supportedWhiteBalance +=
1466                    CameraParameters::WHITE_BALANCE_AUTO;
1467                break;
1468            case ANDROID_CONTROL_AWB_INCANDESCENT:
1469                supportedWhiteBalance +=
1470                    CameraParameters::WHITE_BALANCE_INCANDESCENT;
1471                break;
1472            case ANDROID_CONTROL_AWB_FLUORESCENT:
1473                supportedWhiteBalance +=
1474                    CameraParameters::WHITE_BALANCE_FLUORESCENT;
1475                break;
1476            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
1477                supportedWhiteBalance +=
1478                    CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
1479                break;
1480            case ANDROID_CONTROL_AWB_DAYLIGHT:
1481                supportedWhiteBalance +=
1482                    CameraParameters::WHITE_BALANCE_DAYLIGHT;
1483                break;
1484            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
1485                supportedWhiteBalance +=
1486                    CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
1487                break;
1488            case ANDROID_CONTROL_AWB_TWILIGHT:
1489                supportedWhiteBalance +=
1490                    CameraParameters::WHITE_BALANCE_TWILIGHT;
1491                break;
1492            case ANDROID_CONTROL_AWB_SHADE:
1493                supportedWhiteBalance +=
1494                    CameraParameters::WHITE_BALANCE_SHADE;
1495                break;
1496            // Skipping values not mappable to v1 API
1497            case ANDROID_CONTROL_AWB_OFF:
1498                addComma = false;
1499                break;
1500            default:
1501                ALOGW("%s: Camera %d: Unknown white balance value: %d",
1502                        __FUNCTION__, mCameraId,
1503                        availableWhiteBalanceModes.data.u8[i]);
1504                addComma = false;
1505                break;
1506            }
1507        }
1508        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
1509                supportedWhiteBalance);
1510    }
1511
1512    mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF;
1513    params.set(CameraParameters::KEY_EFFECT,
1514            CameraParameters::EFFECT_NONE);
1515
1516    camera_metadata_entry_t availableEffects =
1517        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
1518    if (!availableEffects.count) return NO_INIT;
1519    {
1520        String8 supportedEffects;
1521        bool addComma = false;
1522        for (size_t i=0; i < availableEffects.count; i++) {
1523            if (addComma) supportedEffects += ",";
1524            addComma = true;
1525            switch (availableEffects.data.u8[i]) {
1526                case ANDROID_CONTROL_EFFECT_OFF:
1527                    supportedEffects +=
1528                        CameraParameters::EFFECT_NONE;
1529                    break;
1530                case ANDROID_CONTROL_EFFECT_MONO:
1531                    supportedEffects +=
1532                        CameraParameters::EFFECT_MONO;
1533                    break;
1534                case ANDROID_CONTROL_EFFECT_NEGATIVE:
1535                    supportedEffects +=
1536                        CameraParameters::EFFECT_NEGATIVE;
1537                    break;
1538                case ANDROID_CONTROL_EFFECT_SOLARIZE:
1539                    supportedEffects +=
1540                        CameraParameters::EFFECT_SOLARIZE;
1541                    break;
1542                case ANDROID_CONTROL_EFFECT_SEPIA:
1543                    supportedEffects +=
1544                        CameraParameters::EFFECT_SEPIA;
1545                    break;
1546                case ANDROID_CONTROL_EFFECT_POSTERIZE:
1547                    supportedEffects +=
1548                        CameraParameters::EFFECT_POSTERIZE;
1549                    break;
1550                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
1551                    supportedEffects +=
1552                        CameraParameters::EFFECT_WHITEBOARD;
1553                    break;
1554                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
1555                    supportedEffects +=
1556                        CameraParameters::EFFECT_BLACKBOARD;
1557                    break;
1558                case ANDROID_CONTROL_EFFECT_AQUA:
1559                    supportedEffects +=
1560                        CameraParameters::EFFECT_AQUA;
1561                    break;
1562                default:
1563                    ALOGW("%s: Camera %d: Unknown effect value: %d",
1564                        __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
1565                    addComma = false;
1566                    break;
1567            }
1568        }
1569        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
1570    }
1571
1572    mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
1573    params.set(CameraParameters::KEY_ANTIBANDING,
1574            CameraParameters::ANTIBANDING_AUTO);
1575
1576    camera_metadata_entry_t availableAntibandingModes =
1577        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
1578    if (!availableAntibandingModes.count) return NO_INIT;
1579    {
1580        String8 supportedAntibanding;
1581        bool addComma = false;
1582        for (size_t i=0; i < availableAntibandingModes.count; i++) {
1583            if (addComma) supportedAntibanding += ",";
1584            addComma = true;
1585            switch (availableAntibandingModes.data.u8[i]) {
1586                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
1587                    supportedAntibanding +=
1588                        CameraParameters::ANTIBANDING_OFF;
1589                    break;
1590                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
1591                    supportedAntibanding +=
1592                        CameraParameters::ANTIBANDING_50HZ;
1593                    break;
1594                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
1595                    supportedAntibanding +=
1596                        CameraParameters::ANTIBANDING_60HZ;
1597                    break;
1598                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
1599                    supportedAntibanding +=
1600                        CameraParameters::ANTIBANDING_AUTO;
1601                    break;
1602                default:
1603                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
1604                        __FUNCTION__, mCameraId,
1605                            availableAntibandingModes.data.u8[i]);
1606                    addComma = false;
1607                    break;
1608            }
1609        }
1610        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
1611                supportedAntibanding);
1612    }
1613
1614    mParameters.sceneMode = ANDROID_CONTROL_OFF;
1615    params.set(CameraParameters::KEY_SCENE_MODE,
1616            CameraParameters::SCENE_MODE_AUTO);
1617
1618    camera_metadata_entry_t availableSceneModes =
1619        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
1620    if (!availableSceneModes.count) return NO_INIT;
1621    {
1622        String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
1623        bool addComma = true;
1624        bool noSceneModes = false;
1625        for (size_t i=0; i < availableSceneModes.count; i++) {
1626            if (addComma) supportedSceneModes += ",";
1627            addComma = true;
1628            switch (availableSceneModes.data.u8[i]) {
1629                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
1630                    noSceneModes = true;
1631                    break;
1632                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
1633                    // Not in old API
1634                    addComma = false;
1635                    break;
1636                case ANDROID_CONTROL_SCENE_MODE_ACTION:
1637                    supportedSceneModes +=
1638                        CameraParameters::SCENE_MODE_ACTION;
1639                    break;
1640                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
1641                    supportedSceneModes +=
1642                        CameraParameters::SCENE_MODE_PORTRAIT;
1643                    break;
1644                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
1645                    supportedSceneModes +=
1646                        CameraParameters::SCENE_MODE_LANDSCAPE;
1647                    break;
1648                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
1649                    supportedSceneModes +=
1650                        CameraParameters::SCENE_MODE_NIGHT;
1651                    break;
1652                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
1653                    supportedSceneModes +=
1654                        CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
1655                    break;
1656                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
1657                    supportedSceneModes +=
1658                        CameraParameters::SCENE_MODE_THEATRE;
1659                    break;
1660                case ANDROID_CONTROL_SCENE_MODE_BEACH:
1661                    supportedSceneModes +=
1662                        CameraParameters::SCENE_MODE_BEACH;
1663                    break;
1664                case ANDROID_CONTROL_SCENE_MODE_SNOW:
1665                    supportedSceneModes +=
1666                        CameraParameters::SCENE_MODE_SNOW;
1667                    break;
1668                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
1669                    supportedSceneModes +=
1670                        CameraParameters::SCENE_MODE_SUNSET;
1671                    break;
1672                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
1673                    supportedSceneModes +=
1674                        CameraParameters::SCENE_MODE_STEADYPHOTO;
1675                    break;
1676                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
1677                    supportedSceneModes +=
1678                        CameraParameters::SCENE_MODE_FIREWORKS;
1679                    break;
1680                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
1681                    supportedSceneModes +=
1682                        CameraParameters::SCENE_MODE_SPORTS;
1683                    break;
1684                case ANDROID_CONTROL_SCENE_MODE_PARTY:
1685                    supportedSceneModes +=
1686                        CameraParameters::SCENE_MODE_PARTY;
1687                    break;
1688                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
1689                    supportedSceneModes +=
1690                        CameraParameters::SCENE_MODE_CANDLELIGHT;
1691                    break;
1692                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
1693                    supportedSceneModes +=
1694                        CameraParameters::SCENE_MODE_BARCODE;
1695                    break;
1696                default:
1697                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
1698                        __FUNCTION__, mCameraId,
1699                            availableSceneModes.data.u8[i]);
1700                    addComma = false;
1701                    break;
1702            }
1703        }
1704        if (!noSceneModes) {
1705            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
1706                    supportedSceneModes);
1707        }
1708    }
1709
1710    camera_metadata_entry_t flashAvailable =
1711        staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
1712    if (!flashAvailable.count) return NO_INIT;
1713
1714    camera_metadata_entry_t availableAeModes =
1715        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
1716    if (!availableAeModes.count) return NO_INIT;
1717
1718    if (flashAvailable.data.u8[0]) {
1719        mParameters.flashMode = Parameters::FLASH_MODE_AUTO;
1720        params.set(CameraParameters::KEY_FLASH_MODE,
1721                CameraParameters::FLASH_MODE_AUTO);
1722
1723        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
1724        supportedFlashModes = supportedFlashModes +
1725            "," + CameraParameters::FLASH_MODE_AUTO +
1726            "," + CameraParameters::FLASH_MODE_ON +
1727            "," + CameraParameters::FLASH_MODE_TORCH;
1728        for (size_t i=0; i < availableAeModes.count; i++) {
1729            if (availableAeModes.data.u8[i] ==
1730                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
1731                supportedFlashModes = supportedFlashModes + "," +
1732                    CameraParameters::FLASH_MODE_RED_EYE;
1733                break;
1734            }
1735        }
1736        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
1737                supportedFlashModes);
1738    } else {
1739        mParameters.flashMode = Parameters::FLASH_MODE_OFF;
1740        params.set(CameraParameters::KEY_FLASH_MODE,
1741                CameraParameters::FLASH_MODE_OFF);
1742        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
1743                CameraParameters::FLASH_MODE_OFF);
1744    }
1745
1746    camera_metadata_entry_t minFocusDistance =
1747        staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
1748    if (!minFocusDistance.count) return NO_INIT;
1749
1750    camera_metadata_entry_t availableAfModes =
1751        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
1752    if (!availableAfModes.count) return NO_INIT;
1753
1754    if (minFocusDistance.data.f[0] == 0) {
1755        // Fixed-focus lens
1756        mParameters.focusMode = Parameters::FOCUS_MODE_FIXED;
1757        params.set(CameraParameters::KEY_FOCUS_MODE,
1758                CameraParameters::FOCUS_MODE_FIXED);
1759        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
1760                CameraParameters::FOCUS_MODE_FIXED);
1761    } else {
1762        mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
1763        params.set(CameraParameters::KEY_FOCUS_MODE,
1764                CameraParameters::FOCUS_MODE_AUTO);
1765        String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED);
1766        supportedFocusModes = supportedFocusModes + "," +
1767            CameraParameters::FOCUS_MODE_INFINITY;
1768        bool addComma = true;
1769
1770        for (size_t i=0; i < availableAfModes.count; i++) {
1771            if (addComma) supportedFocusModes += ",";
1772            addComma = true;
1773            switch (availableAfModes.data.u8[i]) {
1774                case ANDROID_CONTROL_AF_AUTO:
1775                    supportedFocusModes +=
1776                        CameraParameters::FOCUS_MODE_AUTO;
1777                    break;
1778                case ANDROID_CONTROL_AF_MACRO:
1779                    supportedFocusModes +=
1780                        CameraParameters::FOCUS_MODE_MACRO;
1781                    break;
1782                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
1783                    supportedFocusModes +=
1784                        CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
1785                    break;
1786                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
1787                    supportedFocusModes +=
1788                        CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
1789                    break;
1790                case ANDROID_CONTROL_AF_EDOF:
1791                    supportedFocusModes +=
1792                        CameraParameters::FOCUS_MODE_EDOF;
1793                    break;
1794                // Not supported in old API
1795                case ANDROID_CONTROL_AF_OFF:
1796                    addComma = false;
1797                    break;
1798                default:
1799                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
1800                        __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
1801                    addComma = false;
1802                    break;
1803            }
1804        }
1805        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
1806                supportedFocusModes);
1807    }
1808
1809    camera_metadata_entry_t max3aRegions =
1810        staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
1811    if (!max3aRegions.count) return NO_INIT;
1812
1813    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
1814            max3aRegions.data.i32[0]);
1815    params.set(CameraParameters::KEY_FOCUS_AREAS,
1816            "(0,0,0,0,0)");
1817    mParameters.focusingAreas.clear();
1818    mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0));
1819
1820    camera_metadata_entry_t availableFocalLengths =
1821        staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
1822    if (!availableFocalLengths.count) return NO_INIT;
1823
1824    float minFocalLength = availableFocalLengths.data.f[0];
1825    params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
1826
1827    camera_metadata_entry_t sensorSize =
1828        staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
1829    if (!sensorSize.count) return NO_INIT;
1830
1831    // The fields of view here assume infinity focus, maximum wide angle
1832    float horizFov = 180 / M_PI *
1833            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
1834    float vertFov  = 180 / M_PI *
1835            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
1836    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
1837    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
1838
1839    mParameters.exposureCompensation = 0;
1840    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
1841                mParameters.exposureCompensation);
1842
1843    camera_metadata_entry_t exposureCompensationRange =
1844        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
1845    if (!exposureCompensationRange.count) return NO_INIT;
1846
1847    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
1848            exposureCompensationRange.data.i32[1]);
1849    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
1850            exposureCompensationRange.data.i32[0]);
1851
1852    camera_metadata_entry_t exposureCompensationStep =
1853        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
1854    if (!exposureCompensationStep.count) return NO_INIT;
1855
1856    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
1857            exposureCompensationStep.data.r[0].numerator /
1858            exposureCompensationStep.data.r[0].denominator);
1859
1860    mParameters.autoExposureLock = false;
1861    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
1862            CameraParameters::FALSE);
1863    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
1864            CameraParameters::TRUE);
1865
1866    mParameters.autoWhiteBalanceLock = false;
1867    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
1868            CameraParameters::FALSE);
1869    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
1870            CameraParameters::TRUE);
1871
1872    mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
1873    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
1874            max3aRegions.data.i32[0]);
1875    params.set(CameraParameters::KEY_METERING_AREAS,
1876            "(0,0,0,0,0)");
1877
1878    mParameters.zoom = 0;
1879    params.set(CameraParameters::KEY_ZOOM, mParameters.zoom);
1880    params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
1881
1882    camera_metadata_entry_t maxDigitalZoom =
1883        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
1884    if (!maxDigitalZoom.count) return NO_INIT;
1885
1886    {
1887        String8 zoomRatios;
1888        float zoom = 1.f;
1889        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
1890                (NUM_ZOOM_STEPS-1);
1891        bool addComma = false;
1892        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
1893            if (addComma) zoomRatios += ",";
1894            addComma = true;
1895            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
1896            zoom += zoomIncrement;
1897        }
1898        params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
1899    }
1900
1901    params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
1902            CameraParameters::TRUE);
1903    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
1904            CameraParameters::TRUE);
1905
1906    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
1907            "Infinity,Infinity,Infinity");
1908
1909    camera_metadata_entry_t maxFacesDetected =
1910        staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
1911    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
1912            maxFacesDetected.data.i32[0]);
1913    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
1914            0);
1915
1916    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
1917            formatEnumToString(HAL_PIXEL_FORMAT_YCrCb_420_SP));
1918
1919    params.set(CameraParameters::KEY_RECORDING_HINT,
1920            CameraParameters::FALSE);
1921
1922    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
1923            CameraParameters::TRUE);
1924
1925    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
1926            CameraParameters::FALSE);
1927
1928    camera_metadata_entry_t availableVideoStabilizationModes =
1929        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
1930    if (!availableVideoStabilizationModes.count) return NO_INIT;
1931
1932    if (availableVideoStabilizationModes.count > 1) {
1933        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
1934                CameraParameters::TRUE);
1935    } else {
1936        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
1937                CameraParameters::FALSE);
1938    }
1939
1940    mParamsFlattened = params.flatten();
1941
1942    return OK;
1943}
1944
1945status_t Camera2Client::updatePreviewRequest() {
1946    ATRACE_CALL();
1947    status_t res;
1948    if (mPreviewRequest == NULL) {
1949        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
1950                &mPreviewRequest);
1951        if (res != OK) {
1952            ALOGE("%s: Camera %d: Unable to create default preview request: "
1953                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1954            return res;
1955        }
1956    }
1957    // TODO: Adjust for params changes
1958    return OK;
1959}
1960
1961status_t Camera2Client::updateCaptureStream() {
1962    status_t res;
1963    // Find out buffer size for JPEG
1964    camera_metadata_entry_t maxJpegSize =
1965            staticInfo(ANDROID_JPEG_MAX_SIZE);
1966    if (maxJpegSize.count == 0) {
1967        ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!",
1968                __FUNCTION__, mCameraId);
1969        return INVALID_OPERATION;
1970    }
1971
1972    if (mCaptureConsumer == 0) {
1973        // Create CPU buffer queue endpoint
1974        mCaptureConsumer = new CpuConsumer(1);
1975        mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this));
1976        mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer"));
1977        mCaptureWindow = new SurfaceTextureClient(
1978            mCaptureConsumer->getProducerInterface());
1979        // Create memory for API consumption
1980        mCaptureHeap = new MemoryHeapBase(maxJpegSize.data.i32[0], 0,
1981                "Camera2Client::CaptureHeap");
1982        if (mCaptureHeap->getSize() == 0) {
1983            ALOGE("%s: Camera %d: Unable to allocate memory for capture",
1984                    __FUNCTION__, mCameraId);
1985            return NO_MEMORY;
1986        }
1987        mCaptureMemory = new MemoryBase(mCaptureHeap,
1988                0, maxJpegSize.data.i32[0]);
1989    }
1990    if (mCaptureStreamId == NO_STREAM) {
1991        // Create stream for HAL production
1992        res = mDevice->createStream(mCaptureWindow,
1993                mParameters.pictureWidth, mParameters.pictureHeight,
1994                HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0],
1995                &mCaptureStreamId);
1996        if (res != OK) {
1997            ALOGE("%s: Camera %d: Can't create output stream for capture: "
1998                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1999            return res;
2000        }
2001
2002    } else {
2003        // Check if stream parameters have to change
2004        uint32_t currentWidth, currentHeight;
2005        res = mDevice->getStreamInfo(mCaptureStreamId,
2006                &currentWidth, &currentHeight, 0);
2007        if (res != OK) {
2008            ALOGE("%s: Camera %d: Error querying capture output stream info: "
2009                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2010            return res;
2011        }
2012        if (currentWidth != (uint32_t)mParameters.pictureWidth ||
2013                currentHeight != (uint32_t)mParameters.pictureHeight) {
2014            res = mDevice->deleteStream(mCaptureStreamId);
2015            if (res != OK) {
2016                ALOGE("%s: Camera %d: Unable to delete old output stream "
2017                        "for capture: %s (%d)", __FUNCTION__, mCameraId,
2018                        strerror(-res), res);
2019                return res;
2020            }
2021            mCaptureStreamId = NO_STREAM;
2022            return updateCaptureStream();
2023        }
2024    }
2025    return OK;
2026}
2027status_t Camera2Client::updateCaptureRequest() {
2028    ATRACE_CALL();
2029    status_t res;
2030    if (mCaptureRequest == NULL) {
2031        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE,
2032                &mCaptureRequest);
2033        if (res != OK) {
2034            ALOGE("%s: Camera %d: Unable to create default still image request:"
2035                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2036            return res;
2037        }
2038    }
2039    // TODO: Adjust for params changes
2040    return OK;
2041}
2042
2043int Camera2Client::formatStringToEnum(const char *format) {
2044    return
2045        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ?
2046            HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
2047        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ?
2048            HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
2049        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ?
2050            HAL_PIXEL_FORMAT_YCbCr_422_I :  // YUY2
2051        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ?
2052            HAL_PIXEL_FORMAT_YV12 :         // YV12
2053        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ?
2054            HAL_PIXEL_FORMAT_RGB_565 :      // RGB565
2055        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ?
2056            HAL_PIXEL_FORMAT_RGBA_8888 :    // RGB8888
2057        !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ?
2058            HAL_PIXEL_FORMAT_RAW_SENSOR :   // Raw sensor data
2059        -1;
2060}
2061
2062const char* Camera2Client::formatEnumToString(int format) {
2063    const char *fmt;
2064    switch(format) {
2065        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
2066            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
2067            break;
2068        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
2069            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
2070            break;
2071        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
2072            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
2073            break;
2074        case HAL_PIXEL_FORMAT_YV12:        // YV12
2075            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
2076            break;
2077        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
2078            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
2079            break;
2080        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
2081            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
2082            break;
2083        case HAL_PIXEL_FORMAT_RAW_SENSOR:
2084            ALOGW("Raw sensor preview format requested.");
2085            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
2086            break;
2087        default:
2088            ALOGE("%s: Unknown preview format: %x",
2089                    __FUNCTION__,  format);
2090            fmt = NULL;
2091            break;
2092    }
2093    return fmt;
2094}
2095
2096int Camera2Client::wbModeStringToEnum(const char *wbMode) {
2097    return
2098        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
2099            ANDROID_CONTROL_AWB_AUTO :
2100        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
2101            ANDROID_CONTROL_AWB_INCANDESCENT :
2102        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
2103            ANDROID_CONTROL_AWB_FLUORESCENT :
2104        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
2105            ANDROID_CONTROL_AWB_WARM_FLUORESCENT :
2106        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
2107            ANDROID_CONTROL_AWB_DAYLIGHT :
2108        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
2109            ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT :
2110        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
2111            ANDROID_CONTROL_AWB_TWILIGHT :
2112        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
2113            ANDROID_CONTROL_AWB_SHADE :
2114        -1;
2115}
2116
2117int Camera2Client::effectModeStringToEnum(const char *effectMode) {
2118    return
2119        !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
2120            ANDROID_CONTROL_EFFECT_OFF :
2121        !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
2122            ANDROID_CONTROL_EFFECT_MONO :
2123        !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
2124            ANDROID_CONTROL_EFFECT_NEGATIVE :
2125        !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
2126            ANDROID_CONTROL_EFFECT_SOLARIZE :
2127        !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
2128            ANDROID_CONTROL_EFFECT_SEPIA :
2129        !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
2130            ANDROID_CONTROL_EFFECT_POSTERIZE :
2131        !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
2132            ANDROID_CONTROL_EFFECT_WHITEBOARD :
2133        !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
2134            ANDROID_CONTROL_EFFECT_BLACKBOARD :
2135        !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
2136            ANDROID_CONTROL_EFFECT_AQUA :
2137        -1;
2138}
2139
2140int Camera2Client::abModeStringToEnum(const char *abMode) {
2141    return
2142        !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
2143            ANDROID_CONTROL_AE_ANTIBANDING_AUTO :
2144        !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
2145            ANDROID_CONTROL_AE_ANTIBANDING_OFF :
2146        !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
2147            ANDROID_CONTROL_AE_ANTIBANDING_50HZ :
2148        !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
2149            ANDROID_CONTROL_AE_ANTIBANDING_60HZ :
2150        -1;
2151}
2152
2153int Camera2Client::sceneModeStringToEnum(const char *sceneMode) {
2154    return
2155        !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
2156            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
2157        !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
2158            ANDROID_CONTROL_SCENE_MODE_ACTION :
2159        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
2160            ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
2161        !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
2162            ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
2163        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
2164            ANDROID_CONTROL_SCENE_MODE_NIGHT :
2165        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
2166            ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
2167        !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
2168            ANDROID_CONTROL_SCENE_MODE_THEATRE :
2169        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
2170            ANDROID_CONTROL_SCENE_MODE_BEACH :
2171        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
2172            ANDROID_CONTROL_SCENE_MODE_SNOW :
2173        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
2174            ANDROID_CONTROL_SCENE_MODE_SUNSET :
2175        !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
2176            ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
2177        !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
2178            ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
2179        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
2180            ANDROID_CONTROL_SCENE_MODE_SPORTS :
2181        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
2182            ANDROID_CONTROL_SCENE_MODE_PARTY :
2183        !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
2184            ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
2185        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
2186            ANDROID_CONTROL_SCENE_MODE_BARCODE:
2187        -1;
2188}
2189
2190Camera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum(
2191        const char *flashMode) {
2192    return
2193        !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
2194            Parameters::FLASH_MODE_OFF :
2195        !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
2196            Parameters::FLASH_MODE_AUTO :
2197        !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
2198            Parameters::FLASH_MODE_ON :
2199        !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
2200            Parameters::FLASH_MODE_RED_EYE :
2201        !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
2202            Parameters::FLASH_MODE_TORCH :
2203        Parameters::FLASH_MODE_INVALID;
2204}
2205
2206Camera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum(
2207        const char *focusMode) {
2208    return
2209        !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
2210            Parameters::FOCUS_MODE_AUTO :
2211        !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
2212            Parameters::FOCUS_MODE_INFINITY :
2213        !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
2214            Parameters::FOCUS_MODE_MACRO :
2215        !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
2216            Parameters::FOCUS_MODE_FIXED :
2217        !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
2218            Parameters::FOCUS_MODE_EDOF :
2219        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
2220            Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
2221        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
2222            Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
2223        Parameters::FOCUS_MODE_INVALID;
2224}
2225
2226status_t Camera2Client::parseAreas(const char *areasCStr,
2227        Vector<Parameters::Area> *areas) {
2228    static const size_t NUM_FIELDS = 5;
2229    areas->clear();
2230    if (areasCStr == NULL) {
2231        // If no key exists, use default (0,0,0,0,0)
2232        areas->push();
2233        return OK;
2234    }
2235    String8 areasStr(areasCStr);
2236    ssize_t areaStart = areasStr.find("(", 0) + 1;
2237    while (areaStart != 0) {
2238        const char* area = areasStr.string() + areaStart;
2239        char *numEnd;
2240        int vals[NUM_FIELDS];
2241        for (size_t i = 0; i < NUM_FIELDS; i++) {
2242            errno = 0;
2243            vals[i] = strtol(area, &numEnd, 10);
2244            if (errno || numEnd == area) return BAD_VALUE;
2245            area = numEnd + 1;
2246        }
2247        areas->push(Parameters::Area(
2248            vals[0], vals[1], vals[2], vals[3], vals[4]) );
2249        areaStart = areasStr.find("(", areaStart) + 1;
2250    }
2251    return OK;
2252}
2253
2254status_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas,
2255                                      size_t maxRegions) {
2256    // Definition of valid area can be found in
2257    // include/camera/CameraParameters.h
2258    if (areas.size() == 0) return BAD_VALUE;
2259    if (areas.size() == 1) {
2260        if (areas[0].left == 0 &&
2261                areas[0].top == 0 &&
2262                areas[0].right == 0 &&
2263                areas[0].bottom == 0 &&
2264                areas[0].weight == 0) {
2265            // Single (0,0,0,0,0) entry is always valid (== driver decides)
2266            return OK;
2267        }
2268    }
2269    if (areas.size() > maxRegions) {
2270        ALOGE("%s: Too many areas requested: %d",
2271                __FUNCTION__, areas.size());
2272        return BAD_VALUE;
2273    }
2274
2275    for (Vector<Parameters::Area>::const_iterator a = areas.begin();
2276         a != areas.end(); a++) {
2277        if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
2278        if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
2279        if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
2280        if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
2281        if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
2282        if (a->left >= a->right) return BAD_VALUE;
2283        if (a->top >= a->bottom) return BAD_VALUE;
2284    }
2285    return OK;
2286}
2287
2288bool Camera2Client::boolFromString(const char *boolStr) {
2289    return !boolStr ? false :
2290        !strcmp(boolStr, CameraParameters::TRUE) ? true :
2291        false;
2292}
2293
2294
2295} // namespace android
2296