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