Camera2Client.cpp revision 22d58d37db6b5f48a10b3a19f69ffda09943c125
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 "Camera2"
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 "camera2/Parameters.h"
28#include "Camera2Client.h"
29
30#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
31#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
32
33namespace android {
34using namespace camera2;
35
36static int getCallingPid() {
37    return IPCThreadState::self()->getCallingPid();
38}
39
40static int getCallingUid() {
41    return IPCThreadState::self()->getCallingUid();
42}
43
44// Interface used by CameraService
45
46Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
47        const sp<ICameraClient>& cameraClient,
48        int cameraId,
49        int cameraFacing,
50        int clientPid):
51        Client(cameraService, cameraClient,
52                cameraId, cameraFacing, clientPid),
53        mSharedCameraClient(cameraClient),
54        mParameters(cameraId, cameraFacing)
55{
56    ATRACE_CALL();
57    ALOGI("Camera %d: Opened", cameraId);
58
59    mDevice = new Camera2Device(cameraId);
60
61    SharedParameters::Lock l(mParameters);
62    l.mParameters.state = Parameters::DISCONNECTED;
63}
64
65status_t Camera2Client::checkPid(const char* checkLocation) const {
66    int callingPid = getCallingPid();
67    if (callingPid == mClientPid) return NO_ERROR;
68
69    ALOGE("%s: attempt to use a locked camera from a different process"
70            " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
71    return PERMISSION_DENIED;
72}
73
74status_t Camera2Client::initialize(camera_module_t *module)
75{
76    ATRACE_CALL();
77    ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
78    status_t res;
79
80    res = mDevice->initialize(module);
81    if (res != OK) {
82        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
83                __FUNCTION__, mCameraId, strerror(-res), res);
84        return NO_INIT;
85    }
86
87    res = mDevice->setNotifyCallback(this);
88
89    SharedParameters::Lock l(mParameters);
90
91    res = l.mParameters.initialize(&(mDevice->info()));
92    if (res != OK) {
93        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
94                __FUNCTION__, mCameraId, strerror(-res), res);
95        return NO_INIT;
96    }
97
98    String8 threadName;
99
100    mStreamingProcessor = new StreamingProcessor(this);
101
102    mFrameProcessor = new FrameProcessor(this);
103    threadName = String8::format("C2-%d-FrameProc",
104            mCameraId);
105    mFrameProcessor->run(threadName.string());
106
107    mCaptureSequencer = new CaptureSequencer(this);
108    threadName = String8::format("C2-%d-CaptureSeq",
109            mCameraId);
110    mCaptureSequencer->run(threadName.string());
111
112    mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
113    threadName = String8::format("C2-%d-JpegProc",
114            mCameraId);
115    mJpegProcessor->run(threadName.string());
116
117    mZslProcessor = new ZslProcessor(this, mCaptureSequencer);
118    threadName = String8::format("C2-%d-ZslProc",
119            mCameraId);
120    mZslProcessor->run(threadName.string());
121
122    mCallbackProcessor = new CallbackProcessor(this);
123    threadName = String8::format("C2-%d-CallbkProc",
124            mCameraId);
125    mCallbackProcessor->run(threadName.string());
126
127    if (gLogLevel >= 1) {
128        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
129              mCameraId);
130        ALOGD("%s", l.mParameters.paramsFlattened.string());
131    }
132
133    return OK;
134}
135
136Camera2Client::~Camera2Client() {
137    ATRACE_CALL();
138
139    mDestructionStarted = true;
140
141    SharedParameters::Lock l(mParameters);
142    if (l.mParameters.state != Parameters::DISCONNECTED) {
143        // Rewrite mClientPid to allow shutdown by CameraService
144        mClientPid = getCallingPid();
145        disconnect();
146    }
147
148    ALOGI("Camera %d: Closed", mCameraId);
149}
150
151status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
152    String8 result;
153    result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
154            mCameraId,
155            getCameraClient()->asBinder().get(),
156            mClientPid);
157    result.append("  State: ");
158#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
159
160    const Parameters& p = mParameters.unsafeAccess();
161
162    result.append(Parameters::getStateName(p.state));
163
164    result.append("\n  Current parameters:\n");
165    result.appendFormat("    Preview size: %d x %d\n",
166            p.previewWidth, p.previewHeight);
167    result.appendFormat("    Preview FPS range: %d - %d\n",
168            p.previewFpsRange[0], p.previewFpsRange[1]);
169    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
170            p.previewFormat);
171    result.appendFormat("    Preview transform: %x\n",
172            p.previewTransform);
173    result.appendFormat("    Picture size: %d x %d\n",
174            p.pictureWidth, p.pictureHeight);
175    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
176            p.jpegThumbSize[0], p.jpegThumbSize[1]);
177    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
178            p.jpegQuality, p.jpegThumbQuality);
179    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
180    result.appendFormat("    GPS tags %s\n",
181            p.gpsEnabled ? "enabled" : "disabled");
182    if (p.gpsEnabled) {
183        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
184                p.gpsCoordinates[0], p.gpsCoordinates[1],
185                p.gpsCoordinates[2]);
186        result.appendFormat("    GPS timestamp: %lld\n",
187                p.gpsTimestamp);
188        result.appendFormat("    GPS processing method: %s\n",
189                p.gpsProcessingMethod.string());
190    }
191
192    result.append("    White balance mode: ");
193    switch (p.wbMode) {
194        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
195        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
196        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
197        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
198        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
199        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
200        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
201        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
202        default: result.append("UNKNOWN\n");
203    }
204
205    result.append("    Effect mode: ");
206    switch (p.effectMode) {
207        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
208        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
209        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
210        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
211        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
212        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
213        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
214        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
215        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
216        default: result.append("UNKNOWN\n");
217    }
218
219    result.append("    Antibanding mode: ");
220    switch (p.antibandingMode) {
221        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
222        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
223        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
224        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
225        default: result.append("UNKNOWN\n");
226    }
227
228    result.append("    Scene mode: ");
229    switch (p.sceneMode) {
230        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
231            result.append("AUTO\n"); break;
232        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
233        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
234        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
235        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
236        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
237        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
238        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
239        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
240        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
241        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
242        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
243        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
244        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
245        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
246        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
247        default: result.append("UNKNOWN\n");
248    }
249
250    result.append("    Flash mode: ");
251    switch (p.flashMode) {
252        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
253        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
254        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
255        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
256        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
257        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
258        default: result.append("UNKNOWN\n");
259    }
260
261    result.append("    Focus mode: ");
262    switch (p.focusMode) {
263        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
264        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
265        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
266        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
267        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
268        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
269        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
270        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
271        default: result.append("UNKNOWN\n");
272    }
273
274    result.append("    Focusing areas:\n");
275    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
276        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
277                p.focusingAreas[i].left,
278                p.focusingAreas[i].top,
279                p.focusingAreas[i].right,
280                p.focusingAreas[i].bottom,
281                p.focusingAreas[i].weight);
282    }
283
284    result.appendFormat("    Exposure compensation index: %d\n",
285            p.exposureCompensation);
286
287    result.appendFormat("    AE lock %s, AWB lock %s\n",
288            p.autoExposureLock ? "enabled" : "disabled",
289            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
290
291    result.appendFormat("    Metering areas:\n");
292    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
293        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
294                p.meteringAreas[i].left,
295                p.meteringAreas[i].top,
296                p.meteringAreas[i].right,
297                p.meteringAreas[i].bottom,
298                p.meteringAreas[i].weight);
299    }
300
301    result.appendFormat("    Zoom index: %d\n", p.zoom);
302    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
303            p.videoHeight);
304
305    result.appendFormat("    Recording hint is %s\n",
306            p.recordingHint ? "set" : "not set");
307
308    result.appendFormat("    Video stabilization is %s\n",
309            p.videoStabilization ? "enabled" : "disabled");
310
311    result.append("  Current streams:\n");
312    result.appendFormat("    Preview stream ID: %d\n",
313            getPreviewStreamId());
314    result.appendFormat("    Capture stream ID: %d\n",
315            getCaptureStreamId());
316    result.appendFormat("    Recording stream ID: %d\n",
317            getRecordingStreamId());
318
319    result.append("  Quirks for this camera:\n");
320    bool haveQuirk = false;
321    if (p.quirks.triggerAfWithAuto) {
322        result.appendFormat("    triggerAfWithAuto\n");
323        haveQuirk = true;
324    }
325    if (p.quirks.useZslFormat) {
326        result.appendFormat("    useZslFormat\n");
327        haveQuirk = true;
328    }
329    if (!haveQuirk) {
330        result.appendFormat("    none\n");
331    }
332
333    write(fd, result.string(), result.size());
334
335    mStreamingProcessor->dump(fd, args);
336
337    mCaptureSequencer->dump(fd, args);
338
339    mFrameProcessor->dump(fd, args);
340
341    mZslProcessor->dump(fd, args);
342
343    result = "  Device dump:\n";
344    write(fd, result.string(), result.size());
345
346    status_t res = mDevice->dump(fd, args);
347    if (res != OK) {
348        result = String8::format("   Error dumping device: %s (%d)",
349                strerror(-res), res);
350        write(fd, result.string(), result.size());
351    }
352
353#undef CASE_APPEND_ENUM
354    return NO_ERROR;
355}
356
357// ICamera interface
358
359void Camera2Client::disconnect() {
360    ATRACE_CALL();
361    Mutex::Autolock icl(mICameraLock);
362    status_t res;
363    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
364
365    if (mDevice == 0) return;
366
367    ALOGV("Camera %d: Shutting down", mCameraId);
368
369    stopPreviewL();
370
371    {
372        SharedParameters::Lock l(mParameters);
373        l.mParameters.state = Parameters::DISCONNECTED;
374    }
375
376    mStreamingProcessor->deletePreviewStream();
377    mStreamingProcessor->deleteRecordingStream();
378    mJpegProcessor->deleteStream();
379    mCallbackProcessor->deleteStream();
380    mZslProcessor->deleteStream();
381
382    mFrameProcessor->requestExit();
383    mCaptureSequencer->requestExit();
384    mJpegProcessor->requestExit();
385    mZslProcessor->requestExit();
386    mCallbackProcessor->requestExit();
387
388    ALOGV("Camera %d: Waiting for threads", mCameraId);
389
390    mFrameProcessor->join();
391    mCaptureSequencer->join();
392    mJpegProcessor->join();
393    mZslProcessor->join();
394    mCallbackProcessor->join();
395
396    ALOGV("Camera %d: Disconnecting device", mCameraId);
397
398    mDevice->disconnect();
399
400    mDevice.clear();
401
402    CameraService::Client::disconnect();
403}
404
405status_t Camera2Client::connect(const sp<ICameraClient>& client) {
406    ATRACE_CALL();
407    ALOGV("%s: E", __FUNCTION__);
408    Mutex::Autolock icl(mICameraLock);
409
410    if (mClientPid != 0 && getCallingPid() != mClientPid) {
411        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
412                "current locked to pid %d", __FUNCTION__,
413                mCameraId, getCallingPid(), mClientPid);
414        return BAD_VALUE;
415    }
416
417    mClientPid = getCallingPid();
418
419    mCameraClient = client;
420    mSharedCameraClient = client;
421
422    return OK;
423}
424
425status_t Camera2Client::lock() {
426    ATRACE_CALL();
427    ALOGV("%s: E", __FUNCTION__);
428    Mutex::Autolock icl(mICameraLock);
429    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
430            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
431
432    if (mClientPid == 0) {
433        mClientPid = getCallingPid();
434        return OK;
435    }
436
437    if (mClientPid != getCallingPid()) {
438        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
439                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
440        return EBUSY;
441    }
442
443    return OK;
444}
445
446status_t Camera2Client::unlock() {
447    ATRACE_CALL();
448    ALOGV("%s: E", __FUNCTION__);
449    Mutex::Autolock icl(mICameraLock);
450    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
451            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
452
453    // TODO: Check for uninterruptable conditions
454
455    if (mClientPid == getCallingPid()) {
456        mClientPid = 0;
457        mCameraClient.clear();
458        mSharedCameraClient.clear();
459        return OK;
460    }
461
462    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
463            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
464    return EBUSY;
465}
466
467status_t Camera2Client::setPreviewDisplay(
468        const sp<Surface>& surface) {
469    ATRACE_CALL();
470    ALOGV("%s: E", __FUNCTION__);
471    Mutex::Autolock icl(mICameraLock);
472    status_t res;
473    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
474
475    sp<IBinder> binder;
476    sp<ANativeWindow> window;
477    if (surface != 0) {
478        binder = surface->asBinder();
479        window = surface;
480    }
481
482    return setPreviewWindowL(binder,window);
483}
484
485status_t Camera2Client::setPreviewTexture(
486        const sp<ISurfaceTexture>& surfaceTexture) {
487    ATRACE_CALL();
488    ALOGV("%s: E", __FUNCTION__);
489    Mutex::Autolock icl(mICameraLock);
490    status_t res;
491    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
492
493    sp<IBinder> binder;
494    sp<ANativeWindow> window;
495    if (surfaceTexture != 0) {
496        binder = surfaceTexture->asBinder();
497        window = new SurfaceTextureClient(surfaceTexture);
498    }
499    return setPreviewWindowL(binder, window);
500}
501
502status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
503        sp<ANativeWindow> window) {
504    ATRACE_CALL();
505    status_t res;
506
507    if (binder == mPreviewSurface) {
508        ALOGV("%s: Camera %d: New window is same as old window",
509                __FUNCTION__, mCameraId);
510        return NO_ERROR;
511    }
512
513    SharedParameters::Lock l(mParameters);
514    switch (l.mParameters.state) {
515        case Parameters::DISCONNECTED:
516        case Parameters::RECORD:
517        case Parameters::STILL_CAPTURE:
518        case Parameters::VIDEO_SNAPSHOT:
519            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
520                    __FUNCTION__, mCameraId,
521                    Parameters::getStateName(l.mParameters.state));
522            return INVALID_OPERATION;
523        case Parameters::STOPPED:
524        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
525            // OK
526            break;
527        case Parameters::PREVIEW:
528            // Already running preview - need to stop and create a new stream
529            // TODO: Optimize this so that we don't wait for old stream to drain
530            // before spinning up new stream
531            mDevice->clearStreamingRequest();
532            l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
533            break;
534    }
535
536    mPreviewSurface = binder;
537    res = mStreamingProcessor->setPreviewWindow(window);
538    if (res != OK) {
539        ALOGE("%s: Unable to set new preview window: %s (%d)",
540                __FUNCTION__, strerror(-res), res);
541        return res;
542    }
543
544    if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
545        return startPreviewL(l.mParameters, false);
546    }
547
548    return OK;
549}
550
551void Camera2Client::setPreviewCallbackFlag(int flag) {
552    ATRACE_CALL();
553    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
554    Mutex::Autolock icl(mICameraLock);
555    status_t res;
556    if ( checkPid(__FUNCTION__) != OK) return;
557
558    SharedParameters::Lock l(mParameters);
559    setPreviewCallbackFlagL(l.mParameters, flag);
560}
561
562void Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
563    status_t res = OK;
564    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
565        ALOGV("%s: setting oneshot", __FUNCTION__);
566        params.previewCallbackOneShot = true;
567    }
568    if (params.previewCallbackFlags != (uint32_t)flag) {
569        params.previewCallbackFlags = flag;
570        switch(params.state) {
571        case Parameters::PREVIEW:
572            res = startPreviewL(params, true);
573            break;
574        case Parameters::RECORD:
575        case Parameters::VIDEO_SNAPSHOT:
576            res = startRecordingL(params, true);
577            break;
578        default:
579            break;
580        }
581        if (res != OK) {
582            ALOGE("%s: Camera %d: Unable to refresh request in state %s",
583                    __FUNCTION__, mCameraId,
584                    Parameters::getStateName(params.state));
585        }
586    }
587
588}
589
590status_t Camera2Client::startPreview() {
591    ATRACE_CALL();
592    ALOGV("%s: E", __FUNCTION__);
593    Mutex::Autolock icl(mICameraLock);
594    status_t res;
595    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
596    SharedParameters::Lock l(mParameters);
597    return startPreviewL(l.mParameters, false);
598}
599
600status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
601    ATRACE_CALL();
602    status_t res;
603
604    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
605
606    if (params.state == Parameters::PREVIEW && !restart) {
607        // Succeed attempt to re-enter preview state
608        ALOGI("%s: Not starting preview; already in preview state.",
609              __FUNCTION__);
610        return OK;
611    }
612    if (params.state > Parameters::PREVIEW && !restart) {
613        ALOGE("%s: Can't start preview in state %s",
614                __FUNCTION__,
615                Parameters::getStateName(params.state));
616        return INVALID_OPERATION;
617    }
618
619    if (!mStreamingProcessor->haveValidPreviewWindow()) {
620        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
621        return OK;
622    }
623    params.state = Parameters::STOPPED;
624
625    res = mStreamingProcessor->updatePreviewStream(params);
626    if (res != OK) {
627        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
628                __FUNCTION__, mCameraId, strerror(-res), res);
629        return res;
630    }
631
632    Vector<uint8_t> outputStreams;
633    bool callbacksEnabled = params.previewCallbackFlags &
634        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
635    if (callbacksEnabled) {
636        res = mCallbackProcessor->updateStream(params);
637        if (res != OK) {
638            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
639                    __FUNCTION__, mCameraId, strerror(-res), res);
640            return res;
641        }
642        outputStreams.push(getCallbackStreamId());
643    }
644    if (params.zslMode && !params.recordingHint) {
645        res = mZslProcessor->updateStream(params);
646        if (res != OK) {
647            ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
648                    __FUNCTION__, mCameraId, strerror(-res), res);
649            return res;
650        }
651        outputStreams.push(getZslStreamId());
652    }
653
654    outputStreams.push(getPreviewStreamId());
655
656    if (!params.recordingHint) {
657        if (!restart) {
658            res = mStreamingProcessor->updatePreviewRequest(params);
659            if (res != OK) {
660                ALOGE("%s: Camera %d: Can't set up preview request: "
661                        "%s (%d)", __FUNCTION__, mCameraId,
662                        strerror(-res), res);
663                return res;
664            }
665        }
666        res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW,
667                outputStreams);
668    } else {
669        // With recording hint set, we're going to be operating under the
670        // assumption that the user will record video. To optimize recording
671        // startup time, create the necessary output streams for recording and
672        // video snapshot now if they don't already exist.
673        res = mJpegProcessor->updateStream(params);
674        if (res != OK) {
675            ALOGE("%s: Camera %d: Can't pre-configure still image "
676                    "stream: %s (%d)",
677                    __FUNCTION__, mCameraId, strerror(-res), res);
678            return res;
679        }
680
681        if (!restart) {
682            res = mStreamingProcessor->updateRecordingRequest(params);
683            if (res != OK) {
684                ALOGE("%s: Camera %d: Can't set up preview request with "
685                        "record hint: %s (%d)", __FUNCTION__, mCameraId,
686                        strerror(-res), res);
687                return res;
688            }
689        }
690        res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
691                outputStreams);
692    }
693    if (res != OK) {
694        ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)",
695                __FUNCTION__, mCameraId, strerror(-res), res);
696        return res;
697    }
698
699    params.state = Parameters::PREVIEW;
700    return OK;
701}
702
703void Camera2Client::stopPreview() {
704    ATRACE_CALL();
705    ALOGV("%s: E", __FUNCTION__);
706    Mutex::Autolock icl(mICameraLock);
707    status_t res;
708    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
709    stopPreviewL();
710}
711
712void Camera2Client::stopPreviewL() {
713    ATRACE_CALL();
714    Parameters::State state;
715    {
716        SharedParameters::Lock l(mParameters);
717        state = l.mParameters.state;
718    }
719
720    switch (state) {
721        case Parameters::DISCONNECTED:
722            ALOGE("%s: Camera %d: Call before initialized",
723                    __FUNCTION__, mCameraId);
724            break;
725        case Parameters::STOPPED:
726            break;
727        case Parameters::STILL_CAPTURE:
728            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
729                    __FUNCTION__, mCameraId);
730            break;
731        case Parameters::RECORD:
732            // no break - identical to preview
733        case Parameters::PREVIEW:
734            mStreamingProcessor->stopStream();
735            // no break
736        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
737            SharedParameters::Lock l(mParameters);
738            l.mParameters.state = Parameters::STOPPED;
739            commandStopFaceDetectionL(l.mParameters);
740            break;
741        }
742        default:
743            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
744                    state);
745    }
746}
747
748bool Camera2Client::previewEnabled() {
749    ATRACE_CALL();
750    Mutex::Autolock icl(mICameraLock);
751    status_t res;
752    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
753
754    SharedParameters::Lock l(mParameters);
755    return l.mParameters.state == Parameters::PREVIEW;
756}
757
758status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
759    ATRACE_CALL();
760    Mutex::Autolock icl(mICameraLock);
761    status_t res;
762    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
763
764    SharedParameters::Lock l(mParameters);
765    switch (l.mParameters.state) {
766        case Parameters::RECORD:
767        case Parameters::VIDEO_SNAPSHOT:
768            ALOGE("%s: Camera %d: Can't be called in state %s",
769                    __FUNCTION__, mCameraId,
770                    Parameters::getStateName(l.mParameters.state));
771            return INVALID_OPERATION;
772        default:
773            // OK
774            break;
775    }
776
777    l.mParameters.storeMetadataInBuffers = enabled;
778
779    return OK;
780}
781
782status_t Camera2Client::startRecording() {
783    ATRACE_CALL();
784    ALOGV("%s: E", __FUNCTION__);
785    Mutex::Autolock icl(mICameraLock);
786    status_t res;
787    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
788    SharedParameters::Lock l(mParameters);
789
790    return startRecordingL(l.mParameters, false);
791}
792
793status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
794    status_t res;
795
796    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
797
798    switch (params.state) {
799        case Parameters::STOPPED:
800            res = startPreviewL(params, false);
801            if (res != OK) return res;
802            break;
803        case Parameters::PREVIEW:
804            // Ready to go
805            break;
806        case Parameters::RECORD:
807        case Parameters::VIDEO_SNAPSHOT:
808            // OK to call this when recording is already on, just skip unless
809            // we're looking to restart
810            if (!restart) return OK;
811            break;
812        default:
813            ALOGE("%s: Camera %d: Can't start recording in state %s",
814                    __FUNCTION__, mCameraId,
815                    Parameters::getStateName(params.state));
816            return INVALID_OPERATION;
817    };
818
819    if (!params.storeMetadataInBuffers) {
820        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
821                "non-metadata recording mode requested!", __FUNCTION__,
822                mCameraId);
823        return INVALID_OPERATION;
824    }
825
826    if (!restart) {
827        mCameraService->playSound(CameraService::SOUND_RECORDING);
828        mStreamingProcessor->updateRecordingRequest(params);
829        if (res != OK) {
830            ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
831                    __FUNCTION__, mCameraId, strerror(-res), res);
832            return res;
833        }
834    }
835
836    res = mStreamingProcessor->updateRecordingStream(params);
837    if (res != OK) {
838        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
839                __FUNCTION__, mCameraId, strerror(-res), res);
840        return res;
841    }
842
843    Vector<uint8_t> outputStreams;
844    bool callbacksEnabled = params.previewCallbackFlags &
845        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
846    if (callbacksEnabled) {
847        res = mCallbackProcessor->updateStream(params);
848        if (res != OK) {
849            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
850                    __FUNCTION__, mCameraId, strerror(-res), res);
851            return res;
852        }
853        outputStreams.push(getCallbackStreamId());
854    }
855    outputStreams.push(getPreviewStreamId());
856    outputStreams.push(getRecordingStreamId());
857
858    res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
859            outputStreams);
860    if (res != OK) {
861        ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)",
862                __FUNCTION__, mCameraId, strerror(-res), res);
863        return res;
864    }
865
866    if (params.state < Parameters::RECORD) {
867        params.state = Parameters::RECORD;
868    }
869
870    return OK;
871}
872
873void Camera2Client::stopRecording() {
874    ATRACE_CALL();
875    ALOGV("%s: E", __FUNCTION__);
876    Mutex::Autolock icl(mICameraLock);
877    SharedParameters::Lock l(mParameters);
878
879    status_t res;
880    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
881
882    switch (l.mParameters.state) {
883        case Parameters::RECORD:
884            // OK to stop
885            break;
886        case Parameters::STOPPED:
887        case Parameters::PREVIEW:
888        case Parameters::STILL_CAPTURE:
889        case Parameters::VIDEO_SNAPSHOT:
890        default:
891            ALOGE("%s: Camera %d: Can't stop recording in state %s",
892                    __FUNCTION__, mCameraId,
893                    Parameters::getStateName(l.mParameters.state));
894            return;
895    };
896
897    mCameraService->playSound(CameraService::SOUND_RECORDING);
898
899    res = startPreviewL(l.mParameters, true);
900    if (res != OK) {
901        ALOGE("%s: Camera %d: Unable to return to preview",
902                __FUNCTION__, mCameraId);
903    }
904}
905
906bool Camera2Client::recordingEnabled() {
907    ATRACE_CALL();
908    Mutex::Autolock icl(mICameraLock);
909
910    if ( checkPid(__FUNCTION__) != OK) return false;
911
912    return recordingEnabledL();
913}
914
915bool Camera2Client::recordingEnabledL() {
916    ATRACE_CALL();
917    SharedParameters::Lock l(mParameters);
918
919    return (l.mParameters.state == Parameters::RECORD
920            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
921}
922
923void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
924    ATRACE_CALL();
925    Mutex::Autolock icl(mICameraLock);
926    if ( checkPid(__FUNCTION__) != OK) return;
927
928    mStreamingProcessor->releaseRecordingFrame(mem);
929}
930
931status_t Camera2Client::autoFocus() {
932    ATRACE_CALL();
933    Mutex::Autolock icl(mICameraLock);
934    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
935    status_t res;
936    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
937
938    int triggerId;
939    {
940        SharedParameters::Lock l(mParameters);
941        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
942        triggerId = l.mParameters.currentAfTriggerId;
943    }
944
945    mDevice->triggerAutofocus(triggerId);
946
947    return OK;
948}
949
950status_t Camera2Client::cancelAutoFocus() {
951    ATRACE_CALL();
952    Mutex::Autolock icl(mICameraLock);
953    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
954    status_t res;
955    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
956
957    int triggerId;
958    {
959        SharedParameters::Lock l(mParameters);
960        triggerId = ++l.mParameters.afTriggerCounter;
961    }
962
963    mDevice->triggerCancelAutofocus(triggerId);
964
965    return OK;
966}
967
968status_t Camera2Client::takePicture(int msgType) {
969    ATRACE_CALL();
970    Mutex::Autolock icl(mICameraLock);
971    status_t res;
972    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
973
974    SharedParameters::Lock l(mParameters);
975    switch (l.mParameters.state) {
976        case Parameters::DISCONNECTED:
977        case Parameters::STOPPED:
978        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
979            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
980                    __FUNCTION__, mCameraId);
981            return INVALID_OPERATION;
982        case Parameters::PREVIEW:
983            // Good to go for takePicture
984            res = commandStopFaceDetectionL(l.mParameters);
985            if (res != OK) {
986                ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
987                        __FUNCTION__, mCameraId);
988                return res;
989            }
990            l.mParameters.state = Parameters::STILL_CAPTURE;
991            break;
992        case Parameters::RECORD:
993            // Good to go for video snapshot
994            l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
995            break;
996        case Parameters::STILL_CAPTURE:
997        case Parameters::VIDEO_SNAPSHOT:
998            ALOGE("%s: Camera %d: Already taking a picture",
999                    __FUNCTION__, mCameraId);
1000            return INVALID_OPERATION;
1001    }
1002
1003    ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1004
1005    res = mJpegProcessor->updateStream(l.mParameters);
1006    if (res != OK) {
1007        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1008                __FUNCTION__, mCameraId, strerror(-res), res);
1009        return res;
1010    }
1011
1012    res = mCaptureSequencer->startCapture();
1013    if (res != OK) {
1014        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
1015                __FUNCTION__, mCameraId, strerror(-res), res);
1016    }
1017
1018    return res;
1019}
1020
1021status_t Camera2Client::setParameters(const String8& params) {
1022    ATRACE_CALL();
1023    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1024    Mutex::Autolock icl(mICameraLock);
1025    status_t res;
1026    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1027
1028    SharedParameters::Lock l(mParameters);
1029
1030    res = l.mParameters.set(params);
1031    if (res != OK) return res;
1032
1033    res = updateRequests(l.mParameters);
1034
1035    return res;
1036}
1037
1038String8 Camera2Client::getParameters() const {
1039    ATRACE_CALL();
1040    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1041    Mutex::Autolock icl(mICameraLock);
1042    if ( checkPid(__FUNCTION__) != OK) return String8();
1043
1044    SharedParameters::ReadLock l(mParameters);
1045
1046    return l.mParameters.get();
1047}
1048
1049status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1050    ATRACE_CALL();
1051    Mutex::Autolock icl(mICameraLock);
1052    status_t res;
1053    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1054
1055    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1056            cmd, arg1, arg2);
1057
1058    switch (cmd) {
1059        case CAMERA_CMD_START_SMOOTH_ZOOM:
1060            return commandStartSmoothZoomL();
1061        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1062            return commandStopSmoothZoomL();
1063        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1064            return commandSetDisplayOrientationL(arg1);
1065        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1066            return commandEnableShutterSoundL(arg1 == 1);
1067        case CAMERA_CMD_PLAY_RECORDING_SOUND:
1068            return commandPlayRecordingSoundL();
1069        case CAMERA_CMD_START_FACE_DETECTION:
1070            return commandStartFaceDetectionL(arg1);
1071        case CAMERA_CMD_STOP_FACE_DETECTION: {
1072            SharedParameters::Lock l(mParameters);
1073            return commandStopFaceDetectionL(l.mParameters);
1074        }
1075        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1076            return commandEnableFocusMoveMsgL(arg1 == 1);
1077        case CAMERA_CMD_PING:
1078            return commandPingL();
1079        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1080            return commandSetVideoBufferCountL(arg1);
1081        default:
1082            ALOGE("%s: Unknown command %d (arguments %d, %d)",
1083                    __FUNCTION__, cmd, arg1, arg2);
1084            return BAD_VALUE;
1085    }
1086}
1087
1088status_t Camera2Client::commandStartSmoothZoomL() {
1089    ALOGE("%s: Unimplemented!", __FUNCTION__);
1090    return OK;
1091}
1092
1093status_t Camera2Client::commandStopSmoothZoomL() {
1094    ALOGE("%s: Unimplemented!", __FUNCTION__);
1095    return OK;
1096}
1097
1098status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
1099    int transform = Parameters::degToTransform(degrees,
1100            mCameraFacing == CAMERA_FACING_FRONT);
1101    if (transform == -1) {
1102        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1103                __FUNCTION__, mCameraId, degrees);
1104        return BAD_VALUE;
1105    }
1106    SharedParameters::Lock l(mParameters);
1107    if (transform != l.mParameters.previewTransform &&
1108            getPreviewStreamId() != NO_STREAM) {
1109        mDevice->setStreamTransform(getPreviewStreamId(), transform);
1110    }
1111    l.mParameters.previewTransform = transform;
1112    return OK;
1113}
1114
1115status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
1116    SharedParameters::Lock l(mParameters);
1117    if (enable) {
1118        l.mParameters.playShutterSound = true;
1119        return OK;
1120    }
1121
1122    // Disabling shutter sound may not be allowed. In that case only
1123    // allow the mediaserver process to disable the sound.
1124    char value[PROPERTY_VALUE_MAX];
1125    property_get("ro.camera.sound.forced", value, "0");
1126    if (strncmp(value, "0", 2) != 0) {
1127        // Disabling shutter sound is not allowed. Deny if the current
1128        // process is not mediaserver.
1129        if (getCallingPid() != getpid()) {
1130            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1131                    getCallingPid());
1132            return PERMISSION_DENIED;
1133        }
1134    }
1135
1136    l.mParameters.playShutterSound = false;
1137    return OK;
1138}
1139
1140status_t Camera2Client::commandPlayRecordingSoundL() {
1141    mCameraService->playSound(CameraService::SOUND_RECORDING);
1142    return OK;
1143}
1144
1145status_t Camera2Client::commandStartFaceDetectionL(int type) {
1146    ALOGV("%s: Camera %d: Starting face detection",
1147          __FUNCTION__, mCameraId);
1148    status_t res;
1149    SharedParameters::Lock l(mParameters);
1150    switch (l.mParameters.state) {
1151        case Parameters::DISCONNECTED:
1152        case Parameters::STOPPED:
1153        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1154        case Parameters::STILL_CAPTURE:
1155            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
1156                    __FUNCTION__, mCameraId);
1157            return INVALID_OPERATION;
1158        case Parameters::PREVIEW:
1159        case Parameters::RECORD:
1160        case Parameters::VIDEO_SNAPSHOT:
1161            // Good to go for starting face detect
1162            break;
1163    }
1164    // Ignoring type
1165    if (l.mParameters.fastInfo.bestFaceDetectMode ==
1166            ANDROID_STATS_FACE_DETECTION_OFF) {
1167        ALOGE("%s: Camera %d: Face detection not supported",
1168                __FUNCTION__, mCameraId);
1169        return INVALID_OPERATION;
1170    }
1171    if (l.mParameters.enableFaceDetect) return OK;
1172
1173    l.mParameters.enableFaceDetect = true;
1174
1175    res = updateRequests(l.mParameters);
1176
1177    return res;
1178}
1179
1180status_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
1181    status_t res = OK;
1182    ALOGV("%s: Camera %d: Stopping face detection",
1183          __FUNCTION__, mCameraId);
1184
1185    if (!params.enableFaceDetect) return OK;
1186
1187    params.enableFaceDetect = false;
1188
1189    if (params.state == Parameters::PREVIEW
1190            || params.state == Parameters::RECORD
1191            || params.state == Parameters::VIDEO_SNAPSHOT) {
1192        res = updateRequests(params);
1193    }
1194
1195    return res;
1196}
1197
1198status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
1199    SharedParameters::Lock l(mParameters);
1200    l.mParameters.enableFocusMoveMessages = enable;
1201
1202    return OK;
1203}
1204
1205status_t Camera2Client::commandPingL() {
1206    // Always ping back if access is proper and device is alive
1207    SharedParameters::Lock l(mParameters);
1208    if (l.mParameters.state != Parameters::DISCONNECTED) {
1209        return OK;
1210    } else {
1211        return NO_INIT;
1212    }
1213}
1214
1215status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
1216    if (recordingEnabledL()) {
1217        ALOGE("%s: Camera %d: Error setting video buffer count after "
1218                "recording was started", __FUNCTION__, mCameraId);
1219        return INVALID_OPERATION;
1220    }
1221
1222    return mStreamingProcessor->setRecordingBufferCount(count);
1223}
1224
1225/** Device-related methods */
1226
1227void Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1228    ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1229}
1230
1231void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1232    ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1233            frameNumber, timestamp);
1234}
1235
1236void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1237    ALOGV("%s: Autofocus state now %d, last trigger %d",
1238            __FUNCTION__, newState, triggerId);
1239    bool sendCompletedMessage = false;
1240    bool sendMovingMessage = false;
1241
1242    bool success = false;
1243    bool afInMotion = false;
1244    {
1245        SharedParameters::Lock l(mParameters);
1246        switch (l.mParameters.focusMode) {
1247            case Parameters::FOCUS_MODE_AUTO:
1248            case Parameters::FOCUS_MODE_MACRO:
1249                // Don't send notifications upstream if they're not for the current AF
1250                // trigger. For example, if cancel was called in between, or if we
1251                // already sent a notification about this AF call.
1252                if (triggerId != l.mParameters.currentAfTriggerId) break;
1253                switch (newState) {
1254                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1255                        success = true;
1256                        // no break
1257                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1258                        sendCompletedMessage = true;
1259                        l.mParameters.currentAfTriggerId = -1;
1260                        break;
1261                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1262                        // Just starting focusing, ignore
1263                        break;
1264                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1265                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1266                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1267                    default:
1268                        // Unexpected in AUTO/MACRO mode
1269                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1270                                __FUNCTION__, newState);
1271                        break;
1272                }
1273                break;
1274            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1275            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1276                switch (newState) {
1277                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1278                        success = true;
1279                        // no break
1280                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1281                        // Don't send notifications upstream if they're not for
1282                        // the current AF trigger. For example, if cancel was
1283                        // called in between, or if we already sent a
1284                        // notification about this AF call.
1285                        // Send both a 'AF done' callback and a 'AF move' callback
1286                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1287                        sendCompletedMessage = true;
1288                        afInMotion = false;
1289                        if (l.mParameters.enableFocusMoveMessages &&
1290                                l.mParameters.afInMotion) {
1291                            sendMovingMessage = true;
1292                        }
1293                        l.mParameters.currentAfTriggerId = -1;
1294                        break;
1295                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1296                        // Cancel was called, or we switched state; care if
1297                        // currently moving
1298                        afInMotion = false;
1299                        if (l.mParameters.enableFocusMoveMessages &&
1300                                l.mParameters.afInMotion) {
1301                            sendMovingMessage = true;
1302                        }
1303                        break;
1304                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1305                        // Start passive scan, inform upstream
1306                        afInMotion = true;
1307                        // no break
1308                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1309                        // Stop passive scan, inform upstream
1310                        if (l.mParameters.enableFocusMoveMessages) {
1311                            sendMovingMessage = true;
1312                        }
1313                        break;
1314                }
1315                l.mParameters.afInMotion = afInMotion;
1316                break;
1317            case Parameters::FOCUS_MODE_EDOF:
1318            case Parameters::FOCUS_MODE_INFINITY:
1319            case Parameters::FOCUS_MODE_FIXED:
1320            default:
1321                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1322                    ALOGE("%s: Unexpected AF state change %d "
1323                            "(ID %d) in focus mode %d",
1324                          __FUNCTION__, newState, triggerId,
1325                            l.mParameters.focusMode);
1326                }
1327        }
1328    }
1329    if (sendMovingMessage) {
1330        SharedCameraClient::Lock l(mSharedCameraClient);
1331        if (l.mCameraClient != 0) {
1332            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
1333                    afInMotion ? 1 : 0, 0);
1334        }
1335    }
1336    if (sendCompletedMessage) {
1337        SharedCameraClient::Lock l(mSharedCameraClient);
1338        if (l.mCameraClient != 0) {
1339            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1340                    success ? 1 : 0, 0);
1341        }
1342    }
1343}
1344
1345void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1346    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1347            __FUNCTION__, newState, triggerId);
1348    mCaptureSequencer->notifyAutoExposure(newState, triggerId);
1349}
1350
1351void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1352    ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1353            __FUNCTION__, newState, triggerId);
1354}
1355
1356int Camera2Client::getCameraId() const {
1357    return mCameraId;
1358}
1359
1360const sp<Camera2Device>& Camera2Client::getCameraDevice() {
1361    return mDevice;
1362}
1363
1364const sp<CameraService>& Camera2Client::getCameraService() {
1365    return mCameraService;
1366}
1367
1368camera2::SharedParameters& Camera2Client::getParameters() {
1369    return mParameters;
1370}
1371
1372int Camera2Client::getPreviewStreamId() const {
1373    return mStreamingProcessor->getPreviewStreamId();
1374}
1375
1376int Camera2Client::getCaptureStreamId() const {
1377    return mJpegProcessor->getStreamId();
1378}
1379
1380int Camera2Client::getCallbackStreamId() const {
1381    return mCallbackProcessor->getStreamId();
1382}
1383
1384int Camera2Client::getRecordingStreamId() const {
1385    return mStreamingProcessor->getRecordingStreamId();
1386}
1387
1388int Camera2Client::getZslStreamId() const {
1389    return mZslProcessor->getStreamId();
1390}
1391
1392status_t Camera2Client::registerFrameListener(int32_t id,
1393        wp<camera2::FrameProcessor::FilteredListener> listener) {
1394    return mFrameProcessor->registerListener(id, listener);
1395}
1396
1397status_t Camera2Client::removeFrameListener(int32_t id) {
1398    return mFrameProcessor->removeListener(id);
1399}
1400
1401Camera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1402        mCameraClient(client.mCameraClient),
1403        mSharedClient(client) {
1404    mSharedClient.mCameraClientLock.lock();
1405}
1406
1407Camera2Client::SharedCameraClient::Lock::~Lock() {
1408    mSharedClient.mCameraClientLock.unlock();
1409}
1410
1411Camera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1412        mCameraClient(client) {
1413}
1414
1415Camera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1416        const sp<ICameraClient>&client) {
1417    Mutex::Autolock l(mCameraClientLock);
1418    mCameraClient = client;
1419    return *this;
1420}
1421
1422void Camera2Client::SharedCameraClient::clear() {
1423    Mutex::Autolock l(mCameraClientLock);
1424    mCameraClient.clear();
1425}
1426
1427const int32_t Camera2Client::kPreviewRequestId;
1428const int32_t Camera2Client::kRecordRequestId;
1429const int32_t Camera2Client::kFirstCaptureRequestId;
1430
1431/** Utility methods */
1432
1433status_t Camera2Client::updateRequests(Parameters &params) {
1434    status_t res;
1435
1436    ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
1437
1438    res = mStreamingProcessor->updatePreviewRequest(params);
1439    if (res != OK) {
1440        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1441                __FUNCTION__, mCameraId, strerror(-res), res);
1442        return res;
1443    }
1444    res = mStreamingProcessor->updateRecordingRequest(params);
1445    if (res != OK) {
1446        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1447                __FUNCTION__, mCameraId, strerror(-res), res);
1448        return res;
1449    }
1450
1451    if (params.state == Parameters::PREVIEW) {
1452        res = startPreviewL(params, true);
1453        if (res != OK) {
1454            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1455                    __FUNCTION__, mCameraId, strerror(-res), res);
1456            return res;
1457        }
1458    } else if (params.state == Parameters::RECORD ||
1459            params.state == Parameters::VIDEO_SNAPSHOT) {
1460        res = startRecordingL(params, true);
1461        if (res != OK) {
1462            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1463                    __FUNCTION__, mCameraId, strerror(-res), res);
1464            return res;
1465        }
1466    }
1467    return res;
1468}
1469
1470
1471size_t Camera2Client::calculateBufferSize(int width, int height,
1472        int format, int stride) {
1473    switch (format) {
1474        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1475            return width * height * 2;
1476        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1477            return width * height * 3 / 2;
1478        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1479            return width * height * 2;
1480        case HAL_PIXEL_FORMAT_YV12: {      // YV12
1481            size_t ySize = stride * height;
1482            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
1483            size_t uvSize = uvStride * height / 2;
1484            return ySize + uvSize * 2;
1485        }
1486        case HAL_PIXEL_FORMAT_RGB_565:
1487            return width * height * 2;
1488        case HAL_PIXEL_FORMAT_RGBA_8888:
1489            return width * height * 4;
1490        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1491            return width * height * 2;
1492        default:
1493            ALOGE("%s: Unknown preview format: %x",
1494                    __FUNCTION__,  format);
1495            return 0;
1496    }
1497}
1498
1499} // namespace android
1500