Camera2Client.cpp revision e382ee28709b83264a46b09e8f766c5ef42efa35
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    SharedParameters::Lock l(mParameters);
423    l.mParameters.state = Parameters::STOPPED;
424
425    return OK;
426}
427
428status_t Camera2Client::lock() {
429    ATRACE_CALL();
430    ALOGV("%s: E", __FUNCTION__);
431    Mutex::Autolock icl(mICameraLock);
432    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
433            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
434
435    if (mClientPid == 0) {
436        mClientPid = getCallingPid();
437        return OK;
438    }
439
440    if (mClientPid != getCallingPid()) {
441        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
442                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
443        return EBUSY;
444    }
445
446    return OK;
447}
448
449status_t Camera2Client::unlock() {
450    ATRACE_CALL();
451    ALOGV("%s: E", __FUNCTION__);
452    Mutex::Autolock icl(mICameraLock);
453    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
454            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
455
456    // TODO: Check for uninterruptable conditions
457
458    if (mClientPid == getCallingPid()) {
459        mClientPid = 0;
460        mCameraClient.clear();
461        mSharedCameraClient.clear();
462        return OK;
463    }
464
465    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
466            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
467    return EBUSY;
468}
469
470status_t Camera2Client::setPreviewDisplay(
471        const sp<Surface>& surface) {
472    ATRACE_CALL();
473    ALOGV("%s: E", __FUNCTION__);
474    Mutex::Autolock icl(mICameraLock);
475    status_t res;
476    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
477
478    sp<IBinder> binder;
479    sp<ANativeWindow> window;
480    if (surface != 0) {
481        binder = surface->asBinder();
482        window = surface;
483    }
484
485    return setPreviewWindowL(binder,window);
486}
487
488status_t Camera2Client::setPreviewTexture(
489        const sp<ISurfaceTexture>& surfaceTexture) {
490    ATRACE_CALL();
491    ALOGV("%s: E", __FUNCTION__);
492    Mutex::Autolock icl(mICameraLock);
493    status_t res;
494    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
495
496    sp<IBinder> binder;
497    sp<ANativeWindow> window;
498    if (surfaceTexture != 0) {
499        binder = surfaceTexture->asBinder();
500        window = new SurfaceTextureClient(surfaceTexture);
501    }
502    return setPreviewWindowL(binder, window);
503}
504
505status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
506        sp<ANativeWindow> window) {
507    ATRACE_CALL();
508    status_t res;
509
510    if (binder == mPreviewSurface) {
511        ALOGV("%s: Camera %d: New window is same as old window",
512                __FUNCTION__, mCameraId);
513        return NO_ERROR;
514    }
515
516    SharedParameters::Lock l(mParameters);
517    switch (l.mParameters.state) {
518        case Parameters::DISCONNECTED:
519        case Parameters::RECORD:
520        case Parameters::STILL_CAPTURE:
521        case Parameters::VIDEO_SNAPSHOT:
522            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
523                    __FUNCTION__, mCameraId,
524                    Parameters::getStateName(l.mParameters.state));
525            return INVALID_OPERATION;
526        case Parameters::STOPPED:
527        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
528            // OK
529            break;
530        case Parameters::PREVIEW:
531            // Already running preview - need to stop and create a new stream
532            // TODO: Optimize this so that we don't wait for old stream to drain
533            // before spinning up new stream
534            mDevice->clearStreamingRequest();
535            l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
536            break;
537    }
538
539    mPreviewSurface = binder;
540    res = mStreamingProcessor->setPreviewWindow(window);
541    if (res != OK) {
542        ALOGE("%s: Unable to set new preview window: %s (%d)",
543                __FUNCTION__, strerror(-res), res);
544        return res;
545    }
546
547    if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
548        return startPreviewL(l.mParameters, false);
549    }
550
551    return OK;
552}
553
554void Camera2Client::setPreviewCallbackFlag(int flag) {
555    ATRACE_CALL();
556    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
557    Mutex::Autolock icl(mICameraLock);
558    status_t res;
559    if ( checkPid(__FUNCTION__) != OK) return;
560
561    SharedParameters::Lock l(mParameters);
562    setPreviewCallbackFlagL(l.mParameters, flag);
563}
564
565void Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
566    status_t res = OK;
567    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
568        ALOGV("%s: setting oneshot", __FUNCTION__);
569        params.previewCallbackOneShot = true;
570    }
571    if (params.previewCallbackFlags != (uint32_t)flag) {
572        params.previewCallbackFlags = flag;
573        switch(params.state) {
574        case Parameters::PREVIEW:
575            res = startPreviewL(params, true);
576            break;
577        case Parameters::RECORD:
578        case Parameters::VIDEO_SNAPSHOT:
579            res = startRecordingL(params, true);
580            break;
581        default:
582            break;
583        }
584        if (res != OK) {
585            ALOGE("%s: Camera %d: Unable to refresh request in state %s",
586                    __FUNCTION__, mCameraId,
587                    Parameters::getStateName(params.state));
588        }
589    }
590
591}
592
593status_t Camera2Client::startPreview() {
594    ATRACE_CALL();
595    ALOGV("%s: E", __FUNCTION__);
596    Mutex::Autolock icl(mICameraLock);
597    status_t res;
598    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
599    SharedParameters::Lock l(mParameters);
600    return startPreviewL(l.mParameters, false);
601}
602
603status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
604    ATRACE_CALL();
605    status_t res;
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    switch (params.state) {
796        case Parameters::STOPPED:
797            res = startPreviewL(params, false);
798            if (res != OK) return res;
799            break;
800        case Parameters::PREVIEW:
801            // Ready to go
802            break;
803        case Parameters::RECORD:
804        case Parameters::VIDEO_SNAPSHOT:
805            // OK to call this when recording is already on, just skip unless
806            // we're looking to restart
807            if (!restart) return OK;
808            break;
809        default:
810            ALOGE("%s: Camera %d: Can't start recording in state %s",
811                    __FUNCTION__, mCameraId,
812                    Parameters::getStateName(params.state));
813            return INVALID_OPERATION;
814    };
815
816    if (!params.storeMetadataInBuffers) {
817        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
818                "non-metadata recording mode requested!", __FUNCTION__,
819                mCameraId);
820        return INVALID_OPERATION;
821    }
822
823    if (!restart) {
824        mCameraService->playSound(CameraService::SOUND_RECORDING);
825        mStreamingProcessor->updateRecordingRequest(params);
826        if (res != OK) {
827            ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
828                    __FUNCTION__, mCameraId, strerror(-res), res);
829            return res;
830        }
831    }
832
833    res = mStreamingProcessor->updateRecordingStream(params);
834    if (res != OK) {
835        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
836                __FUNCTION__, mCameraId, strerror(-res), res);
837        return res;
838    }
839
840    Vector<uint8_t> outputStreams;
841    bool callbacksEnabled = params.previewCallbackFlags &
842        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
843    if (callbacksEnabled) {
844        res = mCallbackProcessor->updateStream(params);
845        if (res != OK) {
846            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
847                    __FUNCTION__, mCameraId, strerror(-res), res);
848            return res;
849        }
850        outputStreams.push(getCallbackStreamId());
851    }
852    outputStreams.push(getPreviewStreamId());
853    outputStreams.push(getRecordingStreamId());
854
855    res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
856            outputStreams);
857    if (res != OK) {
858        ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)",
859                __FUNCTION__, mCameraId, strerror(-res), res);
860        return res;
861    }
862
863    if (params.state < Parameters::RECORD) {
864        params.state = Parameters::RECORD;
865    }
866
867    return OK;
868}
869
870void Camera2Client::stopRecording() {
871    ATRACE_CALL();
872    ALOGV("%s: E", __FUNCTION__);
873    Mutex::Autolock icl(mICameraLock);
874    SharedParameters::Lock l(mParameters);
875
876    status_t res;
877    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
878
879    switch (l.mParameters.state) {
880        case Parameters::RECORD:
881            // OK to stop
882            break;
883        case Parameters::STOPPED:
884        case Parameters::PREVIEW:
885        case Parameters::STILL_CAPTURE:
886        case Parameters::VIDEO_SNAPSHOT:
887        default:
888            ALOGE("%s: Camera %d: Can't stop recording in state %s",
889                    __FUNCTION__, mCameraId,
890                    Parameters::getStateName(l.mParameters.state));
891            return;
892    };
893
894    mCameraService->playSound(CameraService::SOUND_RECORDING);
895
896    res = startPreviewL(l.mParameters, true);
897    if (res != OK) {
898        ALOGE("%s: Camera %d: Unable to return to preview",
899                __FUNCTION__, mCameraId);
900    }
901}
902
903bool Camera2Client::recordingEnabled() {
904    ATRACE_CALL();
905    Mutex::Autolock icl(mICameraLock);
906
907    if ( checkPid(__FUNCTION__) != OK) return false;
908
909    return recordingEnabledL();
910}
911
912bool Camera2Client::recordingEnabledL() {
913    ATRACE_CALL();
914    SharedParameters::Lock l(mParameters);
915
916    return (l.mParameters.state == Parameters::RECORD
917            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
918}
919
920void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
921    ATRACE_CALL();
922    Mutex::Autolock icl(mICameraLock);
923    if ( checkPid(__FUNCTION__) != OK) return;
924
925    mStreamingProcessor->releaseRecordingFrame(mem);
926}
927
928status_t Camera2Client::autoFocus() {
929    ATRACE_CALL();
930    Mutex::Autolock icl(mICameraLock);
931    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
932    status_t res;
933    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
934
935    int triggerId;
936    {
937        SharedParameters::Lock l(mParameters);
938        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
939        triggerId = l.mParameters.currentAfTriggerId;
940    }
941
942    mDevice->triggerAutofocus(triggerId);
943
944    return OK;
945}
946
947status_t Camera2Client::cancelAutoFocus() {
948    ATRACE_CALL();
949    Mutex::Autolock icl(mICameraLock);
950    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
951    status_t res;
952    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
953
954    int triggerId;
955    {
956        SharedParameters::Lock l(mParameters);
957        triggerId = ++l.mParameters.afTriggerCounter;
958    }
959
960    mDevice->triggerCancelAutofocus(triggerId);
961
962    return OK;
963}
964
965status_t Camera2Client::takePicture(int msgType) {
966    ATRACE_CALL();
967    Mutex::Autolock icl(mICameraLock);
968    status_t res;
969    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
970
971    SharedParameters::Lock l(mParameters);
972    switch (l.mParameters.state) {
973        case Parameters::DISCONNECTED:
974        case Parameters::STOPPED:
975        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
976            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
977                    __FUNCTION__, mCameraId);
978            return INVALID_OPERATION;
979        case Parameters::PREVIEW:
980            // Good to go for takePicture
981            res = commandStopFaceDetectionL(l.mParameters);
982            if (res != OK) {
983                ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
984                        __FUNCTION__, mCameraId);
985                return res;
986            }
987            l.mParameters.state = Parameters::STILL_CAPTURE;
988            break;
989        case Parameters::RECORD:
990            // Good to go for video snapshot
991            l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
992            break;
993        case Parameters::STILL_CAPTURE:
994        case Parameters::VIDEO_SNAPSHOT:
995            ALOGE("%s: Camera %d: Already taking a picture",
996                    __FUNCTION__, mCameraId);
997            return INVALID_OPERATION;
998    }
999
1000    ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1001
1002    res = mJpegProcessor->updateStream(l.mParameters);
1003    if (res != OK) {
1004        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1005                __FUNCTION__, mCameraId, strerror(-res), res);
1006        return res;
1007    }
1008
1009    res = mCaptureSequencer->startCapture();
1010    if (res != OK) {
1011        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
1012                __FUNCTION__, mCameraId, strerror(-res), res);
1013    }
1014
1015    return res;
1016}
1017
1018status_t Camera2Client::setParameters(const String8& params) {
1019    ATRACE_CALL();
1020    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1021    Mutex::Autolock icl(mICameraLock);
1022    status_t res;
1023    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1024
1025    SharedParameters::Lock l(mParameters);
1026
1027    res = l.mParameters.set(params);
1028    if (res != OK) return res;
1029
1030    res = updateRequests(l.mParameters);
1031
1032    return res;
1033}
1034
1035String8 Camera2Client::getParameters() const {
1036    ATRACE_CALL();
1037    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1038    Mutex::Autolock icl(mICameraLock);
1039    if ( checkPid(__FUNCTION__) != OK) return String8();
1040
1041    SharedParameters::ReadLock l(mParameters);
1042
1043    return l.mParameters.get();
1044}
1045
1046status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1047    ATRACE_CALL();
1048    Mutex::Autolock icl(mICameraLock);
1049    status_t res;
1050    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1051
1052    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1053            cmd, arg1, arg2);
1054
1055    switch (cmd) {
1056        case CAMERA_CMD_START_SMOOTH_ZOOM:
1057            return commandStartSmoothZoomL();
1058        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1059            return commandStopSmoothZoomL();
1060        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1061            return commandSetDisplayOrientationL(arg1);
1062        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1063            return commandEnableShutterSoundL(arg1 == 1);
1064        case CAMERA_CMD_PLAY_RECORDING_SOUND:
1065            return commandPlayRecordingSoundL();
1066        case CAMERA_CMD_START_FACE_DETECTION:
1067            return commandStartFaceDetectionL(arg1);
1068        case CAMERA_CMD_STOP_FACE_DETECTION: {
1069            SharedParameters::Lock l(mParameters);
1070            return commandStopFaceDetectionL(l.mParameters);
1071        }
1072        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1073            return commandEnableFocusMoveMsgL(arg1 == 1);
1074        case CAMERA_CMD_PING:
1075            return commandPingL();
1076        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1077            return commandSetVideoBufferCountL(arg1);
1078        default:
1079            ALOGE("%s: Unknown command %d (arguments %d, %d)",
1080                    __FUNCTION__, cmd, arg1, arg2);
1081            return BAD_VALUE;
1082    }
1083}
1084
1085status_t Camera2Client::commandStartSmoothZoomL() {
1086    ALOGE("%s: Unimplemented!", __FUNCTION__);
1087    return OK;
1088}
1089
1090status_t Camera2Client::commandStopSmoothZoomL() {
1091    ALOGE("%s: Unimplemented!", __FUNCTION__);
1092    return OK;
1093}
1094
1095status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
1096    int transform = Parameters::degToTransform(degrees,
1097            mCameraFacing == CAMERA_FACING_FRONT);
1098    if (transform == -1) {
1099        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1100                __FUNCTION__, mCameraId, degrees);
1101        return BAD_VALUE;
1102    }
1103    SharedParameters::Lock l(mParameters);
1104    if (transform != l.mParameters.previewTransform &&
1105            getPreviewStreamId() != NO_STREAM) {
1106        mDevice->setStreamTransform(getPreviewStreamId(), transform);
1107    }
1108    l.mParameters.previewTransform = transform;
1109    return OK;
1110}
1111
1112status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
1113    SharedParameters::Lock l(mParameters);
1114    if (enable) {
1115        l.mParameters.playShutterSound = true;
1116        return OK;
1117    }
1118
1119    // Disabling shutter sound may not be allowed. In that case only
1120    // allow the mediaserver process to disable the sound.
1121    char value[PROPERTY_VALUE_MAX];
1122    property_get("ro.camera.sound.forced", value, "0");
1123    if (strncmp(value, "0", 2) != 0) {
1124        // Disabling shutter sound is not allowed. Deny if the current
1125        // process is not mediaserver.
1126        if (getCallingPid() != getpid()) {
1127            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1128                    getCallingPid());
1129            return PERMISSION_DENIED;
1130        }
1131    }
1132
1133    l.mParameters.playShutterSound = false;
1134    return OK;
1135}
1136
1137status_t Camera2Client::commandPlayRecordingSoundL() {
1138    mCameraService->playSound(CameraService::SOUND_RECORDING);
1139    return OK;
1140}
1141
1142status_t Camera2Client::commandStartFaceDetectionL(int type) {
1143    ALOGV("%s: Camera %d: Starting face detection",
1144          __FUNCTION__, mCameraId);
1145    status_t res;
1146    SharedParameters::Lock l(mParameters);
1147    switch (l.mParameters.state) {
1148        case Parameters::DISCONNECTED:
1149        case Parameters::STOPPED:
1150        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1151        case Parameters::STILL_CAPTURE:
1152            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
1153                    __FUNCTION__, mCameraId);
1154            return INVALID_OPERATION;
1155        case Parameters::PREVIEW:
1156        case Parameters::RECORD:
1157        case Parameters::VIDEO_SNAPSHOT:
1158            // Good to go for starting face detect
1159            break;
1160    }
1161    // Ignoring type
1162    if (l.mParameters.fastInfo.bestFaceDetectMode ==
1163            ANDROID_STATS_FACE_DETECTION_OFF) {
1164        ALOGE("%s: Camera %d: Face detection not supported",
1165                __FUNCTION__, mCameraId);
1166        return INVALID_OPERATION;
1167    }
1168    if (l.mParameters.enableFaceDetect) return OK;
1169
1170    l.mParameters.enableFaceDetect = true;
1171
1172    res = updateRequests(l.mParameters);
1173
1174    return res;
1175}
1176
1177status_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
1178    status_t res = OK;
1179    ALOGV("%s: Camera %d: Stopping face detection",
1180          __FUNCTION__, mCameraId);
1181
1182    if (!params.enableFaceDetect) return OK;
1183
1184    params.enableFaceDetect = false;
1185
1186    if (params.state == Parameters::PREVIEW
1187            || params.state == Parameters::RECORD
1188            || params.state == Parameters::VIDEO_SNAPSHOT) {
1189        res = updateRequests(params);
1190    }
1191
1192    return res;
1193}
1194
1195status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
1196    SharedParameters::Lock l(mParameters);
1197    l.mParameters.enableFocusMoveMessages = enable;
1198
1199    return OK;
1200}
1201
1202status_t Camera2Client::commandPingL() {
1203    // Always ping back if access is proper and device is alive
1204    SharedParameters::Lock l(mParameters);
1205    if (l.mParameters.state != Parameters::DISCONNECTED) {
1206        return OK;
1207    } else {
1208        return NO_INIT;
1209    }
1210}
1211
1212status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
1213    if (recordingEnabledL()) {
1214        ALOGE("%s: Camera %d: Error setting video buffer count after "
1215                "recording was started", __FUNCTION__, mCameraId);
1216        return INVALID_OPERATION;
1217    }
1218
1219    return mStreamingProcessor->setRecordingBufferCount(count);
1220}
1221
1222/** Device-related methods */
1223
1224void Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1225    ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1226}
1227
1228void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1229    ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1230            frameNumber, timestamp);
1231}
1232
1233void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1234    ALOGV("%s: Autofocus state now %d, last trigger %d",
1235            __FUNCTION__, newState, triggerId);
1236    bool sendCompletedMessage = false;
1237    bool sendMovingMessage = false;
1238
1239    bool success = false;
1240    bool afInMotion = false;
1241    {
1242        SharedParameters::Lock l(mParameters);
1243        switch (l.mParameters.focusMode) {
1244            case Parameters::FOCUS_MODE_AUTO:
1245            case Parameters::FOCUS_MODE_MACRO:
1246                // Don't send notifications upstream if they're not for the current AF
1247                // trigger. For example, if cancel was called in between, or if we
1248                // already sent a notification about this AF call.
1249                if (triggerId != l.mParameters.currentAfTriggerId) break;
1250                switch (newState) {
1251                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1252                        success = true;
1253                        // no break
1254                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1255                        sendCompletedMessage = true;
1256                        l.mParameters.currentAfTriggerId = -1;
1257                        break;
1258                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1259                        // Just starting focusing, ignore
1260                        break;
1261                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1262                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1263                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1264                    default:
1265                        // Unexpected in AUTO/MACRO mode
1266                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1267                                __FUNCTION__, newState);
1268                        break;
1269                }
1270                break;
1271            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1272            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1273                switch (newState) {
1274                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1275                        success = true;
1276                        // no break
1277                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1278                        // Don't send notifications upstream if they're not for
1279                        // the current AF trigger. For example, if cancel was
1280                        // called in between, or if we already sent a
1281                        // notification about this AF call.
1282                        // Send both a 'AF done' callback and a 'AF move' callback
1283                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1284                        sendCompletedMessage = true;
1285                        afInMotion = false;
1286                        if (l.mParameters.enableFocusMoveMessages &&
1287                                l.mParameters.afInMotion) {
1288                            sendMovingMessage = true;
1289                        }
1290                        l.mParameters.currentAfTriggerId = -1;
1291                        break;
1292                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1293                        // Cancel was called, or we switched state; care if
1294                        // currently moving
1295                        afInMotion = false;
1296                        if (l.mParameters.enableFocusMoveMessages &&
1297                                l.mParameters.afInMotion) {
1298                            sendMovingMessage = true;
1299                        }
1300                        break;
1301                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1302                        // Start passive scan, inform upstream
1303                        afInMotion = true;
1304                        // no break
1305                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1306                        // Stop passive scan, inform upstream
1307                        if (l.mParameters.enableFocusMoveMessages) {
1308                            sendMovingMessage = true;
1309                        }
1310                        break;
1311                }
1312                l.mParameters.afInMotion = afInMotion;
1313                break;
1314            case Parameters::FOCUS_MODE_EDOF:
1315            case Parameters::FOCUS_MODE_INFINITY:
1316            case Parameters::FOCUS_MODE_FIXED:
1317            default:
1318                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1319                    ALOGE("%s: Unexpected AF state change %d "
1320                            "(ID %d) in focus mode %d",
1321                          __FUNCTION__, newState, triggerId,
1322                            l.mParameters.focusMode);
1323                }
1324        }
1325    }
1326    if (sendMovingMessage) {
1327        SharedCameraClient::Lock l(mSharedCameraClient);
1328        if (l.mCameraClient != 0) {
1329            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
1330                    afInMotion ? 1 : 0, 0);
1331        }
1332    }
1333    if (sendCompletedMessage) {
1334        SharedCameraClient::Lock l(mSharedCameraClient);
1335        if (l.mCameraClient != 0) {
1336            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1337                    success ? 1 : 0, 0);
1338        }
1339    }
1340}
1341
1342void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1343    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1344            __FUNCTION__, newState, triggerId);
1345    mCaptureSequencer->notifyAutoExposure(newState, triggerId);
1346}
1347
1348void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1349    ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1350            __FUNCTION__, newState, triggerId);
1351}
1352
1353int Camera2Client::getCameraId() const {
1354    return mCameraId;
1355}
1356
1357const sp<Camera2Device>& Camera2Client::getCameraDevice() {
1358    return mDevice;
1359}
1360
1361const sp<CameraService>& Camera2Client::getCameraService() {
1362    return mCameraService;
1363}
1364
1365camera2::SharedParameters& Camera2Client::getParameters() {
1366    return mParameters;
1367}
1368
1369int Camera2Client::getPreviewStreamId() const {
1370    return mStreamingProcessor->getPreviewStreamId();
1371}
1372
1373int Camera2Client::getCaptureStreamId() const {
1374    return mJpegProcessor->getStreamId();
1375}
1376
1377int Camera2Client::getCallbackStreamId() const {
1378    return mCallbackProcessor->getStreamId();
1379}
1380
1381int Camera2Client::getRecordingStreamId() const {
1382    return mStreamingProcessor->getRecordingStreamId();
1383}
1384
1385int Camera2Client::getZslStreamId() const {
1386    return mZslProcessor->getStreamId();
1387}
1388
1389status_t Camera2Client::registerFrameListener(int32_t id,
1390        wp<camera2::FrameProcessor::FilteredListener> listener) {
1391    return mFrameProcessor->registerListener(id, listener);
1392}
1393
1394status_t Camera2Client::removeFrameListener(int32_t id) {
1395    return mFrameProcessor->removeListener(id);
1396}
1397
1398Camera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1399        mCameraClient(client.mCameraClient),
1400        mSharedClient(client) {
1401    mSharedClient.mCameraClientLock.lock();
1402}
1403
1404Camera2Client::SharedCameraClient::Lock::~Lock() {
1405    mSharedClient.mCameraClientLock.unlock();
1406}
1407
1408Camera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1409        mCameraClient(client) {
1410}
1411
1412Camera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1413        const sp<ICameraClient>&client) {
1414    Mutex::Autolock l(mCameraClientLock);
1415    mCameraClient = client;
1416    return *this;
1417}
1418
1419void Camera2Client::SharedCameraClient::clear() {
1420    Mutex::Autolock l(mCameraClientLock);
1421    mCameraClient.clear();
1422}
1423
1424const int32_t Camera2Client::kPreviewRequestId;
1425const int32_t Camera2Client::kRecordRequestId;
1426const int32_t Camera2Client::kFirstCaptureRequestId;
1427
1428/** Utility methods */
1429
1430status_t Camera2Client::updateRequests(Parameters &params) {
1431    status_t res;
1432
1433    res = mStreamingProcessor->updatePreviewRequest(params);
1434    if (res != OK) {
1435        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1436                __FUNCTION__, mCameraId, strerror(-res), res);
1437        return res;
1438    }
1439    res = mStreamingProcessor->updateRecordingRequest(params);
1440    if (res != OK) {
1441        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1442                __FUNCTION__, mCameraId, strerror(-res), res);
1443        return res;
1444    }
1445
1446    if (params.state == Parameters::PREVIEW) {
1447        res = startPreviewL(params, true);
1448        if (res != OK) {
1449            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1450                    __FUNCTION__, mCameraId, strerror(-res), res);
1451            return res;
1452        }
1453    } else if (params.state == Parameters::RECORD ||
1454            params.state == Parameters::VIDEO_SNAPSHOT) {
1455        res = startRecordingL(params, true);
1456        if (res != OK) {
1457            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1458                    __FUNCTION__, mCameraId, strerror(-res), res);
1459            return res;
1460        }
1461    }
1462    return res;
1463}
1464
1465
1466size_t Camera2Client::calculateBufferSize(int width, int height,
1467        int format, int stride) {
1468    switch (format) {
1469        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1470            return width * height * 2;
1471        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1472            return width * height * 3 / 2;
1473        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1474            return width * height * 2;
1475        case HAL_PIXEL_FORMAT_YV12: {      // YV12
1476            size_t ySize = stride * height;
1477            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
1478            size_t uvSize = uvStride * height / 2;
1479            return ySize + uvSize * 2;
1480        }
1481        case HAL_PIXEL_FORMAT_RGB_565:
1482            return width * height * 2;
1483        case HAL_PIXEL_FORMAT_RGBA_8888:
1484            return width * height * 4;
1485        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1486            return width * height * 2;
1487        default:
1488            ALOGE("%s: Unknown preview format: %x",
1489                    __FUNCTION__,  format);
1490            return 0;
1491    }
1492}
1493
1494} // namespace android
1495