Camera2Client.cpp revision 174181eec57c963a2a17bd156d81c3f18b3ba75c
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#include <media/hardware/MetadataBufferType.h>
28
29#include <math.h>
30
31#include "Camera2Client.h"
32
33namespace android {
34
35#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
36#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
37
38static int getCallingPid() {
39    return IPCThreadState::self()->getCallingPid();
40}
41
42static int getCallingUid() {
43    return IPCThreadState::self()->getCallingUid();
44}
45
46// Interface used by CameraService
47
48Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
49        const sp<ICameraClient>& cameraClient,
50        int cameraId,
51        int cameraFacing,
52        int clientPid):
53        Client(cameraService, cameraClient,
54                cameraId, cameraFacing, clientPid),
55        mState(DISCONNECTED),
56        mPreviewStreamId(NO_STREAM),
57        mPreviewRequest(NULL),
58        mCaptureStreamId(NO_STREAM),
59        mCaptureRequest(NULL),
60        mRecordingStreamId(NO_STREAM),
61        mRecordingRequest(NULL),
62        mRecordingHeapCount(kDefaultRecordingHeapCount)
63{
64    ATRACE_CALL();
65
66    mDevice = new Camera2Device(cameraId);
67}
68
69status_t Camera2Client::checkPid(const char* checkLocation) const {
70    int callingPid = getCallingPid();
71    if (callingPid == mClientPid) return NO_ERROR;
72
73    ALOGE("%s: attempt to use a locked camera from a different process"
74            " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
75    return PERMISSION_DENIED;
76}
77
78status_t Camera2Client::initialize(camera_module_t *module)
79{
80    ATRACE_CALL();
81    ALOGV("%s: E", __FUNCTION__);
82    status_t res;
83
84    res = mDevice->initialize(module);
85    if (res != OK) {
86        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
87                __FUNCTION__, mCameraId, strerror(-res), res);
88        return NO_INIT;
89    }
90
91    res = mDevice->setNotifyCallback(this);
92
93    res = buildDefaultParameters();
94    if (res != OK) {
95        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
96                __FUNCTION__, mCameraId, strerror(-res), res);
97        return NO_INIT;
98    }
99
100    if (gLogLevel >= 1) {
101        LockedParameters::Key k(mParameters);
102        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
103              mCameraId);
104        ALOGD("%s", k.mParameters.paramsFlattened.string());
105    }
106
107    mState = STOPPED;
108
109    return OK;
110}
111
112Camera2Client::~Camera2Client() {
113    ATRACE_CALL();
114    ALOGV("%s: Camera %d: Shutting down", __FUNCTION__, mCameraId);
115
116    mDestructionStarted = true;
117
118    // Rewrite mClientPid to allow shutdown by CameraService
119    mClientPid = getCallingPid();
120    disconnect();
121}
122
123status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
124    String8 result;
125    result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
126            mCameraId,
127            getCameraClient()->asBinder().get(),
128            mClientPid);
129    result.append("  State: ");
130#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
131
132    const Parameters& p = mParameters.unsafeUnlock();
133
134    result.append(getStateName(mState));
135
136    result.append("\n  Current parameters:\n");
137    result.appendFormat("    Preview size: %d x %d\n",
138            p.previewWidth, p.previewHeight);
139    result.appendFormat("    Preview FPS range: %d - %d\n",
140            p.previewFpsRange[0], p.previewFpsRange[1]);
141    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
142            p.previewFormat);
143    result.appendFormat("    Preview transform: %x\n",
144            p.previewTransform);
145    result.appendFormat("    Picture size: %d x %d\n",
146            p.pictureWidth, p.pictureHeight);
147    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
148            p.jpegThumbSize[0], p.jpegThumbSize[1]);
149    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
150            p.jpegQuality, p.jpegThumbQuality);
151    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
152    result.appendFormat("    GPS tags %s\n",
153            p.gpsEnabled ? "enabled" : "disabled");
154    if (p.gpsEnabled) {
155        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
156                p.gpsCoordinates[0], p.gpsCoordinates[1],
157                p.gpsCoordinates[2]);
158        result.appendFormat("    GPS timestamp: %lld\n",
159                p.gpsTimestamp);
160        result.appendFormat("    GPS processing method: %s\n",
161                p.gpsProcessingMethod.string());
162    }
163
164    result.append("    White balance mode: ");
165    switch (p.wbMode) {
166        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
167        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
168        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
169        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
170        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
171        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
172        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
173        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
174        default: result.append("UNKNOWN\n");
175    }
176
177    result.append("    Effect mode: ");
178    switch (p.effectMode) {
179        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
180        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
181        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
182        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
183        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
184        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
185        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
186        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
187        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
188        default: result.append("UNKNOWN\n");
189    }
190
191    result.append("    Antibanding mode: ");
192    switch (p.antibandingMode) {
193        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
194        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
195        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
196        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
197        default: result.append("UNKNOWN\n");
198    }
199
200    result.append("    Scene mode: ");
201    switch (p.sceneMode) {
202        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
203            result.append("AUTO\n"); break;
204        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
205        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
206        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
207        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
208        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
209        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
210        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
211        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
212        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
213        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
214        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
215        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
216        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
217        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
218        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
219        default: result.append("UNKNOWN\n");
220    }
221
222    result.append("    Flash mode: ");
223    switch (p.flashMode) {
224        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
225        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
226        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
227        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
228        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
229        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
230        default: result.append("UNKNOWN\n");
231    }
232
233    result.append("    Focus mode: ");
234    switch (p.focusMode) {
235        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
236        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
237        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
238        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
239        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
240        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
241        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
242        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
243        default: result.append("UNKNOWN\n");
244    }
245
246    result.append("    Focusing areas:\n");
247    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
248        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
249                p.focusingAreas[i].left,
250                p.focusingAreas[i].top,
251                p.focusingAreas[i].right,
252                p.focusingAreas[i].bottom,
253                p.focusingAreas[i].weight);
254    }
255
256    result.appendFormat("    Exposure compensation index: %d\n",
257            p.exposureCompensation);
258
259    result.appendFormat("    AE lock %s, AWB lock %s\n",
260            p.autoExposureLock ? "enabled" : "disabled",
261            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
262
263    result.appendFormat("    Metering areas:\n");
264    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
265        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
266                p.meteringAreas[i].left,
267                p.meteringAreas[i].top,
268                p.meteringAreas[i].right,
269                p.meteringAreas[i].bottom,
270                p.meteringAreas[i].weight);
271    }
272
273    result.appendFormat("    Zoom index: %d\n", p.zoom);
274    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
275            p.videoHeight);
276
277    result.appendFormat("    Recording hint is %s\n",
278            p.recordingHint ? "set" : "not set");
279
280    result.appendFormat("    Video stabilization is %s\n",
281            p.videoStabilization ? "enabled" : "disabled");
282
283    result.append("  Current streams:\n");
284    result.appendFormat("    Preview stream ID: %d\n", mPreviewStreamId);
285    result.appendFormat("    Capture stream ID: %d\n", mCaptureStreamId);
286    result.appendFormat("    Recording stream ID: %d\n", mRecordingStreamId);
287
288    result.append("  Current requests:\n");
289    if (mPreviewRequest != NULL) {
290        result.append("    Preview request:\n");
291        write(fd, result.string(), result.size());
292        dump_indented_camera_metadata(mPreviewRequest, fd, 2, 6);
293    } else {
294        result.append("    Preview request: undefined\n");
295        write(fd, result.string(), result.size());
296    }
297
298    if (mCaptureRequest != NULL) {
299        result = "    Capture request:\n";
300        write(fd, result.string(), result.size());
301        dump_indented_camera_metadata(mCaptureRequest, fd, 2, 6);
302    } else {
303        result = "    Capture request: undefined\n";
304        write(fd, result.string(), result.size());
305    }
306
307    if (mRecordingRequest != NULL) {
308        result = "    Recording request:\n";
309        write(fd, result.string(), result.size());
310        dump_indented_camera_metadata(mRecordingRequest, fd, 2, 6);
311    } else {
312        result = "    Recording request: undefined\n";
313        write(fd, result.string(), result.size());
314    }
315
316    result = "  Device dump:\n";
317    write(fd, result.string(), result.size());
318
319    status_t res = mDevice->dump(fd, args);
320    if (res != OK) {
321        result = String8::format("   Error dumping device: %s (%d)",
322                strerror(-res), res);
323        write(fd, result.string(), result.size());
324    }
325
326#undef CASE_APPEND_ENUM
327    return NO_ERROR;
328}
329
330const char* Camera2Client::getStateName(State state) {
331#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
332    switch(state) {
333        CASE_ENUM_TO_CHAR(DISCONNECTED)
334        CASE_ENUM_TO_CHAR(STOPPED)
335        CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
336        CASE_ENUM_TO_CHAR(PREVIEW)
337        CASE_ENUM_TO_CHAR(RECORD)
338        CASE_ENUM_TO_CHAR(STILL_CAPTURE)
339        CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
340        default:
341            return "Unknown state!";
342            break;
343    }
344#undef CASE_ENUM_TO_CHAR
345}
346
347// ICamera interface
348
349void Camera2Client::disconnect() {
350    ATRACE_CALL();
351    ALOGV("%s: E", __FUNCTION__);
352    Mutex::Autolock icl(mICameraLock);
353    status_t res;
354    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
355
356    if (mDevice == 0) return;
357
358    stopPreviewL();
359
360    mDevice->waitUntilDrained();
361
362    if (mPreviewStreamId != NO_STREAM) {
363        mDevice->deleteStream(mPreviewStreamId);
364        mPreviewStreamId = NO_STREAM;
365    }
366
367    if (mCaptureStreamId != NO_STREAM) {
368        mDevice->deleteStream(mCaptureStreamId);
369        mCaptureStreamId = NO_STREAM;
370    }
371
372    if (mRecordingStreamId != NO_STREAM) {
373        mDevice->deleteStream(mRecordingStreamId);
374        mRecordingStreamId = NO_STREAM;
375    }
376
377    mDevice.clear();
378    mState = DISCONNECTED;
379
380    CameraService::Client::disconnect();
381}
382
383status_t Camera2Client::connect(const sp<ICameraClient>& client) {
384    ATRACE_CALL();
385    ALOGV("%s: E", __FUNCTION__);
386    Mutex::Autolock icl(mICameraLock);
387
388    if (mClientPid != 0 && getCallingPid() != mClientPid) {
389        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
390                "current locked to pid %d", __FUNCTION__,
391                mCameraId, getCallingPid(), mClientPid);
392        return BAD_VALUE;
393    }
394
395    mClientPid = getCallingPid();
396    mCameraClient = client;
397
398    return OK;
399}
400
401status_t Camera2Client::lock() {
402    ATRACE_CALL();
403    ALOGV("%s: E", __FUNCTION__);
404    Mutex::Autolock icl(mICameraLock);
405    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
406            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
407
408    if (mClientPid == 0) {
409        mClientPid = getCallingPid();
410        return OK;
411    }
412
413    if (mClientPid != getCallingPid()) {
414        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
415                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
416        return EBUSY;
417    }
418
419    return OK;
420}
421
422status_t Camera2Client::unlock() {
423    ATRACE_CALL();
424    ALOGV("%s: E", __FUNCTION__);
425    Mutex::Autolock icl(mICameraLock);
426    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
427            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
428
429    // TODO: Check for uninterruptable conditions
430
431    if (mClientPid == getCallingPid()) {
432        mClientPid = 0;
433        mCameraClient.clear();
434        return OK;
435    }
436
437    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
438            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
439    return EBUSY;
440}
441
442status_t Camera2Client::setPreviewDisplay(
443        const sp<Surface>& surface) {
444    ATRACE_CALL();
445    ALOGV("%s: E", __FUNCTION__);
446    Mutex::Autolock icl(mICameraLock);
447    status_t res;
448    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
449
450    sp<IBinder> binder;
451    sp<ANativeWindow> window;
452    if (surface != 0) {
453        binder = surface->asBinder();
454        window = surface;
455    }
456
457    return setPreviewWindowL(binder,window);
458}
459
460status_t Camera2Client::setPreviewTexture(
461        const sp<ISurfaceTexture>& surfaceTexture) {
462    ATRACE_CALL();
463    ALOGV("%s: E", __FUNCTION__);
464    Mutex::Autolock icl(mICameraLock);
465    status_t res;
466    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
467
468    sp<IBinder> binder;
469    sp<ANativeWindow> window;
470    if (surfaceTexture != 0) {
471        binder = surfaceTexture->asBinder();
472        window = new SurfaceTextureClient(surfaceTexture);
473    }
474    return setPreviewWindowL(binder, window);
475}
476
477status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
478        sp<ANativeWindow> window) {
479    ATRACE_CALL();
480    status_t res;
481
482    if (binder == mPreviewSurface) {
483        ALOGV("%s: Camera %d: New window is same as old window",
484                __FUNCTION__, mCameraId);
485        return NO_ERROR;
486    }
487
488    switch (mState) {
489        case DISCONNECTED:
490        case RECORD:
491        case STILL_CAPTURE:
492        case VIDEO_SNAPSHOT:
493            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
494                    __FUNCTION__, mCameraId, getStateName(mState));
495            return INVALID_OPERATION;
496        case STOPPED:
497        case WAITING_FOR_PREVIEW_WINDOW:
498            // OK
499            break;
500        case PREVIEW:
501            // Already running preview - need to stop and create a new stream
502            // TODO: Optimize this so that we don't wait for old stream to drain
503            // before spinning up new stream
504            mDevice->setStreamingRequest(NULL);
505            mState = WAITING_FOR_PREVIEW_WINDOW;
506            break;
507    }
508
509    if (mPreviewStreamId != NO_STREAM) {
510        res = mDevice->waitUntilDrained();
511        if (res != OK) {
512            ALOGE("%s: Error waiting for preview to drain: %s (%d)",
513                    __FUNCTION__, strerror(-res), res);
514            return res;
515        }
516        res = mDevice->deleteStream(mPreviewStreamId);
517        if (res != OK) {
518            ALOGE("%s: Unable to delete old preview stream: %s (%d)",
519                    __FUNCTION__, strerror(-res), res);
520            return res;
521        }
522        mPreviewStreamId = NO_STREAM;
523    }
524
525    mPreviewSurface = binder;
526    mPreviewWindow = window;
527
528    if (mState == WAITING_FOR_PREVIEW_WINDOW) {
529        return startPreviewL();
530    }
531
532    return OK;
533}
534
535void Camera2Client::setPreviewCallbackFlag(int flag) {
536    ATRACE_CALL();
537    Mutex::Autolock icl(mICameraLock);
538    status_t res;
539    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
540}
541
542status_t Camera2Client::startPreview() {
543    ATRACE_CALL();
544    ALOGV("%s: E", __FUNCTION__);
545    Mutex::Autolock icl(mICameraLock);
546    status_t res;
547    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
548    return startPreviewL();
549}
550
551status_t Camera2Client::startPreviewL() {
552    ATRACE_CALL();
553    status_t res;
554    if (mState >= PREVIEW) {
555        ALOGE("%s: Can't start preview in state %s",
556                __FUNCTION__, getStateName(mState));
557        return INVALID_OPERATION;
558    }
559
560    if (mPreviewWindow == 0) {
561        mState = WAITING_FOR_PREVIEW_WINDOW;
562        return OK;
563    }
564    mState = STOPPED;
565
566    LockedParameters::Key k(mParameters);
567
568    res = updatePreviewStream(k.mParameters);
569    if (res != OK) {
570        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
571                __FUNCTION__, mCameraId, strerror(-res), res);
572        return res;
573    }
574
575    if (mPreviewRequest == NULL) {
576        res = updatePreviewRequest(k.mParameters);
577        if (res != OK) {
578            ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
579                    __FUNCTION__, mCameraId, strerror(-res), res);
580            return res;
581        }
582    }
583
584    res = updateEntry(mPreviewRequest,
585            ANDROID_REQUEST_OUTPUT_STREAMS,
586            &mPreviewStreamId, 1);
587    if (res != OK) {
588        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
589                __FUNCTION__, mCameraId, strerror(-res), res);
590        return res;
591    }
592    res = sort_camera_metadata(mPreviewRequest);
593    if (res != OK) {
594        ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
595                __FUNCTION__, mCameraId, strerror(-res), res);
596        return res;
597    }
598
599    res = mDevice->setStreamingRequest(mPreviewRequest);
600    if (res != OK) {
601        ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
602                "%s (%d)",
603                __FUNCTION__, mCameraId, strerror(-res), res);
604        return res;
605    }
606    mState = PREVIEW;
607
608    return OK;
609}
610
611void Camera2Client::stopPreview() {
612    ATRACE_CALL();
613    ALOGV("%s: E", __FUNCTION__);
614    Mutex::Autolock icl(mICameraLock);
615    status_t res;
616    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
617    stopPreviewL();
618}
619
620void Camera2Client::stopPreviewL() {
621    ATRACE_CALL();
622    switch (mState) {
623        case DISCONNECTED:
624            ALOGE("%s: Camera %d: Call before initialized",
625                    __FUNCTION__, mCameraId);
626            break;
627        case STOPPED:
628            break;
629        case STILL_CAPTURE:
630            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
631                    __FUNCTION__, mCameraId);
632            break;
633        case RECORD:
634            // TODO: Handle record stop here
635        case PREVIEW:
636            mDevice->setStreamingRequest(NULL);
637            mDevice->waitUntilDrained();
638        case WAITING_FOR_PREVIEW_WINDOW:
639            mState = STOPPED;
640            break;
641        default:
642            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
643                    mState);
644    }
645}
646
647bool Camera2Client::previewEnabled() {
648    ATRACE_CALL();
649    Mutex::Autolock icl(mICameraLock);
650    status_t res;
651    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
652
653    return mState == PREVIEW;
654}
655
656status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
657    ATRACE_CALL();
658    Mutex::Autolock icl(mICameraLock);
659    status_t res;
660    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
661
662    switch (mState) {
663        case RECORD:
664        case VIDEO_SNAPSHOT:
665            ALOGE("%s: Camera %d: Can't be called in state %s",
666                    __FUNCTION__, mCameraId, getStateName(mState));
667            return INVALID_OPERATION;
668        default:
669            // OK
670            break;
671    }
672    LockedParameters::Key k(mParameters);
673
674    k.mParameters.storeMetadataInBuffers = enabled;
675
676    return OK;
677}
678
679status_t Camera2Client::startRecording() {
680    ATRACE_CALL();
681    ALOGV("%s: E", __FUNCTION__);
682    Mutex::Autolock icl(mICameraLock);
683    status_t res;
684    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
685
686    switch (mState) {
687        case STOPPED:
688            res = startPreviewL();
689            if (res != OK) return res;
690            break;
691        case PREVIEW:
692            // Ready to go
693            break;
694        case RECORD:
695        case VIDEO_SNAPSHOT:
696            // OK to call this when recording is already on
697            return OK;
698            break;
699        default:
700            ALOGE("%s: Camera %d: Can't start recording in state %s",
701                    __FUNCTION__, mCameraId, getStateName(mState));
702            return INVALID_OPERATION;
703    };
704
705    LockedParameters::Key k(mParameters);
706
707    if (!k.mParameters.storeMetadataInBuffers) {
708        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
709                "non-metadata recording mode requested!", __FUNCTION__,
710                mCameraId);
711        return INVALID_OPERATION;
712    }
713
714    res = updateRecordingStream(k.mParameters);
715    if (res != OK) {
716        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
717                __FUNCTION__, mCameraId, strerror(-res), res);
718        return res;
719    }
720
721    if (mRecordingRequest == NULL) {
722        res = updateRecordingRequest(k.mParameters);
723        if (res != OK) {
724            ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
725                    __FUNCTION__, mCameraId, strerror(-res), res);
726            return res;
727        }
728    }
729
730    uint8_t outputStreams[2] = { mPreviewStreamId, mRecordingStreamId };
731    res = updateEntry(mRecordingRequest,
732            ANDROID_REQUEST_OUTPUT_STREAMS,
733            outputStreams, 2);
734    if (res != OK) {
735        ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
736                __FUNCTION__, mCameraId, strerror(-res), res);
737        return res;
738    }
739    res = sort_camera_metadata(mRecordingRequest);
740    if (res != OK) {
741        ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
742                __FUNCTION__, mCameraId, strerror(-res), res);
743        return res;
744    }
745
746    res = mDevice->setStreamingRequest(mRecordingRequest);
747    if (res != OK) {
748        ALOGE("%s: Camera %d: Unable to set recording request to start "
749                "recording: %s (%d)", __FUNCTION__, mCameraId,
750                strerror(-res), res);
751        return res;
752    }
753    mState = RECORD;
754
755    return OK;
756}
757
758void Camera2Client::stopRecording() {
759    ATRACE_CALL();
760    ALOGV("%s: E", __FUNCTION__);
761    Mutex::Autolock icl(mICameraLock);
762    status_t res;
763    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
764
765    switch (mState) {
766        case RECORD:
767            // OK to stop
768            break;
769        case STOPPED:
770        case PREVIEW:
771        case STILL_CAPTURE:
772        case VIDEO_SNAPSHOT:
773        default:
774            ALOGE("%s: Camera %d: Can't stop recording in state %s",
775                    __FUNCTION__, mCameraId, getStateName(mState));
776            return;
777    };
778
779    // Back to preview. Since record can only be reached through preview,
780    // all preview stream setup should be up to date.
781    res = mDevice->setStreamingRequest(mPreviewRequest);
782    if (res != OK) {
783        ALOGE("%s: Camera %d: Unable to switch back to preview request: "
784                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
785        return;
786    }
787
788    // TODO: Should recording heap be freed? Can't do it yet since requests
789    // could still be in flight.
790
791    mState = PREVIEW;
792}
793
794bool Camera2Client::recordingEnabled() {
795    ATRACE_CALL();
796    Mutex::Autolock icl(mICameraLock);
797
798    if ( checkPid(__FUNCTION__) != OK) return false;
799
800    return recordingEnabledL();
801}
802
803bool Camera2Client::recordingEnabledL() {
804    ATRACE_CALL();
805
806    return (mState == RECORD || mState == VIDEO_SNAPSHOT);
807}
808
809void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
810    ATRACE_CALL();
811    Mutex::Autolock icl(mICameraLock);
812    status_t res;
813    if ( checkPid(__FUNCTION__) != OK) return;
814    // Make sure this is for the current heap
815    ssize_t offset;
816    size_t size;
817    sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
818    if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
819        ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
820                "(got %x, expected %x)", __FUNCTION__, mCameraId,
821                heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
822        return;
823    }
824    uint8_t *data = (uint8_t*)heap->getBase() + offset;
825    uint32_t type = *(uint32_t*)data;
826    if (type != kMetadataBufferTypeGrallocSource) {
827        ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)",
828                __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource);
829        return;
830    }
831    buffer_handle_t imgBuffer = *(buffer_handle_t*)(data + 4);
832    ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId,
833            imgBuffer);
834    res = mRecordingConsumer->freeBuffer(imgBuffer);
835    if (res != OK) {
836        ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):"
837                "%s (%d)",
838                __FUNCTION__, mCameraId, imgBuffer, strerror(-res), res);
839        return;
840    }
841
842    mRecordingHeapFree++;
843}
844
845status_t Camera2Client::autoFocus() {
846    ATRACE_CALL();
847    Mutex::Autolock icl(mICameraLock);
848    status_t res;
849    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
850
851    int triggerId;
852    {
853        LockedParameters::Key k(mParameters);
854        k.mParameters.currentAfTriggerId = ++k.mParameters.afTriggerCounter;
855        triggerId = k.mParameters.currentAfTriggerId;
856    }
857
858    mDevice->triggerAutofocus(triggerId);
859
860    return OK;
861}
862
863status_t Camera2Client::cancelAutoFocus() {
864    ATRACE_CALL();
865    Mutex::Autolock icl(mICameraLock);
866    status_t res;
867    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
868
869    int triggerId;
870    {
871        LockedParameters::Key k(mParameters);
872        triggerId = ++k.mParameters.afTriggerCounter;
873    }
874
875    mDevice->triggerCancelAutofocus(triggerId);
876
877    return OK;
878}
879
880status_t Camera2Client::takePicture(int msgType) {
881    ATRACE_CALL();
882    Mutex::Autolock icl(mICameraLock);
883    status_t res;
884    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
885
886    switch (mState) {
887        case DISCONNECTED:
888        case STOPPED:
889        case WAITING_FOR_PREVIEW_WINDOW:
890            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
891                    __FUNCTION__, mCameraId);
892            return INVALID_OPERATION;
893        case PREVIEW:
894        case RECORD:
895            // Good to go for takePicture
896            break;
897        case STILL_CAPTURE:
898        case VIDEO_SNAPSHOT:
899            ALOGE("%s: Camera %d: Already taking a picture",
900                    __FUNCTION__, mCameraId);
901            return INVALID_OPERATION;
902    }
903
904    LockedParameters::Key k(mParameters);
905
906    res = updateCaptureStream(k.mParameters);
907    if (res != OK) {
908        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
909                __FUNCTION__, mCameraId, strerror(-res), res);
910        return res;
911    }
912
913    if (mCaptureRequest == NULL) {
914        res = updateCaptureRequest(k.mParameters);
915        if (res != OK) {
916            ALOGE("%s: Camera %d: Can't create still image capture request: "
917                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
918            return res;
919        }
920    }
921
922    camera_metadata_entry_t outputStreams;
923    if (mState == PREVIEW) {
924        uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId };
925        res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS,
926                &streamIds, 2);
927    } else if (mState == RECORD) {
928        uint8_t streamIds[3] = { mPreviewStreamId, mRecordingStreamId,
929                                 mCaptureStreamId };
930        res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS,
931                &streamIds, 3);
932    }
933
934    if (res != OK) {
935        ALOGE("%s: Camera %d: Unable to set up still image capture request: "
936                "%s (%d)",
937                __FUNCTION__, mCameraId, strerror(-res), res);
938        return res;
939    }
940    res = sort_camera_metadata(mCaptureRequest);
941    if (res != OK) {
942        ALOGE("%s: Camera %d: Unable to sort capture request: %s (%d)",
943                __FUNCTION__, mCameraId, strerror(-res), res);
944        return res;
945    }
946
947    camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest);
948    if (captureCopy == NULL) {
949        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
950                __FUNCTION__, mCameraId);
951        return NO_MEMORY;
952    }
953
954    if (mState == PREVIEW) {
955        res = mDevice->setStreamingRequest(NULL);
956        if (res != OK) {
957            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
958                    "%s (%d)",
959                    __FUNCTION__, mCameraId, strerror(-res), res);
960            return res;
961        }
962    }
963    // TODO: Capture should be atomic with setStreamingRequest here
964    res = mDevice->capture(captureCopy);
965    if (res != OK) {
966        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
967                "%s (%d)",
968                __FUNCTION__, mCameraId, strerror(-res), res);
969        return res;
970    }
971
972    switch (mState) {
973        case PREVIEW:
974            mState = STILL_CAPTURE;
975            break;
976        case RECORD:
977            mState = VIDEO_SNAPSHOT;
978            break;
979        default:
980            ALOGE("%s: Camera %d: Unknown state for still capture!",
981                    __FUNCTION__, mCameraId);
982            return INVALID_OPERATION;
983    }
984
985    return OK;
986}
987
988status_t Camera2Client::setParameters(const String8& params) {
989    ATRACE_CALL();
990    ALOGV("%s: E", __FUNCTION__);
991    Mutex::Autolock icl(mICameraLock);
992    status_t res;
993    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
994
995    LockedParameters::Key k(mParameters);
996
997    CameraParameters newParams(params);
998
999    // TODO: Currently ignoring any changes to supposedly read-only
1000    // parameters such as supported preview sizes, etc. Should probably
1001    // produce an error if they're changed.
1002
1003    /** Extract and verify new parameters */
1004
1005    size_t i;
1006
1007    // PREVIEW_SIZE
1008    int previewWidth, previewHeight;
1009    newParams.getPreviewSize(&previewWidth, &previewHeight);
1010
1011    if (previewWidth != k.mParameters.previewWidth ||
1012            previewHeight != k.mParameters.previewHeight) {
1013        if (mState >= PREVIEW) {
1014            ALOGE("%s: Preview size cannot be updated when preview "
1015                    "is active! (Currently %d x %d, requested %d x %d",
1016                    __FUNCTION__,
1017                    k.mParameters.previewWidth, k.mParameters.previewHeight,
1018                    previewWidth, previewHeight);
1019            return BAD_VALUE;
1020        }
1021        camera_metadata_entry_t availablePreviewSizes =
1022            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
1023        for (i = 0; i < availablePreviewSizes.count; i += 2 ) {
1024            if (availablePreviewSizes.data.i32[i] == previewWidth &&
1025                    availablePreviewSizes.data.i32[i+1] == previewHeight) break;
1026        }
1027        if (i == availablePreviewSizes.count) {
1028            ALOGE("%s: Requested preview size %d x %d is not supported",
1029                    __FUNCTION__, previewWidth, previewHeight);
1030            return BAD_VALUE;
1031        }
1032    }
1033
1034    // PREVIEW_FPS_RANGE
1035    int previewFpsRange[2];
1036    int previewFps = 0;
1037    bool fpsRangeChanged = false;
1038    newParams.getPreviewFpsRange(&previewFpsRange[0], &previewFpsRange[1]);
1039    if (previewFpsRange[0] != k.mParameters.previewFpsRange[0] ||
1040            previewFpsRange[1] != k.mParameters.previewFpsRange[1]) {
1041        fpsRangeChanged = true;
1042        camera_metadata_entry_t availablePreviewFpsRanges =
1043            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
1044        for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
1045            if ((availablePreviewFpsRanges.data.i32[i] ==
1046                    previewFpsRange[0]) &&
1047                (availablePreviewFpsRanges.data.i32[i+1] ==
1048                    previewFpsRange[1]) ) {
1049                break;
1050            }
1051        }
1052        if (i == availablePreviewFpsRanges.count) {
1053            ALOGE("%s: Requested preview FPS range %d - %d is not supported",
1054                __FUNCTION__, previewFpsRange[0], previewFpsRange[1]);
1055            return BAD_VALUE;
1056        }
1057        previewFps = previewFpsRange[0];
1058    }
1059
1060    // PREVIEW_FORMAT
1061    int previewFormat = formatStringToEnum(newParams.getPreviewFormat());
1062    if (previewFormat != k.mParameters.previewFormat) {
1063        if (mState >= PREVIEW) {
1064            ALOGE("%s: Preview format cannot be updated when preview "
1065                    "is active!", __FUNCTION__);
1066            return BAD_VALUE;
1067        }
1068        camera_metadata_entry_t availableFormats =
1069            staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
1070        for (i = 0; i < availableFormats.count; i++) {
1071            if (availableFormats.data.i32[i] == previewFormat) break;
1072        }
1073        if (i == availableFormats.count) {
1074            ALOGE("%s: Requested preview format %s (0x%x) is not supported",
1075                    __FUNCTION__, newParams.getPreviewFormat(), previewFormat);
1076            return BAD_VALUE;
1077        }
1078    }
1079
1080    // PREVIEW_FRAME_RATE
1081    // Deprecated, only use if the preview fps range is unchanged this time.
1082    // The single-value FPS is the same as the minimum of the range.
1083    if (!fpsRangeChanged) {
1084        previewFps = newParams.getPreviewFrameRate();
1085        if (previewFps != k.mParameters.previewFps) {
1086            camera_metadata_entry_t availableFrameRates =
1087                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
1088            for (i = 0; i < availableFrameRates.count; i+=2) {
1089                if (availableFrameRates.data.i32[i] == previewFps) break;
1090            }
1091            if (i == availableFrameRates.count) {
1092                ALOGE("%s: Requested preview frame rate %d is not supported",
1093                        __FUNCTION__, previewFps);
1094                return BAD_VALUE;
1095            }
1096            previewFpsRange[0] = availableFrameRates.data.i32[i];
1097            previewFpsRange[1] = availableFrameRates.data.i32[i+1];
1098        }
1099    }
1100
1101    // PICTURE_SIZE
1102    int pictureWidth, pictureHeight;
1103    newParams.getPictureSize(&pictureWidth, &pictureHeight);
1104    if (pictureWidth == k.mParameters.pictureWidth ||
1105            pictureHeight == k.mParameters.pictureHeight) {
1106        camera_metadata_entry_t availablePictureSizes =
1107            staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
1108        for (i = 0; i < availablePictureSizes.count; i+=2) {
1109            if (availablePictureSizes.data.i32[i] == pictureWidth &&
1110                    availablePictureSizes.data.i32[i+1] == pictureHeight) break;
1111        }
1112        if (i == availablePictureSizes.count) {
1113            ALOGE("%s: Requested picture size %d x %d is not supported",
1114                    __FUNCTION__, pictureWidth, pictureHeight);
1115            return BAD_VALUE;
1116        }
1117    }
1118
1119    // JPEG_THUMBNAIL_WIDTH/HEIGHT
1120    int jpegThumbSize[2];
1121    jpegThumbSize[0] =
1122            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
1123    jpegThumbSize[1] =
1124            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
1125    if (jpegThumbSize[0] != k.mParameters.jpegThumbSize[0] ||
1126            jpegThumbSize[1] != k.mParameters.jpegThumbSize[1]) {
1127        camera_metadata_entry_t availableJpegThumbSizes =
1128            staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
1129        for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
1130            if (availableJpegThumbSizes.data.i32[i] == jpegThumbSize[0] &&
1131                    availableJpegThumbSizes.data.i32[i+1] == jpegThumbSize[1]) {
1132                break;
1133            }
1134        }
1135        if (i == availableJpegThumbSizes.count) {
1136            ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
1137                    __FUNCTION__, jpegThumbSize[0], jpegThumbSize[1]);
1138            return BAD_VALUE;
1139        }
1140    }
1141
1142    // JPEG_THUMBNAIL_QUALITY
1143    int jpegThumbQuality =
1144            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
1145    if (jpegThumbQuality < 0 || jpegThumbQuality > 100) {
1146        ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
1147                __FUNCTION__, jpegThumbQuality);
1148        return BAD_VALUE;
1149    }
1150
1151    // JPEG_QUALITY
1152    int jpegQuality =
1153            newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
1154    if (jpegQuality < 0 || jpegQuality > 100) {
1155        ALOGE("%s: Requested JPEG quality %d is not supported",
1156                __FUNCTION__, jpegQuality);
1157        return BAD_VALUE;
1158    }
1159
1160    // ROTATION
1161    int jpegRotation =
1162            newParams.getInt(CameraParameters::KEY_ROTATION);
1163    if (jpegRotation != 0 &&
1164            jpegRotation != 90 &&
1165            jpegRotation != 180 &&
1166            jpegRotation != 270) {
1167        ALOGE("%s: Requested picture rotation angle %d is not supported",
1168                __FUNCTION__, jpegRotation);
1169        return BAD_VALUE;
1170    }
1171
1172    // GPS
1173    bool gpsEnabled = false;
1174    double gpsCoordinates[3] = {0,0,0};
1175    int64_t gpsTimestamp = 0;
1176    String8 gpsProcessingMethod;
1177    const char *gpsLatStr =
1178            newParams.get(CameraParameters::KEY_GPS_LATITUDE);
1179    if (gpsLatStr != NULL) {
1180        const char *gpsLongStr =
1181                newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
1182        const char *gpsAltitudeStr =
1183                newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
1184        const char *gpsTimeStr =
1185                newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
1186        const char *gpsProcMethodStr =
1187                newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
1188        if (gpsLongStr == NULL ||
1189                gpsAltitudeStr == NULL ||
1190                gpsTimeStr == NULL ||
1191                gpsProcMethodStr == NULL) {
1192            ALOGE("%s: Incomplete set of GPS parameters provided",
1193                    __FUNCTION__);
1194            return BAD_VALUE;
1195        }
1196        char *endPtr;
1197        errno = 0;
1198        gpsCoordinates[0] = strtod(gpsLatStr, &endPtr);
1199        if (errno || endPtr == gpsLatStr) {
1200            ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
1201            return BAD_VALUE;
1202        }
1203        errno = 0;
1204        gpsCoordinates[1] = strtod(gpsLongStr, &endPtr);
1205        if (errno || endPtr == gpsLongStr) {
1206            ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
1207            return BAD_VALUE;
1208        }
1209        errno = 0;
1210        gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr);
1211        if (errno || endPtr == gpsAltitudeStr) {
1212            ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
1213                    gpsAltitudeStr);
1214            return BAD_VALUE;
1215        }
1216        errno = 0;
1217        gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
1218        if (errno || endPtr == gpsTimeStr) {
1219            ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
1220            return BAD_VALUE;
1221        }
1222        gpsProcessingMethod = gpsProcMethodStr;
1223
1224        gpsEnabled = true;
1225    }
1226
1227    // WHITE_BALANCE
1228    int wbMode = wbModeStringToEnum(
1229        newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
1230    if (wbMode != k.mParameters.wbMode) {
1231        camera_metadata_entry_t availableWbModes =
1232            staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
1233        for (i = 0; i < availableWbModes.count; i++) {
1234            if (wbMode == availableWbModes.data.u8[i]) break;
1235        }
1236        if (i == availableWbModes.count) {
1237            ALOGE("%s: Requested white balance mode %s is not supported",
1238                    __FUNCTION__,
1239                    newParams.get(CameraParameters::KEY_WHITE_BALANCE));
1240            return BAD_VALUE;
1241        }
1242    }
1243
1244    // EFFECT
1245    int effectMode = effectModeStringToEnum(
1246        newParams.get(CameraParameters::KEY_EFFECT) );
1247    if (effectMode != k.mParameters.effectMode) {
1248        camera_metadata_entry_t availableEffectModes =
1249            staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
1250        for (i = 0; i < availableEffectModes.count; i++) {
1251            if (effectMode == availableEffectModes.data.u8[i]) break;
1252        }
1253        if (i == availableEffectModes.count) {
1254            ALOGE("%s: Requested effect mode \"%s\" is not supported",
1255                    __FUNCTION__,
1256                    newParams.get(CameraParameters::KEY_EFFECT) );
1257            return BAD_VALUE;
1258        }
1259    }
1260
1261    // ANTIBANDING
1262    int antibandingMode = abModeStringToEnum(
1263        newParams.get(CameraParameters::KEY_ANTIBANDING) );
1264    if (antibandingMode != k.mParameters.antibandingMode) {
1265        camera_metadata_entry_t availableAbModes =
1266            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
1267        for (i = 0; i < availableAbModes.count; i++) {
1268            if (antibandingMode == availableAbModes.data.u8[i]) break;
1269        }
1270        if (i == availableAbModes.count) {
1271            ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
1272                    __FUNCTION__,
1273                    newParams.get(CameraParameters::KEY_ANTIBANDING));
1274            return BAD_VALUE;
1275        }
1276    }
1277
1278    // SCENE_MODE
1279    int sceneMode = sceneModeStringToEnum(
1280        newParams.get(CameraParameters::KEY_SCENE_MODE) );
1281    if (sceneMode != k.mParameters.sceneMode) {
1282        camera_metadata_entry_t availableSceneModes =
1283            staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
1284        for (i = 0; i < availableSceneModes.count; i++) {
1285            if (sceneMode == availableSceneModes.data.u8[i]) break;
1286        }
1287        if (i == availableSceneModes.count) {
1288            ALOGE("%s: Requested scene mode \"%s\" is not supported",
1289                    __FUNCTION__,
1290                    newParams.get(CameraParameters::KEY_SCENE_MODE));
1291            return BAD_VALUE;
1292        }
1293    }
1294
1295    // FLASH_MODE
1296    Parameters::flashMode_t flashMode = flashModeStringToEnum(
1297        newParams.get(CameraParameters::KEY_FLASH_MODE) );
1298    if (flashMode != k.mParameters.flashMode) {
1299        camera_metadata_entry_t flashAvailable =
1300            staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
1301        if (!flashAvailable.data.u8[0] &&
1302                flashMode != Parameters::FLASH_MODE_OFF) {
1303            ALOGE("%s: Requested flash mode \"%s\" is not supported: "
1304                    "No flash on device", __FUNCTION__,
1305                    newParams.get(CameraParameters::KEY_FLASH_MODE));
1306            return BAD_VALUE;
1307        } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) {
1308            camera_metadata_entry_t availableAeModes =
1309                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
1310            for (i = 0; i < availableAeModes.count; i++) {
1311                if (flashMode == availableAeModes.data.u8[i]) break;
1312            }
1313            if (i == availableAeModes.count) {
1314                ALOGE("%s: Requested flash mode \"%s\" is not supported",
1315                        __FUNCTION__,
1316                        newParams.get(CameraParameters::KEY_FLASH_MODE));
1317                return BAD_VALUE;
1318            }
1319        } else if (flashMode == -1) {
1320            ALOGE("%s: Requested flash mode \"%s\" is unknown",
1321                    __FUNCTION__,
1322                    newParams.get(CameraParameters::KEY_FLASH_MODE));
1323            return BAD_VALUE;
1324        }
1325    }
1326
1327    // FOCUS_MODE
1328    Parameters::focusMode_t focusMode = focusModeStringToEnum(
1329        newParams.get(CameraParameters::KEY_FOCUS_MODE));
1330    if (focusMode != k.mParameters.focusMode) {
1331        if (focusMode != Parameters::FOCUS_MODE_FIXED) {
1332            camera_metadata_entry_t minFocusDistance =
1333                staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE);
1334            if (minFocusDistance.data.f[0] == 0) {
1335                ALOGE("%s: Requested focus mode \"%s\" is not available: "
1336                        "fixed focus lens",
1337                        __FUNCTION__,
1338                        newParams.get(CameraParameters::KEY_FOCUS_MODE));
1339                return BAD_VALUE;
1340            } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) {
1341                camera_metadata_entry_t availableFocusModes =
1342                    staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
1343                for (i = 0; i < availableFocusModes.count; i++) {
1344                    if (focusMode == availableFocusModes.data.u8[i]) break;
1345                }
1346                if (i == availableFocusModes.count) {
1347                    ALOGE("%s: Requested focus mode \"%s\" is not supported",
1348                            __FUNCTION__,
1349                            newParams.get(CameraParameters::KEY_FOCUS_MODE));
1350                    return BAD_VALUE;
1351                }
1352            }
1353        }
1354    }
1355
1356    // FOCUS_AREAS
1357    Vector<Parameters::Area> focusingAreas;
1358    res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
1359            &focusingAreas);
1360    size_t max3aRegions =
1361        (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0];
1362    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
1363    if (res != OK) {
1364        ALOGE("%s: Requested focus areas are malformed: %s",
1365                __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
1366        return BAD_VALUE;
1367    }
1368
1369    // EXPOSURE_COMPENSATION
1370    int exposureCompensation =
1371        newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
1372    camera_metadata_entry_t exposureCompensationRange =
1373        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE);
1374    if (exposureCompensation < exposureCompensationRange.data.i32[0] ||
1375            exposureCompensation > exposureCompensationRange.data.i32[1]) {
1376        ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
1377                __FUNCTION__, exposureCompensation);
1378        return BAD_VALUE;
1379    }
1380
1381    // AUTO_EXPOSURE_LOCK (always supported)
1382    bool autoExposureLock = boolFromString(
1383        newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
1384
1385    // AUTO_WHITEBALANCE_LOCK (always supported)
1386    bool autoWhiteBalanceLock = boolFromString(
1387        newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
1388
1389    // METERING_AREAS
1390    Vector<Parameters::Area> meteringAreas;
1391    res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
1392            &meteringAreas);
1393    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
1394    if (res != OK) {
1395        ALOGE("%s: Requested metering areas are malformed: %s",
1396                __FUNCTION__,
1397                newParams.get(CameraParameters::KEY_METERING_AREAS));
1398        return BAD_VALUE;
1399    }
1400
1401    // ZOOM
1402    int zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
1403    if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) {
1404        ALOGE("%s: Requested zoom level %d is not supported",
1405                __FUNCTION__, zoom);
1406        return BAD_VALUE;
1407    }
1408
1409    // VIDEO_SIZE
1410    int videoWidth, videoHeight;
1411    newParams.getVideoSize(&videoWidth, &videoHeight);
1412    if (videoWidth != k.mParameters.videoWidth ||
1413            videoHeight != k.mParameters.videoHeight) {
1414        if (mState == RECORD) {
1415            ALOGE("%s: Video size cannot be updated when recording is active!",
1416                    __FUNCTION__);
1417            return BAD_VALUE;
1418        }
1419        camera_metadata_entry_t availableVideoSizes =
1420            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
1421        for (i = 0; i < availableVideoSizes.count; i += 2 ) {
1422            if (availableVideoSizes.data.i32[i] == videoWidth &&
1423                    availableVideoSizes.data.i32[i+1] == videoHeight)  break;
1424        }
1425        if (i == availableVideoSizes.count) {
1426            ALOGE("%s: Requested video size %d x %d is not supported",
1427                    __FUNCTION__, videoWidth, videoHeight);
1428            return BAD_VALUE;
1429        }
1430    }
1431
1432    // RECORDING_HINT (always supported)
1433    bool recordingHint = boolFromString(
1434        newParams.get(CameraParameters::KEY_RECORDING_HINT) );
1435
1436    // VIDEO_STABILIZATION
1437    bool videoStabilization = boolFromString(
1438        newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
1439    camera_metadata_entry_t availableVideoStabilizationModes =
1440        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
1441    if (videoStabilization && availableVideoStabilizationModes.count == 1) {
1442        ALOGE("%s: Video stabilization not supported", __FUNCTION__);
1443    }
1444
1445    /** Update internal parameters */
1446
1447    k.mParameters.previewWidth = previewWidth;
1448    k.mParameters.previewHeight = previewHeight;
1449    k.mParameters.previewFpsRange[0] = previewFpsRange[0];
1450    k.mParameters.previewFpsRange[1] = previewFpsRange[1];
1451    k.mParameters.previewFps = previewFps;
1452    k.mParameters.previewFormat = previewFormat;
1453
1454    k.mParameters.pictureWidth = pictureWidth;
1455    k.mParameters.pictureHeight = pictureHeight;
1456
1457    k.mParameters.jpegThumbSize[0] = jpegThumbSize[0];
1458    k.mParameters.jpegThumbSize[1] = jpegThumbSize[1];
1459    k.mParameters.jpegQuality = jpegQuality;
1460    k.mParameters.jpegThumbQuality = jpegThumbQuality;
1461
1462    k.mParameters.gpsEnabled = gpsEnabled;
1463    k.mParameters.gpsCoordinates[0] = gpsCoordinates[0];
1464    k.mParameters.gpsCoordinates[1] = gpsCoordinates[1];
1465    k.mParameters.gpsCoordinates[2] = gpsCoordinates[2];
1466    k.mParameters.gpsTimestamp = gpsTimestamp;
1467    k.mParameters.gpsProcessingMethod = gpsProcessingMethod;
1468
1469    k.mParameters.wbMode = wbMode;
1470    k.mParameters.effectMode = effectMode;
1471    k.mParameters.antibandingMode = antibandingMode;
1472    k.mParameters.sceneMode = sceneMode;
1473
1474    k.mParameters.flashMode = flashMode;
1475    if (focusMode != k.mParameters.focusMode) {
1476        k.mParameters.currentAfTriggerId = -1;
1477    }
1478    k.mParameters.focusMode = focusMode;
1479
1480    k.mParameters.focusingAreas = focusingAreas;
1481    k.mParameters.exposureCompensation = exposureCompensation;
1482    k.mParameters.autoExposureLock = autoExposureLock;
1483    k.mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock;
1484    k.mParameters.meteringAreas = meteringAreas;
1485    k.mParameters.zoom = zoom;
1486
1487    k.mParameters.videoWidth = videoWidth;
1488    k.mParameters.videoHeight = videoHeight;
1489
1490    k.mParameters.recordingHint = recordingHint;
1491    k.mParameters.videoStabilization = videoStabilization;
1492
1493    res = updatePreviewRequest(k.mParameters);
1494    if (res != OK) {
1495        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1496                __FUNCTION__, mCameraId, strerror(-res), res);
1497        return res;
1498    }
1499    res = updateCaptureRequest(k.mParameters);
1500    if (res != OK) {
1501        ALOGE("%s: Camera %d: Unable to update capture request: %s (%d)",
1502                __FUNCTION__, mCameraId, strerror(-res), res);
1503        return res;
1504    }
1505
1506    res = updateRecordingRequest(k.mParameters);
1507    if (res != OK) {
1508        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1509                __FUNCTION__, mCameraId, strerror(-res), res);
1510        return res;
1511    }
1512
1513    if (mState == PREVIEW) {
1514        res = mDevice->setStreamingRequest(mPreviewRequest);
1515        if (res != OK) {
1516            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1517                    __FUNCTION__, mCameraId, strerror(-res), res);
1518            return res;
1519        }
1520    } else if (mState == RECORD || mState == VIDEO_SNAPSHOT) {
1521        res = mDevice->setStreamingRequest(mRecordingRequest);
1522        if (res != OK) {
1523            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1524                    __FUNCTION__, mCameraId, strerror(-res), res);
1525            return res;
1526        }
1527    }
1528
1529    k.mParameters.paramsFlattened = params;
1530
1531    return OK;
1532}
1533
1534String8 Camera2Client::getParameters() const {
1535    ATRACE_CALL();
1536    Mutex::Autolock icl(mICameraLock);
1537    if ( checkPid(__FUNCTION__) != OK) return String8();
1538
1539    LockedParameters::ReadKey k(mParameters);
1540
1541    // TODO: Deal with focus distances
1542    return k.mParameters.paramsFlattened;
1543}
1544
1545status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1546    ATRACE_CALL();
1547    Mutex::Autolock icl(mICameraLock);
1548    status_t res;
1549    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1550
1551    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1552            cmd, arg1, arg2);
1553
1554    switch (cmd) {
1555        case CAMERA_CMD_START_SMOOTH_ZOOM:
1556            return commandStartSmoothZoomL();
1557        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1558            return commandStopSmoothZoomL();
1559        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1560            return commandSetDisplayOrientationL(arg1);
1561        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1562            return commandEnableShutterSoundL(arg1 == 1);
1563        case CAMERA_CMD_PLAY_RECORDING_SOUND:
1564            return commandPlayRecordingSoundL();
1565        case CAMERA_CMD_START_FACE_DETECTION:
1566            return commandStartFaceDetectionL(arg1);
1567        case CAMERA_CMD_STOP_FACE_DETECTION:
1568            return commandStopFaceDetectionL();
1569        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1570            return commandEnableFocusMoveMsgL(arg1 == 1);
1571        case CAMERA_CMD_PING:
1572            return commandPingL();
1573        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1574            return commandSetVideoBufferCountL(arg1);
1575        default:
1576            ALOGE("%s: Unknown command %d (arguments %d, %d)",
1577                    __FUNCTION__, cmd, arg1, arg2);
1578            return BAD_VALUE;
1579    }
1580}
1581
1582status_t Camera2Client::commandStartSmoothZoomL() {
1583    ALOGE("%s: Unimplemented!", __FUNCTION__);
1584    return OK;
1585}
1586
1587status_t Camera2Client::commandStopSmoothZoomL() {
1588    ALOGE("%s: Unimplemented!", __FUNCTION__);
1589    return OK;
1590}
1591
1592status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
1593    LockedParameters::Key k(mParameters);
1594    int transform = degToTransform(degrees,
1595            mCameraFacing == CAMERA_FACING_FRONT);
1596    if (transform == -1) {
1597        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1598                __FUNCTION__, mCameraId, degrees);
1599        return BAD_VALUE;
1600    }
1601    if (transform != k.mParameters.previewTransform &&
1602            mPreviewStreamId != NO_STREAM) {
1603        mDevice->setStreamTransform(mPreviewStreamId, transform);
1604    }
1605    k.mParameters.previewTransform = transform;
1606    return OK;
1607}
1608
1609status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
1610    LockedParameters::Key k(mParameters);
1611    if (enable) {
1612        k.mParameters.playShutterSound = true;
1613        return OK;
1614    }
1615
1616    // Disabling shutter sound may not be allowed. In that case only
1617    // allow the mediaserver process to disable the sound.
1618    char value[PROPERTY_VALUE_MAX];
1619    property_get("ro.camera.sound.forced", value, "0");
1620    if (strncmp(value, "0", 2) != 0) {
1621        // Disabling shutter sound is not allowed. Deny if the current
1622        // process is not mediaserver.
1623        if (getCallingPid() != getpid()) {
1624            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1625                    getCallingPid());
1626            return PERMISSION_DENIED;
1627        }
1628    }
1629
1630    k.mParameters.playShutterSound = false;
1631    return OK;
1632}
1633
1634status_t Camera2Client::commandPlayRecordingSoundL() {
1635    mCameraService->playSound(CameraService::SOUND_RECORDING);
1636    return OK;
1637}
1638
1639status_t Camera2Client::commandStartFaceDetectionL(int type) {
1640    ALOGE("%s: Unimplemented!", __FUNCTION__);
1641    return OK;
1642}
1643
1644status_t Camera2Client::commandStopFaceDetectionL() {
1645    ALOGE("%s: Unimplemented!", __FUNCTION__);
1646    return OK;
1647}
1648
1649status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
1650    LockedParameters::Key k(mParameters);
1651    k.mParameters.enableFocusMoveMessages = enable;
1652
1653    return OK;
1654}
1655
1656status_t Camera2Client::commandPingL() {
1657    // Always ping back if access is proper and device is alive
1658    if (mState != DISCONNECTED) {
1659        return OK;
1660    } else {
1661        return NO_INIT;
1662    }
1663}
1664
1665status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
1666    if (recordingEnabledL()) {
1667        ALOGE("%s: Camera %d: Error setting video buffer count after "
1668                "recording was started", __FUNCTION__, mCameraId);
1669        return INVALID_OPERATION;
1670    }
1671
1672    // 32 is the current upper limit on the video buffer count for BufferQueue
1673    if (count > 32) {
1674        ALOGE("%s: Camera %d: Error setting %d as video buffer count value",
1675                __FUNCTION__, mCameraId, count);
1676        return BAD_VALUE;
1677    }
1678
1679    // Need to reallocate memory for heap
1680    if (mRecordingHeapCount != count) {
1681        if  (mRecordingHeap != 0) {
1682            mRecordingHeap.clear();
1683            mRecordingHeap = NULL;
1684        }
1685        mRecordingHeapCount = count;
1686    }
1687
1688    return OK;
1689}
1690
1691/** Device-related methods */
1692
1693void Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1694    ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1695}
1696
1697void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1698    ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1699            frameNumber, timestamp);
1700}
1701
1702void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1703    ALOGV("%s: Autofocus state now %d, last trigger %d",
1704            __FUNCTION__, newState, triggerId);
1705    bool sendCompletedMessage = false;
1706    bool sendMovingMessage = false;
1707
1708    bool success = false;
1709    bool afInMotion = false;
1710    {
1711        LockedParameters::Key k(mParameters);
1712        switch (k.mParameters.focusMode) {
1713            case Parameters::FOCUS_MODE_AUTO:
1714            case Parameters::FOCUS_MODE_MACRO:
1715                // Don't send notifications upstream if they're not for the current AF
1716                // trigger. For example, if cancel was called in between, or if we
1717                // already sent a notification about this AF call.
1718                if (triggerId != k.mParameters.currentAfTriggerId) break;
1719                switch (newState) {
1720                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1721                        success = true;
1722                        // no break
1723                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1724                        sendCompletedMessage = true;
1725                        k.mParameters.currentAfTriggerId = -1;
1726                        break;
1727                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1728                        // Just starting focusing, ignore
1729                        break;
1730                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1731                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1732                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1733                    default:
1734                        // Unexpected in AUTO/MACRO mode
1735                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1736                                __FUNCTION__, newState);
1737                        break;
1738                }
1739                break;
1740            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1741            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1742                switch (newState) {
1743                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1744                        success = true;
1745                        // no break
1746                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1747                        // Don't send notifications upstream if they're not for
1748                        // the current AF trigger. For example, if cancel was
1749                        // called in between, or if we already sent a
1750                        // notification about this AF call.
1751                        // Send both a 'AF done' callback and a 'AF move' callback
1752                        if (triggerId != k.mParameters.currentAfTriggerId) break;
1753                        sendCompletedMessage = true;
1754                        afInMotion = false;
1755                        if (k.mParameters.enableFocusMoveMessages &&
1756                                k.mParameters.afInMotion) {
1757                            sendMovingMessage = true;
1758                        }
1759                        k.mParameters.currentAfTriggerId = -1;
1760                        break;
1761                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1762                        // Cancel was called, or we switched state; care if
1763                        // currently moving
1764                        afInMotion = false;
1765                        if (k.mParameters.enableFocusMoveMessages &&
1766                                k.mParameters.afInMotion) {
1767                            sendMovingMessage = true;
1768                        }
1769                        break;
1770                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1771                        // Start passive scan, inform upstream
1772                        afInMotion = true;
1773                        // no break
1774                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1775                        // Stop passive scan, inform upstream
1776                        if (k.mParameters.enableFocusMoveMessages) {
1777                            sendMovingMessage = true;
1778                        }
1779                        break;
1780                }
1781                k.mParameters.afInMotion = afInMotion;
1782                break;
1783            case Parameters::FOCUS_MODE_EDOF:
1784            case Parameters::FOCUS_MODE_INFINITY:
1785            case Parameters::FOCUS_MODE_FIXED:
1786            default:
1787                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1788                    ALOGE("%s: Unexpected AF state change %d (ID %d) in focus mode %d",
1789                          __FUNCTION__, newState, triggerId, k.mParameters.focusMode);
1790                }
1791        }
1792    }
1793    if (sendCompletedMessage) {
1794        mCameraClient->notifyCallback(CAMERA_MSG_FOCUS, success ? 1 : 0, 0);
1795    }
1796    if (sendMovingMessage) {
1797        mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
1798                afInMotion ? 1 : 0, 0);
1799    }
1800
1801}
1802
1803void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1804    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1805            __FUNCTION__, newState, triggerId);
1806}
1807
1808void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1809    ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1810            __FUNCTION__, newState, triggerId);
1811}
1812
1813void Camera2Client::onCaptureAvailable() {
1814    ATRACE_CALL();
1815    status_t res;
1816    sp<ICameraClient> currentClient;
1817    ALOGV("%s: Camera %d: Still capture available", __FUNCTION__, mCameraId);
1818
1819    CpuConsumer::LockedBuffer imgBuffer;
1820    {
1821        Mutex::Autolock icl(mICameraLock);
1822
1823        // TODO: Signal errors here upstream
1824        if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) {
1825            ALOGE("%s: Camera %d: Still image produced unexpectedly!",
1826                    __FUNCTION__, mCameraId);
1827            return;
1828        }
1829
1830        res = mCaptureConsumer->lockNextBuffer(&imgBuffer);
1831        if (res != OK) {
1832            ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)",
1833                    __FUNCTION__, mCameraId, strerror(-res), res);
1834            return;
1835        }
1836
1837        if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) {
1838            ALOGE("%s: Camera %d: Unexpected format for still image: "
1839                    "%x, expected %x", __FUNCTION__, mCameraId,
1840                    imgBuffer.format,
1841                    HAL_PIXEL_FORMAT_BLOB);
1842            mCaptureConsumer->unlockBuffer(imgBuffer);
1843            return;
1844        }
1845
1846        // TODO: Optimize this to avoid memcopy
1847        void* captureMemory = mCaptureHeap->mHeap->getBase();
1848        size_t size = mCaptureHeap->mHeap->getSize();
1849        memcpy(captureMemory, imgBuffer.data, size);
1850
1851        mCaptureConsumer->unlockBuffer(imgBuffer);
1852
1853        currentClient = mCameraClient;
1854        switch (mState) {
1855            case STILL_CAPTURE:
1856                mState = STOPPED;
1857                break;
1858            case VIDEO_SNAPSHOT:
1859                mState = RECORD;
1860                break;
1861            default:
1862                ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__,
1863                        mCameraId, mState);
1864                break;
1865        }
1866    }
1867    // Call outside mICameraLock to allow re-entrancy from notification
1868    if (currentClient != 0) {
1869        currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
1870                mCaptureHeap->mBuffers[0], NULL);
1871    }
1872}
1873
1874void Camera2Client::onRecordingFrameAvailable() {
1875    ATRACE_CALL();
1876    status_t res;
1877    sp<ICameraClient> currentClient;
1878    size_t heapIdx = 0;
1879    nsecs_t timestamp;
1880    {
1881        Mutex::Autolock icl(mICameraLock);
1882        // TODO: Signal errors here upstream
1883        bool discardData = false;
1884        if (mState != RECORD && mState != VIDEO_SNAPSHOT) {
1885            ALOGV("%s: Camera %d: Discarding recording image buffers received after "
1886                    "recording done",
1887                    __FUNCTION__, mCameraId);
1888            discardData = true;
1889        }
1890
1891        buffer_handle_t imgBuffer;
1892        res = mRecordingConsumer->getNextBuffer(&imgBuffer, &timestamp);
1893        if (res != OK) {
1894            ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
1895                    __FUNCTION__, mCameraId, strerror(-res), res);
1896            return;
1897        }
1898
1899        if (discardData) {
1900            mRecordingConsumer->freeBuffer(imgBuffer);
1901            return;
1902        }
1903
1904        if (mRecordingHeap == 0) {
1905            const size_t bufferSize = 4 + sizeof(buffer_handle_t);
1906            ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
1907                    "size %d bytes", __FUNCTION__, mCameraId,
1908                    mRecordingHeapCount, bufferSize);
1909            if (mRecordingHeap != 0) {
1910                ALOGV("%s: Camera %d: Previous heap has size %d "
1911                        "(new will be %d) bytes", __FUNCTION__, mCameraId,
1912                        mRecordingHeap->mHeap->getSize(),
1913                        bufferSize * mRecordingHeapCount);
1914            }
1915            // Need to allocate memory for heap
1916            mRecordingHeap.clear();
1917
1918            mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount,
1919                    "Camera2Client::RecordingHeap");
1920            if (mRecordingHeap->mHeap->getSize() == 0) {
1921                ALOGE("%s: Camera %d: Unable to allocate memory for recording",
1922                        __FUNCTION__, mCameraId);
1923                mRecordingConsumer->freeBuffer(imgBuffer);
1924                return;
1925            }
1926            mRecordingHeapHead = 0;
1927            mRecordingHeapFree = mRecordingHeapCount;
1928        }
1929
1930        if ( mRecordingHeapFree == 0) {
1931            ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
1932                    __FUNCTION__, mCameraId);
1933            mRecordingConsumer->freeBuffer(imgBuffer);
1934            return;
1935        }
1936        heapIdx = mRecordingHeapHead;
1937        mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount;
1938        mRecordingHeapFree--;
1939
1940        ALOGV("%s: Camera %d: Timestamp %lld",
1941                __FUNCTION__, mCameraId, timestamp);
1942
1943        ssize_t offset;
1944        size_t size;
1945        sp<IMemoryHeap> heap =
1946                mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
1947                        &size);
1948
1949        uint8_t *data = (uint8_t*)heap->getBase() + offset;
1950        uint32_t type = kMetadataBufferTypeGrallocSource;
1951        memcpy(data, &type, 4);
1952        memcpy(data + 4, &imgBuffer, sizeof(buffer_handle_t));
1953        ALOGV("%s: Camera %d: Sending out buffer_handle_t %p",
1954                __FUNCTION__, mCameraId, imgBuffer);
1955        currentClient = mCameraClient;
1956    }
1957    // Call outside mICameraLock to allow re-entrancy from notification
1958    if (currentClient != 0) {
1959        currentClient->dataCallbackTimestamp(timestamp,
1960                CAMERA_MSG_VIDEO_FRAME,
1961                mRecordingHeap->mBuffers[heapIdx]);
1962    }
1963}
1964
1965camera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag,
1966        size_t minCount, size_t maxCount) {
1967    status_t res;
1968    camera_metadata_entry_t entry;
1969    res = find_camera_metadata_entry(mDevice->info(),
1970            tag,
1971            &entry);
1972    if (CC_UNLIKELY( res != OK )) {
1973        const char* tagSection = get_camera_metadata_section_name(tag);
1974        if (tagSection == NULL) tagSection = "<unknown>";
1975        const char* tagName = get_camera_metadata_tag_name(tag);
1976        if (tagName == NULL) tagName = "<unknown>";
1977
1978        ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)",
1979                tagSection, tagName, tag, strerror(-res), res);
1980        entry.count = 0;
1981        entry.data.u8 = NULL;
1982    } else if (CC_UNLIKELY(
1983            (minCount != 0 && entry.count < minCount) ||
1984            (maxCount != 0 && entry.count > maxCount) ) ) {
1985        const char* tagSection = get_camera_metadata_section_name(tag);
1986        if (tagSection == NULL) tagSection = "<unknown>";
1987        const char* tagName = get_camera_metadata_tag_name(tag);
1988        if (tagName == NULL) tagName = "<unknown>";
1989        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
1990                "Expected between %d and %d values, but got %d values",
1991                tagSection, tagName, tag, minCount, maxCount, entry.count);
1992        entry.count = 0;
1993        entry.data.u8 = NULL;
1994    }
1995
1996    return entry;
1997}
1998
1999/** Utility methods */
2000
2001
2002status_t Camera2Client::buildDefaultParameters() {
2003    ATRACE_CALL();
2004    LockedParameters::Key k(mParameters);
2005
2006    status_t res;
2007    CameraParameters params;
2008
2009    camera_metadata_entry_t availableProcessedSizes =
2010        staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
2011    if (!availableProcessedSizes.count) return NO_INIT;
2012
2013    // TODO: Pick more intelligently
2014    k.mParameters.previewWidth = availableProcessedSizes.data.i32[0];
2015    k.mParameters.previewHeight = availableProcessedSizes.data.i32[1];
2016    k.mParameters.videoWidth = k.mParameters.previewWidth;
2017    k.mParameters.videoHeight = k.mParameters.previewHeight;
2018
2019    params.setPreviewSize(k.mParameters.previewWidth, k.mParameters.previewHeight);
2020    params.setVideoSize(k.mParameters.videoWidth, k.mParameters.videoHeight);
2021    params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
2022            String8::format("%dx%d",
2023                    k.mParameters.previewWidth, k.mParameters.previewHeight));
2024    {
2025        String8 supportedPreviewSizes;
2026        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
2027            if (i != 0) supportedPreviewSizes += ",";
2028            supportedPreviewSizes += String8::format("%dx%d",
2029                    availableProcessedSizes.data.i32[i],
2030                    availableProcessedSizes.data.i32[i+1]);
2031        }
2032        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
2033                supportedPreviewSizes);
2034        params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
2035                supportedPreviewSizes);
2036    }
2037
2038    camera_metadata_entry_t availableFpsRanges =
2039        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
2040    if (!availableFpsRanges.count) return NO_INIT;
2041
2042    k.mParameters.previewFpsRange[0] = availableFpsRanges.data.i32[0];
2043    k.mParameters.previewFpsRange[1] = availableFpsRanges.data.i32[1];
2044
2045    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
2046            String8::format("%d,%d",
2047                    k.mParameters.previewFpsRange[0],
2048                    k.mParameters.previewFpsRange[1]));
2049
2050    {
2051        String8 supportedPreviewFpsRange;
2052        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
2053            if (i != 0) supportedPreviewFpsRange += ",";
2054            supportedPreviewFpsRange += String8::format("(%d,%d)",
2055                    availableFpsRanges.data.i32[i],
2056                    availableFpsRanges.data.i32[i+1]);
2057        }
2058        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
2059                supportedPreviewFpsRange);
2060    }
2061
2062    k.mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2063    params.set(CameraParameters::KEY_PREVIEW_FORMAT,
2064            formatEnumToString(k.mParameters.previewFormat)); // NV21
2065
2066    k.mParameters.previewTransform = degToTransform(0,
2067            mCameraFacing == CAMERA_FACING_FRONT);
2068
2069    camera_metadata_entry_t availableFormats =
2070        staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
2071
2072    {
2073        String8 supportedPreviewFormats;
2074        bool addComma = false;
2075        for (size_t i=0; i < availableFormats.count; i++) {
2076            if (addComma) supportedPreviewFormats += ",";
2077            addComma = true;
2078            switch (availableFormats.data.i32[i]) {
2079            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
2080                supportedPreviewFormats +=
2081                    CameraParameters::PIXEL_FORMAT_YUV422SP;
2082                break;
2083            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
2084                supportedPreviewFormats +=
2085                    CameraParameters::PIXEL_FORMAT_YUV420SP;
2086                break;
2087            case HAL_PIXEL_FORMAT_YCbCr_422_I:
2088                supportedPreviewFormats +=
2089                    CameraParameters::PIXEL_FORMAT_YUV422I;
2090                break;
2091            case HAL_PIXEL_FORMAT_YV12:
2092                supportedPreviewFormats +=
2093                    CameraParameters::PIXEL_FORMAT_YUV420P;
2094                break;
2095            case HAL_PIXEL_FORMAT_RGB_565:
2096                supportedPreviewFormats +=
2097                    CameraParameters::PIXEL_FORMAT_RGB565;
2098                break;
2099            case HAL_PIXEL_FORMAT_RGBA_8888:
2100                supportedPreviewFormats +=
2101                    CameraParameters::PIXEL_FORMAT_RGBA8888;
2102                break;
2103            // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
2104            case HAL_PIXEL_FORMAT_RAW_SENSOR:
2105            case HAL_PIXEL_FORMAT_BLOB:
2106                addComma = false;
2107                break;
2108
2109            default:
2110                ALOGW("%s: Camera %d: Unknown preview format: %x",
2111                        __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
2112                addComma = false;
2113                break;
2114            }
2115        }
2116        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
2117                supportedPreviewFormats);
2118    }
2119
2120    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
2121    // still have to do something sane for them
2122
2123    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
2124            k.mParameters.previewFpsRange[0]);
2125
2126    {
2127        String8 supportedPreviewFrameRates;
2128        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
2129            if (i != 0) supportedPreviewFrameRates += ",";
2130            supportedPreviewFrameRates += String8::format("%d",
2131                    availableFpsRanges.data.i32[i]);
2132        }
2133        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
2134                supportedPreviewFrameRates);
2135    }
2136
2137    camera_metadata_entry_t availableJpegSizes =
2138        staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
2139    if (!availableJpegSizes.count) return NO_INIT;
2140
2141    // TODO: Pick maximum
2142    k.mParameters.pictureWidth = availableJpegSizes.data.i32[0];
2143    k.mParameters.pictureHeight = availableJpegSizes.data.i32[1];
2144
2145    params.setPictureSize(k.mParameters.pictureWidth,
2146            k.mParameters.pictureHeight);
2147
2148    {
2149        String8 supportedPictureSizes;
2150        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
2151            if (i != 0) supportedPictureSizes += ",";
2152            supportedPictureSizes += String8::format("%dx%d",
2153                    availableJpegSizes.data.i32[i],
2154                    availableJpegSizes.data.i32[i+1]);
2155        }
2156        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
2157                supportedPictureSizes);
2158    }
2159
2160    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
2161    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
2162            CameraParameters::PIXEL_FORMAT_JPEG);
2163
2164    camera_metadata_entry_t availableJpegThumbnailSizes =
2165        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2);
2166    if (!availableJpegThumbnailSizes.count) return NO_INIT;
2167
2168    // TODO: Pick default thumbnail size sensibly
2169    k.mParameters.jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0];
2170    k.mParameters.jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1];
2171
2172    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
2173            k.mParameters.jpegThumbSize[0]);
2174    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
2175            k.mParameters.jpegThumbSize[1]);
2176
2177    {
2178        String8 supportedJpegThumbSizes;
2179        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
2180            if (i != 0) supportedJpegThumbSizes += ",";
2181            supportedJpegThumbSizes += String8::format("%dx%d",
2182                    availableJpegThumbnailSizes.data.i32[i],
2183                    availableJpegThumbnailSizes.data.i32[i+1]);
2184        }
2185        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
2186                supportedJpegThumbSizes);
2187    }
2188
2189    k.mParameters.jpegThumbQuality = 90;
2190    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
2191            k.mParameters.jpegThumbQuality);
2192    k.mParameters.jpegQuality = 90;
2193    params.set(CameraParameters::KEY_JPEG_QUALITY,
2194            k.mParameters.jpegQuality);
2195    k.mParameters.jpegRotation = 0;
2196    params.set(CameraParameters::KEY_ROTATION,
2197            k.mParameters.jpegRotation);
2198
2199    k.mParameters.gpsEnabled = false;
2200    k.mParameters.gpsProcessingMethod = "unknown";
2201    // GPS fields in CameraParameters are not set by implementation
2202
2203    k.mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO;
2204    params.set(CameraParameters::KEY_WHITE_BALANCE,
2205            CameraParameters::WHITE_BALANCE_AUTO);
2206
2207    camera_metadata_entry_t availableWhiteBalanceModes =
2208        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
2209    {
2210        String8 supportedWhiteBalance;
2211        bool addComma = false;
2212        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
2213            if (addComma) supportedWhiteBalance += ",";
2214            addComma = true;
2215            switch (availableWhiteBalanceModes.data.u8[i]) {
2216            case ANDROID_CONTROL_AWB_AUTO:
2217                supportedWhiteBalance +=
2218                    CameraParameters::WHITE_BALANCE_AUTO;
2219                break;
2220            case ANDROID_CONTROL_AWB_INCANDESCENT:
2221                supportedWhiteBalance +=
2222                    CameraParameters::WHITE_BALANCE_INCANDESCENT;
2223                break;
2224            case ANDROID_CONTROL_AWB_FLUORESCENT:
2225                supportedWhiteBalance +=
2226                    CameraParameters::WHITE_BALANCE_FLUORESCENT;
2227                break;
2228            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
2229                supportedWhiteBalance +=
2230                    CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
2231                break;
2232            case ANDROID_CONTROL_AWB_DAYLIGHT:
2233                supportedWhiteBalance +=
2234                    CameraParameters::WHITE_BALANCE_DAYLIGHT;
2235                break;
2236            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
2237                supportedWhiteBalance +=
2238                    CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
2239                break;
2240            case ANDROID_CONTROL_AWB_TWILIGHT:
2241                supportedWhiteBalance +=
2242                    CameraParameters::WHITE_BALANCE_TWILIGHT;
2243                break;
2244            case ANDROID_CONTROL_AWB_SHADE:
2245                supportedWhiteBalance +=
2246                    CameraParameters::WHITE_BALANCE_SHADE;
2247                break;
2248            // Skipping values not mappable to v1 API
2249            case ANDROID_CONTROL_AWB_OFF:
2250                addComma = false;
2251                break;
2252            default:
2253                ALOGW("%s: Camera %d: Unknown white balance value: %d",
2254                        __FUNCTION__, mCameraId,
2255                        availableWhiteBalanceModes.data.u8[i]);
2256                addComma = false;
2257                break;
2258            }
2259        }
2260        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
2261                supportedWhiteBalance);
2262    }
2263
2264    k.mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF;
2265    params.set(CameraParameters::KEY_EFFECT,
2266            CameraParameters::EFFECT_NONE);
2267
2268    camera_metadata_entry_t availableEffects =
2269        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
2270    if (!availableEffects.count) return NO_INIT;
2271    {
2272        String8 supportedEffects;
2273        bool addComma = false;
2274        for (size_t i=0; i < availableEffects.count; i++) {
2275            if (addComma) supportedEffects += ",";
2276            addComma = true;
2277            switch (availableEffects.data.u8[i]) {
2278                case ANDROID_CONTROL_EFFECT_OFF:
2279                    supportedEffects +=
2280                        CameraParameters::EFFECT_NONE;
2281                    break;
2282                case ANDROID_CONTROL_EFFECT_MONO:
2283                    supportedEffects +=
2284                        CameraParameters::EFFECT_MONO;
2285                    break;
2286                case ANDROID_CONTROL_EFFECT_NEGATIVE:
2287                    supportedEffects +=
2288                        CameraParameters::EFFECT_NEGATIVE;
2289                    break;
2290                case ANDROID_CONTROL_EFFECT_SOLARIZE:
2291                    supportedEffects +=
2292                        CameraParameters::EFFECT_SOLARIZE;
2293                    break;
2294                case ANDROID_CONTROL_EFFECT_SEPIA:
2295                    supportedEffects +=
2296                        CameraParameters::EFFECT_SEPIA;
2297                    break;
2298                case ANDROID_CONTROL_EFFECT_POSTERIZE:
2299                    supportedEffects +=
2300                        CameraParameters::EFFECT_POSTERIZE;
2301                    break;
2302                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
2303                    supportedEffects +=
2304                        CameraParameters::EFFECT_WHITEBOARD;
2305                    break;
2306                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
2307                    supportedEffects +=
2308                        CameraParameters::EFFECT_BLACKBOARD;
2309                    break;
2310                case ANDROID_CONTROL_EFFECT_AQUA:
2311                    supportedEffects +=
2312                        CameraParameters::EFFECT_AQUA;
2313                    break;
2314                default:
2315                    ALOGW("%s: Camera %d: Unknown effect value: %d",
2316                        __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
2317                    addComma = false;
2318                    break;
2319            }
2320        }
2321        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
2322    }
2323
2324    k.mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
2325    params.set(CameraParameters::KEY_ANTIBANDING,
2326            CameraParameters::ANTIBANDING_AUTO);
2327
2328    camera_metadata_entry_t availableAntibandingModes =
2329        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
2330    if (!availableAntibandingModes.count) return NO_INIT;
2331    {
2332        String8 supportedAntibanding;
2333        bool addComma = false;
2334        for (size_t i=0; i < availableAntibandingModes.count; i++) {
2335            if (addComma) supportedAntibanding += ",";
2336            addComma = true;
2337            switch (availableAntibandingModes.data.u8[i]) {
2338                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
2339                    supportedAntibanding +=
2340                        CameraParameters::ANTIBANDING_OFF;
2341                    break;
2342                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
2343                    supportedAntibanding +=
2344                        CameraParameters::ANTIBANDING_50HZ;
2345                    break;
2346                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
2347                    supportedAntibanding +=
2348                        CameraParameters::ANTIBANDING_60HZ;
2349                    break;
2350                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
2351                    supportedAntibanding +=
2352                        CameraParameters::ANTIBANDING_AUTO;
2353                    break;
2354                default:
2355                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
2356                        __FUNCTION__, mCameraId,
2357                            availableAntibandingModes.data.u8[i]);
2358                    addComma = false;
2359                    break;
2360            }
2361        }
2362        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
2363                supportedAntibanding);
2364    }
2365
2366    k.mParameters.sceneMode = ANDROID_CONTROL_OFF;
2367    params.set(CameraParameters::KEY_SCENE_MODE,
2368            CameraParameters::SCENE_MODE_AUTO);
2369
2370    camera_metadata_entry_t availableSceneModes =
2371        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
2372    if (!availableSceneModes.count) return NO_INIT;
2373    {
2374        String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
2375        bool addComma = true;
2376        bool noSceneModes = false;
2377        for (size_t i=0; i < availableSceneModes.count; i++) {
2378            if (addComma) supportedSceneModes += ",";
2379            addComma = true;
2380            switch (availableSceneModes.data.u8[i]) {
2381                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
2382                    noSceneModes = true;
2383                    break;
2384                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
2385                    // Not in old API
2386                    addComma = false;
2387                    break;
2388                case ANDROID_CONTROL_SCENE_MODE_ACTION:
2389                    supportedSceneModes +=
2390                        CameraParameters::SCENE_MODE_ACTION;
2391                    break;
2392                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
2393                    supportedSceneModes +=
2394                        CameraParameters::SCENE_MODE_PORTRAIT;
2395                    break;
2396                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
2397                    supportedSceneModes +=
2398                        CameraParameters::SCENE_MODE_LANDSCAPE;
2399                    break;
2400                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
2401                    supportedSceneModes +=
2402                        CameraParameters::SCENE_MODE_NIGHT;
2403                    break;
2404                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
2405                    supportedSceneModes +=
2406                        CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
2407                    break;
2408                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
2409                    supportedSceneModes +=
2410                        CameraParameters::SCENE_MODE_THEATRE;
2411                    break;
2412                case ANDROID_CONTROL_SCENE_MODE_BEACH:
2413                    supportedSceneModes +=
2414                        CameraParameters::SCENE_MODE_BEACH;
2415                    break;
2416                case ANDROID_CONTROL_SCENE_MODE_SNOW:
2417                    supportedSceneModes +=
2418                        CameraParameters::SCENE_MODE_SNOW;
2419                    break;
2420                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
2421                    supportedSceneModes +=
2422                        CameraParameters::SCENE_MODE_SUNSET;
2423                    break;
2424                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
2425                    supportedSceneModes +=
2426                        CameraParameters::SCENE_MODE_STEADYPHOTO;
2427                    break;
2428                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
2429                    supportedSceneModes +=
2430                        CameraParameters::SCENE_MODE_FIREWORKS;
2431                    break;
2432                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
2433                    supportedSceneModes +=
2434                        CameraParameters::SCENE_MODE_SPORTS;
2435                    break;
2436                case ANDROID_CONTROL_SCENE_MODE_PARTY:
2437                    supportedSceneModes +=
2438                        CameraParameters::SCENE_MODE_PARTY;
2439                    break;
2440                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
2441                    supportedSceneModes +=
2442                        CameraParameters::SCENE_MODE_CANDLELIGHT;
2443                    break;
2444                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
2445                    supportedSceneModes +=
2446                        CameraParameters::SCENE_MODE_BARCODE;
2447                    break;
2448                default:
2449                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
2450                        __FUNCTION__, mCameraId,
2451                            availableSceneModes.data.u8[i]);
2452                    addComma = false;
2453                    break;
2454            }
2455        }
2456        if (!noSceneModes) {
2457            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
2458                    supportedSceneModes);
2459        }
2460    }
2461
2462    camera_metadata_entry_t flashAvailable =
2463        staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
2464    if (!flashAvailable.count) return NO_INIT;
2465
2466    camera_metadata_entry_t availableAeModes =
2467        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
2468    if (!availableAeModes.count) return NO_INIT;
2469
2470    if (flashAvailable.data.u8[0]) {
2471        k.mParameters.flashMode = Parameters::FLASH_MODE_AUTO;
2472        params.set(CameraParameters::KEY_FLASH_MODE,
2473                CameraParameters::FLASH_MODE_AUTO);
2474
2475        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
2476        supportedFlashModes = supportedFlashModes +
2477            "," + CameraParameters::FLASH_MODE_AUTO +
2478            "," + CameraParameters::FLASH_MODE_ON +
2479            "," + CameraParameters::FLASH_MODE_TORCH;
2480        for (size_t i=0; i < availableAeModes.count; i++) {
2481            if (availableAeModes.data.u8[i] ==
2482                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
2483                supportedFlashModes = supportedFlashModes + "," +
2484                    CameraParameters::FLASH_MODE_RED_EYE;
2485                break;
2486            }
2487        }
2488        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
2489                supportedFlashModes);
2490    } else {
2491        k.mParameters.flashMode = Parameters::FLASH_MODE_OFF;
2492        params.set(CameraParameters::KEY_FLASH_MODE,
2493                CameraParameters::FLASH_MODE_OFF);
2494        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
2495                CameraParameters::FLASH_MODE_OFF);
2496    }
2497
2498    camera_metadata_entry_t minFocusDistance =
2499        staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
2500    if (!minFocusDistance.count) return NO_INIT;
2501
2502    camera_metadata_entry_t availableAfModes =
2503        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
2504    if (!availableAfModes.count) return NO_INIT;
2505
2506    if (minFocusDistance.data.f[0] == 0) {
2507        // Fixed-focus lens
2508        k.mParameters.focusMode = Parameters::FOCUS_MODE_FIXED;
2509        params.set(CameraParameters::KEY_FOCUS_MODE,
2510                CameraParameters::FOCUS_MODE_FIXED);
2511        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
2512                CameraParameters::FOCUS_MODE_FIXED);
2513    } else {
2514        k.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
2515        params.set(CameraParameters::KEY_FOCUS_MODE,
2516                CameraParameters::FOCUS_MODE_AUTO);
2517        String8 supportedFocusModes(CameraParameters::FOCUS_MODE_INFINITY);
2518        bool addComma = true;
2519
2520        for (size_t i=0; i < availableAfModes.count; i++) {
2521            if (addComma) supportedFocusModes += ",";
2522            addComma = true;
2523            switch (availableAfModes.data.u8[i]) {
2524                case ANDROID_CONTROL_AF_AUTO:
2525                    supportedFocusModes +=
2526                        CameraParameters::FOCUS_MODE_AUTO;
2527                    break;
2528                case ANDROID_CONTROL_AF_MACRO:
2529                    supportedFocusModes +=
2530                        CameraParameters::FOCUS_MODE_MACRO;
2531                    break;
2532                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
2533                    supportedFocusModes +=
2534                        CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
2535                    break;
2536                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
2537                    supportedFocusModes +=
2538                        CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
2539                    break;
2540                case ANDROID_CONTROL_AF_EDOF:
2541                    supportedFocusModes +=
2542                        CameraParameters::FOCUS_MODE_EDOF;
2543                    break;
2544                // Not supported in old API
2545                case ANDROID_CONTROL_AF_OFF:
2546                    addComma = false;
2547                    break;
2548                default:
2549                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
2550                        __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
2551                    addComma = false;
2552                    break;
2553            }
2554        }
2555        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
2556                supportedFocusModes);
2557    }
2558
2559    camera_metadata_entry_t max3aRegions =
2560        staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
2561    if (!max3aRegions.count) return NO_INIT;
2562
2563    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
2564            max3aRegions.data.i32[0]);
2565    params.set(CameraParameters::KEY_FOCUS_AREAS,
2566            "(0,0,0,0,0)");
2567    k.mParameters.focusingAreas.clear();
2568    k.mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0));
2569
2570    camera_metadata_entry_t availableFocalLengths =
2571        staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
2572    if (!availableFocalLengths.count) return NO_INIT;
2573
2574    float minFocalLength = availableFocalLengths.data.f[0];
2575    params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
2576
2577    camera_metadata_entry_t sensorSize =
2578        staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
2579    if (!sensorSize.count) return NO_INIT;
2580
2581    // The fields of view here assume infinity focus, maximum wide angle
2582    float horizFov = 180 / M_PI *
2583            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
2584    float vertFov  = 180 / M_PI *
2585            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
2586    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
2587    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
2588
2589    k.mParameters.exposureCompensation = 0;
2590    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
2591                k.mParameters.exposureCompensation);
2592
2593    camera_metadata_entry_t exposureCompensationRange =
2594        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
2595    if (!exposureCompensationRange.count) return NO_INIT;
2596
2597    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
2598            exposureCompensationRange.data.i32[1]);
2599    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
2600            exposureCompensationRange.data.i32[0]);
2601
2602    camera_metadata_entry_t exposureCompensationStep =
2603        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
2604    if (!exposureCompensationStep.count) return NO_INIT;
2605
2606    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
2607            (float)exposureCompensationStep.data.r[0].numerator /
2608            exposureCompensationStep.data.r[0].denominator);
2609
2610    k.mParameters.autoExposureLock = false;
2611    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
2612            CameraParameters::FALSE);
2613    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
2614            CameraParameters::TRUE);
2615
2616    k.mParameters.autoWhiteBalanceLock = false;
2617    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
2618            CameraParameters::FALSE);
2619    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
2620            CameraParameters::TRUE);
2621
2622    k.mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
2623    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
2624            max3aRegions.data.i32[0]);
2625    params.set(CameraParameters::KEY_METERING_AREAS,
2626            "(0,0,0,0,0)");
2627
2628    k.mParameters.zoom = 0;
2629    params.set(CameraParameters::KEY_ZOOM, k.mParameters.zoom);
2630    params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
2631
2632    camera_metadata_entry_t maxDigitalZoom =
2633        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
2634    if (!maxDigitalZoom.count) return NO_INIT;
2635
2636    {
2637        String8 zoomRatios;
2638        float zoom = 1.f;
2639        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
2640                (NUM_ZOOM_STEPS-1);
2641        bool addComma = false;
2642        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
2643            if (addComma) zoomRatios += ",";
2644            addComma = true;
2645            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
2646            zoom += zoomIncrement;
2647        }
2648        params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
2649    }
2650
2651    params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
2652            CameraParameters::TRUE);
2653    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
2654            CameraParameters::TRUE);
2655
2656    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
2657            "Infinity,Infinity,Infinity");
2658
2659    camera_metadata_entry_t maxFacesDetected =
2660        staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
2661    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
2662            maxFacesDetected.data.i32[0]);
2663    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
2664            0);
2665
2666    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
2667            CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE);
2668
2669    params.set(CameraParameters::KEY_RECORDING_HINT,
2670            CameraParameters::FALSE);
2671
2672    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
2673            CameraParameters::TRUE);
2674
2675    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
2676            CameraParameters::FALSE);
2677
2678    camera_metadata_entry_t availableVideoStabilizationModes =
2679        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
2680    if (!availableVideoStabilizationModes.count) return NO_INIT;
2681
2682    if (availableVideoStabilizationModes.count > 1) {
2683        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
2684                CameraParameters::TRUE);
2685    } else {
2686        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
2687                CameraParameters::FALSE);
2688    }
2689
2690    // Set up initial state for non-Camera.Parameters state variables
2691
2692    k.mParameters.storeMetadataInBuffers = true;
2693    k.mParameters.playShutterSound = true;
2694    k.mParameters.afTriggerCounter = 0;
2695    k.mParameters.currentAfTriggerId = -1;
2696
2697    k.mParameters.paramsFlattened = params.flatten();
2698
2699    return OK;
2700}
2701
2702status_t Camera2Client::updatePreviewStream(const Parameters &params) {
2703    ATRACE_CALL();
2704    status_t res;
2705
2706    if (mPreviewStreamId != NO_STREAM) {
2707        // Check if stream parameters have to change
2708        uint32_t currentWidth, currentHeight;
2709        res = mDevice->getStreamInfo(mPreviewStreamId,
2710                &currentWidth, &currentHeight, 0);
2711        if (res != OK) {
2712            ALOGE("%s: Camera %d: Error querying preview stream info: "
2713                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2714            return res;
2715        }
2716        if (currentWidth != (uint32_t)params.previewWidth ||
2717                currentHeight != (uint32_t)params.previewHeight) {
2718            ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
2719                    __FUNCTION__, mCameraId, currentWidth, currentHeight,
2720                    params.previewWidth, params.previewHeight);
2721            res = mDevice->waitUntilDrained();
2722            if (res != OK) {
2723                ALOGE("%s: Camera %d: Error waiting for preview to drain: "
2724                        "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2725                return res;
2726            }
2727            res = mDevice->deleteStream(mPreviewStreamId);
2728            if (res != OK) {
2729                ALOGE("%s: Camera %d: Unable to delete old output stream "
2730                        "for preview: %s (%d)", __FUNCTION__, mCameraId,
2731                        strerror(-res), res);
2732                return res;
2733            }
2734            mPreviewStreamId = NO_STREAM;
2735        }
2736    }
2737
2738    if (mPreviewStreamId == NO_STREAM) {
2739        res = mDevice->createStream(mPreviewWindow,
2740                params.previewWidth, params.previewHeight,
2741                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
2742                &mPreviewStreamId);
2743        if (res != OK) {
2744            ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
2745                    __FUNCTION__, mCameraId, strerror(-res), res);
2746            return res;
2747        }
2748    }
2749
2750    res = mDevice->setStreamTransform(mPreviewStreamId,
2751            params.previewTransform);
2752    if (res != OK) {
2753        ALOGE("%s: Camera %d: Unable to set preview stream transform: "
2754                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2755        return res;
2756    }
2757
2758    return OK;
2759}
2760
2761status_t Camera2Client::updatePreviewRequest(const Parameters &params) {
2762    ATRACE_CALL();
2763    status_t res;
2764    if (mPreviewRequest == NULL) {
2765        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
2766                &mPreviewRequest);
2767        if (res != OK) {
2768            ALOGE("%s: Camera %d: Unable to create default preview request: "
2769                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2770            return res;
2771        }
2772    }
2773
2774    res = updateRequestCommon(mPreviewRequest, params);
2775    if (res != OK) {
2776        ALOGE("%s: Camera %d: Unable to update common entries of preview "
2777                "request: %s (%d)", __FUNCTION__, mCameraId,
2778                strerror(-res), res);
2779        return res;
2780    }
2781
2782    return OK;
2783}
2784
2785status_t Camera2Client::updateCaptureStream(const Parameters &params) {
2786    ATRACE_CALL();
2787    status_t res;
2788    // Find out buffer size for JPEG
2789    camera_metadata_entry_t maxJpegSize =
2790            staticInfo(ANDROID_JPEG_MAX_SIZE);
2791    if (maxJpegSize.count == 0) {
2792        ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!",
2793                __FUNCTION__, mCameraId);
2794        return INVALID_OPERATION;
2795    }
2796
2797    if (mCaptureConsumer == 0) {
2798        // Create CPU buffer queue endpoint
2799        mCaptureConsumer = new CpuConsumer(1);
2800        mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this));
2801        mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer"));
2802        mCaptureWindow = new SurfaceTextureClient(
2803            mCaptureConsumer->getProducerInterface());
2804        // Create memory for API consumption
2805        mCaptureHeap = new Camera2Heap(maxJpegSize.data.i32[0], 1,
2806                                       "Camera2Client::CaptureHeap");
2807        if (mCaptureHeap->mHeap->getSize() == 0) {
2808            ALOGE("%s: Camera %d: Unable to allocate memory for capture",
2809                    __FUNCTION__, mCameraId);
2810            return NO_MEMORY;
2811        }
2812    }
2813
2814    if (mCaptureStreamId != NO_STREAM) {
2815        // Check if stream parameters have to change
2816        uint32_t currentWidth, currentHeight;
2817        res = mDevice->getStreamInfo(mCaptureStreamId,
2818                &currentWidth, &currentHeight, 0);
2819        if (res != OK) {
2820            ALOGE("%s: Camera %d: Error querying capture output stream info: "
2821                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2822            return res;
2823        }
2824        if (currentWidth != (uint32_t)params.pictureWidth ||
2825                currentHeight != (uint32_t)params.pictureHeight) {
2826            res = mDevice->deleteStream(mCaptureStreamId);
2827            if (res != OK) {
2828                ALOGE("%s: Camera %d: Unable to delete old output stream "
2829                        "for capture: %s (%d)", __FUNCTION__, mCameraId,
2830                        strerror(-res), res);
2831                return res;
2832            }
2833            mCaptureStreamId = NO_STREAM;
2834        }
2835    }
2836
2837    if (mCaptureStreamId == NO_STREAM) {
2838        // Create stream for HAL production
2839        res = mDevice->createStream(mCaptureWindow,
2840                params.pictureWidth, params.pictureHeight,
2841                HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0],
2842                &mCaptureStreamId);
2843        if (res != OK) {
2844            ALOGE("%s: Camera %d: Can't create output stream for capture: "
2845                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2846            return res;
2847        }
2848
2849    }
2850    return OK;
2851}
2852
2853status_t Camera2Client::updateCaptureRequest(const Parameters &params) {
2854    ATRACE_CALL();
2855    status_t res;
2856    if (mCaptureRequest == NULL) {
2857        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE,
2858                &mCaptureRequest);
2859        if (res != OK) {
2860            ALOGE("%s: Camera %d: Unable to create default still image request:"
2861                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2862            return res;
2863        }
2864    }
2865
2866    res = updateRequestCommon(mCaptureRequest, params);
2867    if (res != OK) {
2868        ALOGE("%s: Camera %d: Unable to update common entries of capture "
2869                "request: %s (%d)", __FUNCTION__, mCameraId,
2870                strerror(-res), res);
2871        return res;
2872    }
2873
2874    res = updateEntry(mCaptureRequest,
2875            ANDROID_JPEG_THUMBNAIL_SIZE,
2876            params.jpegThumbSize, 2);
2877    if (res != OK) return res;
2878    res = updateEntry(mCaptureRequest,
2879            ANDROID_JPEG_THUMBNAIL_QUALITY,
2880            &params.jpegThumbQuality, 1);
2881    if (res != OK) return res;
2882    res = updateEntry(mCaptureRequest,
2883            ANDROID_JPEG_QUALITY,
2884            &params.jpegQuality, 1);
2885    if (res != OK) return res;
2886    res = updateEntry(mCaptureRequest,
2887            ANDROID_JPEG_ORIENTATION,
2888            &params.jpegRotation, 1);
2889    if (res != OK) return res;
2890
2891    if (params.gpsEnabled) {
2892        res = updateEntry(mCaptureRequest,
2893                ANDROID_JPEG_GPS_COORDINATES,
2894                params.gpsCoordinates, 3);
2895        if (res != OK) return res;
2896        res = updateEntry(mCaptureRequest,
2897                ANDROID_JPEG_GPS_TIMESTAMP,
2898                &params.gpsTimestamp, 1);
2899        if (res != OK) return res;
2900        res = updateEntry(mCaptureRequest,
2901                ANDROID_JPEG_GPS_PROCESSING_METHOD,
2902                params.gpsProcessingMethod.string(),
2903                params.gpsProcessingMethod.size());
2904        if (res != OK) return res;
2905    } else {
2906        res = deleteEntry(mCaptureRequest,
2907                ANDROID_JPEG_GPS_COORDINATES);
2908        if (res != OK) return res;
2909        res = deleteEntry(mCaptureRequest,
2910                ANDROID_JPEG_GPS_TIMESTAMP);
2911        if (res != OK) return res;
2912        res = deleteEntry(mCaptureRequest,
2913                ANDROID_JPEG_GPS_PROCESSING_METHOD);
2914        if (res != OK) return res;
2915    }
2916
2917    return OK;
2918}
2919
2920status_t Camera2Client::updateRecordingRequest(const Parameters &params) {
2921    ATRACE_CALL();
2922    status_t res;
2923    if (mRecordingRequest == NULL) {
2924        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
2925                &mRecordingRequest);
2926        if (res != OK) {
2927            ALOGE("%s: Camera %d: Unable to create default recording request:"
2928                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2929            return res;
2930        }
2931    }
2932
2933    res = updateRequestCommon(mRecordingRequest, params);
2934    if (res != OK) {
2935        ALOGE("%s: Camera %d: Unable to update common entries of recording "
2936                "request: %s (%d)", __FUNCTION__, mCameraId,
2937                strerror(-res), res);
2938        return res;
2939    }
2940
2941    return OK;
2942}
2943
2944status_t Camera2Client::updateRecordingStream(const Parameters &params) {
2945    status_t res;
2946
2947    if (mRecordingConsumer == 0) {
2948        // Create CPU buffer queue endpoint
2949        mRecordingConsumer = new MediaConsumer(mRecordingHeapCount);
2950        mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
2951        mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
2952        mRecordingWindow = new SurfaceTextureClient(
2953            mRecordingConsumer->getProducerInterface());
2954        // Allocate memory later, since we don't know buffer size until receipt
2955    }
2956
2957    if (mRecordingStreamId != NO_STREAM) {
2958        // Check if stream parameters have to change
2959        uint32_t currentWidth, currentHeight;
2960        res = mDevice->getStreamInfo(mRecordingStreamId,
2961                &currentWidth, &currentHeight, 0);
2962        if (res != OK) {
2963            ALOGE("%s: Camera %d: Error querying recording output stream info: "
2964                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2965            return res;
2966        }
2967        if (currentWidth != (uint32_t)params.videoWidth ||
2968                currentHeight != (uint32_t)params.videoHeight) {
2969            // TODO: Should wait to be sure previous recording has finished
2970            res = mDevice->deleteStream(mRecordingStreamId);
2971            if (res != OK) {
2972                ALOGE("%s: Camera %d: Unable to delete old output stream "
2973                        "for recording: %s (%d)", __FUNCTION__, mCameraId,
2974                        strerror(-res), res);
2975                return res;
2976            }
2977            mRecordingStreamId = NO_STREAM;
2978        }
2979    }
2980
2981    if (mRecordingStreamId == NO_STREAM) {
2982        res = mDevice->createStream(mRecordingWindow,
2983                params.videoWidth, params.videoHeight,
2984                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId);
2985        if (res != OK) {
2986            ALOGE("%s: Camera %d: Can't create output stream for recording: "
2987                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2988            return res;
2989        }
2990    }
2991
2992    return OK;
2993}
2994
2995status_t Camera2Client::updateRequestCommon(camera_metadata_t *request,
2996        const Parameters &params) {
2997    ATRACE_CALL();
2998    status_t res;
2999    res = updateEntry(request,
3000            ANDROID_CONTROL_AE_TARGET_FPS_RANGE, params.previewFpsRange, 2);
3001    if (res != OK) return res;
3002
3003    uint8_t wbMode = params.autoWhiteBalanceLock ?
3004            ANDROID_CONTROL_AWB_LOCKED : params.wbMode;
3005    res = updateEntry(request,
3006            ANDROID_CONTROL_AWB_MODE, &wbMode, 1);
3007    if (res != OK) return res;
3008    res = updateEntry(request,
3009            ANDROID_CONTROL_EFFECT_MODE, &params.effectMode, 1);
3010    if (res != OK) return res;
3011    res = updateEntry(request,
3012            ANDROID_CONTROL_AE_ANTIBANDING_MODE,
3013            &params.antibandingMode, 1);
3014    if (res != OK) return res;
3015
3016    uint8_t controlMode =
3017            (params.sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ?
3018            ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE;
3019    res = updateEntry(request,
3020            ANDROID_CONTROL_MODE, &controlMode, 1);
3021    if (res != OK) return res;
3022    if (controlMode == ANDROID_CONTROL_USE_SCENE_MODE) {
3023        res = updateEntry(request,
3024                ANDROID_CONTROL_SCENE_MODE,
3025                &params.sceneMode, 1);
3026        if (res != OK) return res;
3027    }
3028
3029    uint8_t flashMode = ANDROID_FLASH_OFF;
3030    uint8_t aeMode;
3031    switch (params.flashMode) {
3032        case Parameters::FLASH_MODE_OFF:
3033            aeMode = ANDROID_CONTROL_AE_ON; break;
3034        case Parameters::FLASH_MODE_AUTO:
3035            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break;
3036        case Parameters::FLASH_MODE_ON:
3037            aeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break;
3038        case Parameters::FLASH_MODE_TORCH:
3039            aeMode = ANDROID_CONTROL_AE_ON;
3040            flashMode = ANDROID_FLASH_TORCH;
3041            break;
3042        case Parameters::FLASH_MODE_RED_EYE:
3043            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break;
3044        default:
3045            ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__,
3046                    mCameraId, params.flashMode);
3047            return BAD_VALUE;
3048    }
3049    if (params.autoExposureLock) aeMode = ANDROID_CONTROL_AE_LOCKED;
3050
3051    res = updateEntry(request,
3052            ANDROID_FLASH_MODE, &flashMode, 1);
3053    if (res != OK) return res;
3054    res = updateEntry(request,
3055            ANDROID_CONTROL_AE_MODE, &aeMode, 1);
3056    if (res != OK) return res;
3057
3058    float focusDistance = 0; // infinity focus in diopters
3059    uint8_t focusMode;
3060    switch (params.focusMode) {
3061        case Parameters::FOCUS_MODE_AUTO:
3062        case Parameters::FOCUS_MODE_MACRO:
3063        case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
3064        case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
3065        case Parameters::FOCUS_MODE_EDOF:
3066            focusMode = params.focusMode;
3067            break;
3068        case Parameters::FOCUS_MODE_INFINITY:
3069        case Parameters::FOCUS_MODE_FIXED:
3070            focusMode = ANDROID_CONTROL_AF_OFF;
3071            break;
3072        default:
3073            ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__,
3074                    mCameraId, params.focusMode);
3075            return BAD_VALUE;
3076    }
3077    res = updateEntry(request,
3078            ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1);
3079    if (res != OK) return res;
3080    res = updateEntry(request,
3081            ANDROID_CONTROL_AF_MODE, &focusMode, 1);
3082    if (res != OK) return res;
3083
3084    size_t focusingAreasSize = params.focusingAreas.size() * 5;
3085    int32_t *focusingAreas = new int32_t[focusingAreasSize];
3086    for (size_t i = 0; i < focusingAreasSize; i += 5) {
3087        focusingAreas[i + 0] = params.focusingAreas[i].left;
3088        focusingAreas[i + 1] = params.focusingAreas[i].top;
3089        focusingAreas[i + 2] = params.focusingAreas[i].right;
3090        focusingAreas[i + 3] = params.focusingAreas[i].bottom;
3091        focusingAreas[i + 4] = params.focusingAreas[i].weight;
3092    }
3093    res = updateEntry(request,
3094            ANDROID_CONTROL_AF_REGIONS, focusingAreas,focusingAreasSize);
3095    if (res != OK) return res;
3096    delete[] focusingAreas;
3097
3098    res = updateEntry(request,
3099            ANDROID_CONTROL_AE_EXP_COMPENSATION,
3100            &params.exposureCompensation, 1);
3101    if (res != OK) return res;
3102
3103    size_t meteringAreasSize = params.meteringAreas.size() * 5;
3104    int32_t *meteringAreas = new int32_t[meteringAreasSize];
3105    for (size_t i = 0; i < meteringAreasSize; i += 5) {
3106        meteringAreas[i + 0] = params.meteringAreas[i].left;
3107        meteringAreas[i + 1] = params.meteringAreas[i].top;
3108        meteringAreas[i + 2] = params.meteringAreas[i].right;
3109        meteringAreas[i + 3] = params.meteringAreas[i].bottom;
3110        meteringAreas[i + 4] = params.meteringAreas[i].weight;
3111    }
3112    res = updateEntry(request,
3113            ANDROID_CONTROL_AE_REGIONS, meteringAreas, meteringAreasSize);
3114    if (res != OK) return res;
3115
3116    res = updateEntry(request,
3117            ANDROID_CONTROL_AWB_REGIONS, meteringAreas, meteringAreasSize);
3118    if (res != OK) return res;
3119    delete[] meteringAreas;
3120
3121    // Need to convert zoom index into a crop rectangle. The rectangle is
3122    // chosen to maximize its area on the sensor
3123
3124    camera_metadata_entry_t maxDigitalZoom =
3125            staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM);
3126    float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) /
3127            (NUM_ZOOM_STEPS-1);
3128    float zoomRatio = 1 + zoomIncrement * params.zoom;
3129
3130    camera_metadata_entry_t activePixelArraySize =
3131            staticInfo(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2, 2);
3132    int32_t arrayWidth = activePixelArraySize.data.i32[0];
3133    int32_t arrayHeight = activePixelArraySize.data.i32[1];
3134    float zoomLeft, zoomTop, zoomWidth, zoomHeight;
3135    if (params.previewWidth >= params.previewHeight) {
3136        zoomWidth =  arrayWidth / zoomRatio;
3137        zoomHeight = zoomWidth *
3138                params.previewHeight / params.previewWidth;
3139    } else {
3140        zoomHeight = arrayHeight / zoomRatio;
3141        zoomWidth = zoomHeight *
3142                params.previewWidth / params.previewHeight;
3143    }
3144    zoomLeft = (arrayWidth - zoomWidth) / 2;
3145    zoomTop = (arrayHeight - zoomHeight) / 2;
3146
3147    int32_t cropRegion[3] = { zoomLeft, zoomTop, zoomWidth };
3148    res = updateEntry(request,
3149            ANDROID_SCALER_CROP_REGION, cropRegion, 3);
3150    if (res != OK) return res;
3151
3152    // TODO: Decide how to map recordingHint, or whether just to ignore it
3153
3154    uint8_t vstabMode = params.videoStabilization ?
3155            ANDROID_CONTROL_VIDEO_STABILIZATION_ON :
3156            ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
3157    res = updateEntry(request,
3158            ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
3159            &vstabMode, 1);
3160    if (res != OK) return res;
3161
3162    return OK;
3163}
3164
3165status_t Camera2Client::updateEntry(camera_metadata_t *buffer,
3166        uint32_t tag, const void *data, size_t data_count) {
3167    camera_metadata_entry_t entry;
3168    status_t res;
3169    res = find_camera_metadata_entry(buffer, tag, &entry);
3170    if (res == NAME_NOT_FOUND) {
3171        res = add_camera_metadata_entry(buffer,
3172                tag, data, data_count);
3173    } else if (res == OK) {
3174        res = update_camera_metadata_entry(buffer,
3175                entry.index, data, data_count, NULL);
3176    }
3177
3178    if (res != OK) {
3179        ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)",
3180                __FUNCTION__, get_camera_metadata_section_name(tag),
3181                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
3182    }
3183    return res;
3184}
3185
3186status_t Camera2Client::deleteEntry(camera_metadata_t *buffer, uint32_t tag) {
3187    camera_metadata_entry_t entry;
3188    status_t res;
3189    res = find_camera_metadata_entry(buffer, tag, &entry);
3190    if (res == NAME_NOT_FOUND) {
3191        return OK;
3192    } else if (res != OK) {
3193        ALOGE("%s: Error looking for entry %s.%s (%x): %s %d",
3194                __FUNCTION__,
3195                get_camera_metadata_section_name(tag),
3196                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
3197        return res;
3198    }
3199    res = delete_camera_metadata_entry(buffer, entry.index);
3200    if (res != OK) {
3201        ALOGE("%s: Error deleting entry %s.%s (%x): %s %d",
3202                __FUNCTION__,
3203                get_camera_metadata_section_name(tag),
3204                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
3205    }
3206    return res;
3207}
3208
3209int Camera2Client::formatStringToEnum(const char *format) {
3210    return
3211        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ?
3212            HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
3213        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ?
3214            HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
3215        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ?
3216            HAL_PIXEL_FORMAT_YCbCr_422_I :  // YUY2
3217        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ?
3218            HAL_PIXEL_FORMAT_YV12 :         // YV12
3219        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ?
3220            HAL_PIXEL_FORMAT_RGB_565 :      // RGB565
3221        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ?
3222            HAL_PIXEL_FORMAT_RGBA_8888 :    // RGB8888
3223        !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ?
3224            HAL_PIXEL_FORMAT_RAW_SENSOR :   // Raw sensor data
3225        -1;
3226}
3227
3228const char* Camera2Client::formatEnumToString(int format) {
3229    const char *fmt;
3230    switch(format) {
3231        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
3232            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
3233            break;
3234        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
3235            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
3236            break;
3237        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
3238            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
3239            break;
3240        case HAL_PIXEL_FORMAT_YV12:        // YV12
3241            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
3242            break;
3243        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
3244            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
3245            break;
3246        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
3247            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
3248            break;
3249        case HAL_PIXEL_FORMAT_RAW_SENSOR:
3250            ALOGW("Raw sensor preview format requested.");
3251            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
3252            break;
3253        default:
3254            ALOGE("%s: Unknown preview format: %x",
3255                    __FUNCTION__,  format);
3256            fmt = NULL;
3257            break;
3258    }
3259    return fmt;
3260}
3261
3262int Camera2Client::wbModeStringToEnum(const char *wbMode) {
3263    return
3264        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
3265            ANDROID_CONTROL_AWB_AUTO :
3266        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
3267            ANDROID_CONTROL_AWB_INCANDESCENT :
3268        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
3269            ANDROID_CONTROL_AWB_FLUORESCENT :
3270        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
3271            ANDROID_CONTROL_AWB_WARM_FLUORESCENT :
3272        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
3273            ANDROID_CONTROL_AWB_DAYLIGHT :
3274        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
3275            ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT :
3276        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
3277            ANDROID_CONTROL_AWB_TWILIGHT :
3278        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
3279            ANDROID_CONTROL_AWB_SHADE :
3280        -1;
3281}
3282
3283int Camera2Client::effectModeStringToEnum(const char *effectMode) {
3284    return
3285        !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
3286            ANDROID_CONTROL_EFFECT_OFF :
3287        !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
3288            ANDROID_CONTROL_EFFECT_MONO :
3289        !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
3290            ANDROID_CONTROL_EFFECT_NEGATIVE :
3291        !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
3292            ANDROID_CONTROL_EFFECT_SOLARIZE :
3293        !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
3294            ANDROID_CONTROL_EFFECT_SEPIA :
3295        !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
3296            ANDROID_CONTROL_EFFECT_POSTERIZE :
3297        !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
3298            ANDROID_CONTROL_EFFECT_WHITEBOARD :
3299        !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
3300            ANDROID_CONTROL_EFFECT_BLACKBOARD :
3301        !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
3302            ANDROID_CONTROL_EFFECT_AQUA :
3303        -1;
3304}
3305
3306int Camera2Client::abModeStringToEnum(const char *abMode) {
3307    return
3308        !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
3309            ANDROID_CONTROL_AE_ANTIBANDING_AUTO :
3310        !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
3311            ANDROID_CONTROL_AE_ANTIBANDING_OFF :
3312        !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
3313            ANDROID_CONTROL_AE_ANTIBANDING_50HZ :
3314        !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
3315            ANDROID_CONTROL_AE_ANTIBANDING_60HZ :
3316        -1;
3317}
3318
3319int Camera2Client::sceneModeStringToEnum(const char *sceneMode) {
3320    return
3321        !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
3322            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
3323        !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
3324            ANDROID_CONTROL_SCENE_MODE_ACTION :
3325        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
3326            ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
3327        !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
3328            ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
3329        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
3330            ANDROID_CONTROL_SCENE_MODE_NIGHT :
3331        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
3332            ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
3333        !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
3334            ANDROID_CONTROL_SCENE_MODE_THEATRE :
3335        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
3336            ANDROID_CONTROL_SCENE_MODE_BEACH :
3337        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
3338            ANDROID_CONTROL_SCENE_MODE_SNOW :
3339        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
3340            ANDROID_CONTROL_SCENE_MODE_SUNSET :
3341        !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
3342            ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
3343        !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
3344            ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
3345        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
3346            ANDROID_CONTROL_SCENE_MODE_SPORTS :
3347        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
3348            ANDROID_CONTROL_SCENE_MODE_PARTY :
3349        !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
3350            ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
3351        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
3352            ANDROID_CONTROL_SCENE_MODE_BARCODE:
3353        -1;
3354}
3355
3356Camera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum(
3357        const char *flashMode) {
3358    return
3359        !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
3360            Parameters::FLASH_MODE_OFF :
3361        !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
3362            Parameters::FLASH_MODE_AUTO :
3363        !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
3364            Parameters::FLASH_MODE_ON :
3365        !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
3366            Parameters::FLASH_MODE_RED_EYE :
3367        !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
3368            Parameters::FLASH_MODE_TORCH :
3369        Parameters::FLASH_MODE_INVALID;
3370}
3371
3372Camera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum(
3373        const char *focusMode) {
3374    return
3375        !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
3376            Parameters::FOCUS_MODE_AUTO :
3377        !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
3378            Parameters::FOCUS_MODE_INFINITY :
3379        !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
3380            Parameters::FOCUS_MODE_MACRO :
3381        !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
3382            Parameters::FOCUS_MODE_FIXED :
3383        !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
3384            Parameters::FOCUS_MODE_EDOF :
3385        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
3386            Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
3387        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
3388            Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
3389        Parameters::FOCUS_MODE_INVALID;
3390}
3391
3392status_t Camera2Client::parseAreas(const char *areasCStr,
3393        Vector<Parameters::Area> *areas) {
3394    static const size_t NUM_FIELDS = 5;
3395    areas->clear();
3396    if (areasCStr == NULL) {
3397        // If no key exists, use default (0,0,0,0,0)
3398        areas->push();
3399        return OK;
3400    }
3401    String8 areasStr(areasCStr);
3402    ssize_t areaStart = areasStr.find("(", 0) + 1;
3403    while (areaStart != 0) {
3404        const char* area = areasStr.string() + areaStart;
3405        char *numEnd;
3406        int vals[NUM_FIELDS];
3407        for (size_t i = 0; i < NUM_FIELDS; i++) {
3408            errno = 0;
3409            vals[i] = strtol(area, &numEnd, 10);
3410            if (errno || numEnd == area) return BAD_VALUE;
3411            area = numEnd + 1;
3412        }
3413        areas->push(Parameters::Area(
3414            vals[0], vals[1], vals[2], vals[3], vals[4]) );
3415        areaStart = areasStr.find("(", areaStart) + 1;
3416    }
3417    return OK;
3418}
3419
3420status_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas,
3421                                      size_t maxRegions) {
3422    // Definition of valid area can be found in
3423    // include/camera/CameraParameters.h
3424    if (areas.size() == 0) return BAD_VALUE;
3425    if (areas.size() == 1) {
3426        if (areas[0].left == 0 &&
3427                areas[0].top == 0 &&
3428                areas[0].right == 0 &&
3429                areas[0].bottom == 0 &&
3430                areas[0].weight == 0) {
3431            // Single (0,0,0,0,0) entry is always valid (== driver decides)
3432            return OK;
3433        }
3434    }
3435    if (areas.size() > maxRegions) {
3436        ALOGE("%s: Too many areas requested: %d",
3437                __FUNCTION__, areas.size());
3438        return BAD_VALUE;
3439    }
3440
3441    for (Vector<Parameters::Area>::const_iterator a = areas.begin();
3442         a != areas.end(); a++) {
3443        if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
3444        if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
3445        if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
3446        if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
3447        if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
3448        if (a->left >= a->right) return BAD_VALUE;
3449        if (a->top >= a->bottom) return BAD_VALUE;
3450    }
3451    return OK;
3452}
3453
3454bool Camera2Client::boolFromString(const char *boolStr) {
3455    return !boolStr ? false :
3456        !strcmp(boolStr, CameraParameters::TRUE) ? true :
3457        false;
3458}
3459
3460int Camera2Client::degToTransform(int degrees, bool mirror) {
3461    if (!mirror) {
3462        if (degrees == 0) return 0;
3463        else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
3464        else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
3465        else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
3466    } else {  // Do mirror (horizontal flip)
3467        if (degrees == 0) {           // FLIP_H and ROT_0
3468            return HAL_TRANSFORM_FLIP_H;
3469        } else if (degrees == 90) {   // FLIP_H and ROT_90
3470            return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
3471        } else if (degrees == 180) {  // FLIP_H and ROT_180
3472            return HAL_TRANSFORM_FLIP_V;
3473        } else if (degrees == 270) {  // FLIP_H and ROT_270
3474            return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
3475        }
3476    }
3477    ALOGE("%s: Bad input: %d", __FUNCTION__, degrees);
3478    return -1;
3479}
3480
3481} // namespace android
3482