Camera2Client.cpp revision 7373cbe85e617345f7002256a4be389fe62af913
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 (p.quirks.meteringCropRegion) {
338        result.appendFormat("    meteringCropRegion\n");
339        haveQuirk = true;
340    }
341    if (!haveQuirk) {
342        result.appendFormat("    none\n");
343    }
344
345    write(fd, result.string(), result.size());
346
347    mStreamingProcessor->dump(fd, args);
348
349    mCaptureSequencer->dump(fd, args);
350
351    mFrameProcessor->dump(fd, args);
352
353    mZslProcessor->dump(fd, args);
354
355    result = "  Device dump:\n";
356    write(fd, result.string(), result.size());
357
358    status_t res = mDevice->dump(fd, args);
359    if (res != OK) {
360        result = String8::format("   Error dumping device: %s (%d)",
361                strerror(-res), res);
362        write(fd, result.string(), result.size());
363    }
364
365#undef CASE_APPEND_ENUM
366    return NO_ERROR;
367}
368
369// ICamera interface
370
371void Camera2Client::disconnect() {
372    ATRACE_CALL();
373    Mutex::Autolock icl(mICameraLock);
374    status_t res;
375    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
376
377    if (mDevice == 0) return;
378
379    ALOGV("Camera %d: Shutting down", mCameraId);
380
381    stopPreviewL();
382
383    {
384        SharedParameters::Lock l(mParameters);
385        l.mParameters.state = Parameters::DISCONNECTED;
386    }
387
388    mStreamingProcessor->deletePreviewStream();
389    mStreamingProcessor->deleteRecordingStream();
390    mJpegProcessor->deleteStream();
391    mCallbackProcessor->deleteStream();
392    mZslProcessor->deleteStream();
393
394    mFrameProcessor->requestExit();
395    mCaptureSequencer->requestExit();
396    mJpegProcessor->requestExit();
397    mZslProcessor->requestExit();
398    mCallbackProcessor->requestExit();
399
400    ALOGV("Camera %d: Waiting for threads", mCameraId);
401
402    mFrameProcessor->join();
403    mCaptureSequencer->join();
404    mJpegProcessor->join();
405    mZslProcessor->join();
406    mCallbackProcessor->join();
407
408    ALOGV("Camera %d: Disconnecting device", mCameraId);
409
410    mDevice->disconnect();
411
412    mDevice.clear();
413
414    CameraService::Client::disconnect();
415}
416
417status_t Camera2Client::connect(const sp<ICameraClient>& client) {
418    ATRACE_CALL();
419    ALOGV("%s: E", __FUNCTION__);
420    Mutex::Autolock icl(mICameraLock);
421
422    if (mClientPid != 0 && getCallingPid() != mClientPid) {
423        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
424                "current locked to pid %d", __FUNCTION__,
425                mCameraId, getCallingPid(), mClientPid);
426        return BAD_VALUE;
427    }
428
429    mClientPid = getCallingPid();
430
431    mCameraClient = client;
432    mSharedCameraClient = client;
433
434    return OK;
435}
436
437status_t Camera2Client::lock() {
438    ATRACE_CALL();
439    ALOGV("%s: E", __FUNCTION__);
440    Mutex::Autolock icl(mICameraLock);
441    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
442            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
443
444    if (mClientPid == 0) {
445        mClientPid = getCallingPid();
446        return OK;
447    }
448
449    if (mClientPid != getCallingPid()) {
450        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
451                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
452        return EBUSY;
453    }
454
455    return OK;
456}
457
458status_t Camera2Client::unlock() {
459    ATRACE_CALL();
460    ALOGV("%s: E", __FUNCTION__);
461    Mutex::Autolock icl(mICameraLock);
462    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
463            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
464
465    // TODO: Check for uninterruptable conditions
466
467    if (mClientPid == getCallingPid()) {
468        mClientPid = 0;
469        mCameraClient.clear();
470        mSharedCameraClient.clear();
471        return OK;
472    }
473
474    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
475            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
476    return EBUSY;
477}
478
479status_t Camera2Client::setPreviewDisplay(
480        const sp<Surface>& surface) {
481    ATRACE_CALL();
482    ALOGV("%s: E", __FUNCTION__);
483    Mutex::Autolock icl(mICameraLock);
484    status_t res;
485    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
486
487    sp<IBinder> binder;
488    sp<ANativeWindow> window;
489    if (surface != 0) {
490        binder = surface->asBinder();
491        window = surface;
492    }
493
494    return setPreviewWindowL(binder,window);
495}
496
497status_t Camera2Client::setPreviewTexture(
498        const sp<ISurfaceTexture>& surfaceTexture) {
499    ATRACE_CALL();
500    ALOGV("%s: E", __FUNCTION__);
501    Mutex::Autolock icl(mICameraLock);
502    status_t res;
503    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
504
505    sp<IBinder> binder;
506    sp<ANativeWindow> window;
507    if (surfaceTexture != 0) {
508        binder = surfaceTexture->asBinder();
509        window = new SurfaceTextureClient(surfaceTexture);
510    }
511    return setPreviewWindowL(binder, window);
512}
513
514status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
515        sp<ANativeWindow> window) {
516    ATRACE_CALL();
517    status_t res;
518
519    if (binder == mPreviewSurface) {
520        ALOGV("%s: Camera %d: New window is same as old window",
521                __FUNCTION__, mCameraId);
522        return NO_ERROR;
523    }
524
525    SharedParameters::Lock l(mParameters);
526    switch (l.mParameters.state) {
527        case Parameters::DISCONNECTED:
528        case Parameters::RECORD:
529        case Parameters::STILL_CAPTURE:
530        case Parameters::VIDEO_SNAPSHOT:
531            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
532                    __FUNCTION__, mCameraId,
533                    Parameters::getStateName(l.mParameters.state));
534            return INVALID_OPERATION;
535        case Parameters::STOPPED:
536        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
537            // OK
538            break;
539        case Parameters::PREVIEW:
540            // Already running preview - need to stop and create a new stream
541            // TODO: Optimize this so that we don't wait for old stream to drain
542            // before spinning up new stream
543            mStreamingProcessor->stopStream();
544            l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
545            break;
546    }
547
548    mPreviewSurface = binder;
549    res = mStreamingProcessor->setPreviewWindow(window);
550    if (res != OK) {
551        ALOGE("%s: Unable to set new preview window: %s (%d)",
552                __FUNCTION__, strerror(-res), res);
553        return res;
554    }
555
556    if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
557        return startPreviewL(l.mParameters, false);
558    }
559
560    return OK;
561}
562
563void Camera2Client::setPreviewCallbackFlag(int flag) {
564    ATRACE_CALL();
565    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
566    Mutex::Autolock icl(mICameraLock);
567    status_t res;
568    if ( checkPid(__FUNCTION__) != OK) return;
569
570    SharedParameters::Lock l(mParameters);
571    setPreviewCallbackFlagL(l.mParameters, flag);
572}
573
574void Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
575    status_t res = OK;
576    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
577        ALOGV("%s: setting oneshot", __FUNCTION__);
578        params.previewCallbackOneShot = true;
579    }
580    if (params.previewCallbackFlags != (uint32_t)flag) {
581        params.previewCallbackFlags = flag;
582        switch(params.state) {
583        case Parameters::PREVIEW:
584            res = startPreviewL(params, true);
585            break;
586        case Parameters::RECORD:
587        case Parameters::VIDEO_SNAPSHOT:
588            res = startRecordingL(params, true);
589            break;
590        default:
591            break;
592        }
593        if (res != OK) {
594            ALOGE("%s: Camera %d: Unable to refresh request in state %s",
595                    __FUNCTION__, mCameraId,
596                    Parameters::getStateName(params.state));
597        }
598    }
599
600}
601
602status_t Camera2Client::startPreview() {
603    ATRACE_CALL();
604    ALOGV("%s: E", __FUNCTION__);
605    Mutex::Autolock icl(mICameraLock);
606    status_t res;
607    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
608    SharedParameters::Lock l(mParameters);
609    return startPreviewL(l.mParameters, false);
610}
611
612status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
613    ATRACE_CALL();
614    status_t res;
615
616    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
617
618    if (params.state == Parameters::PREVIEW && !restart) {
619        // Succeed attempt to re-enter preview state
620        ALOGI("%s: Not starting preview; already in preview state.",
621              __FUNCTION__);
622        return OK;
623    }
624    if (params.state > Parameters::PREVIEW && !restart) {
625        ALOGE("%s: Can't start preview in state %s",
626                __FUNCTION__,
627                Parameters::getStateName(params.state));
628        return INVALID_OPERATION;
629    }
630
631    if (!mStreamingProcessor->haveValidPreviewWindow()) {
632        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
633        return OK;
634    }
635    params.state = Parameters::STOPPED;
636
637    res = mStreamingProcessor->updatePreviewStream(params);
638    if (res != OK) {
639        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
640                __FUNCTION__, mCameraId, strerror(-res), res);
641        return res;
642    }
643
644    Vector<uint8_t> outputStreams;
645    bool callbacksEnabled = params.previewCallbackFlags &
646        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
647    if (callbacksEnabled) {
648        res = mCallbackProcessor->updateStream(params);
649        if (res != OK) {
650            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
651                    __FUNCTION__, mCameraId, strerror(-res), res);
652            return res;
653        }
654        outputStreams.push(getCallbackStreamId());
655    }
656    if (params.zslMode && !params.recordingHint) {
657        res = mZslProcessor->updateStream(params);
658        if (res != OK) {
659            ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
660                    __FUNCTION__, mCameraId, strerror(-res), res);
661            return res;
662        }
663        outputStreams.push(getZslStreamId());
664    }
665
666    outputStreams.push(getPreviewStreamId());
667
668    if (!params.recordingHint) {
669        if (!restart) {
670            res = mStreamingProcessor->updatePreviewRequest(params);
671            if (res != OK) {
672                ALOGE("%s: Camera %d: Can't set up preview request: "
673                        "%s (%d)", __FUNCTION__, mCameraId,
674                        strerror(-res), res);
675                return res;
676            }
677        }
678        res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW,
679                outputStreams);
680    } else {
681        // With recording hint set, we're going to be operating under the
682        // assumption that the user will record video. To optimize recording
683        // startup time, create the necessary output streams for recording and
684        // video snapshot now if they don't already exist.
685        res = mJpegProcessor->updateStream(params);
686        if (res != OK) {
687            ALOGE("%s: Camera %d: Can't pre-configure still image "
688                    "stream: %s (%d)",
689                    __FUNCTION__, mCameraId, strerror(-res), res);
690            return res;
691        }
692
693        if (!restart) {
694            res = mStreamingProcessor->updateRecordingRequest(params);
695            if (res != OK) {
696                ALOGE("%s: Camera %d: Can't set up preview request with "
697                        "record hint: %s (%d)", __FUNCTION__, mCameraId,
698                        strerror(-res), res);
699                return res;
700            }
701        }
702        res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
703                outputStreams);
704    }
705    if (res != OK) {
706        ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)",
707                __FUNCTION__, mCameraId, strerror(-res), res);
708        return res;
709    }
710
711    params.state = Parameters::PREVIEW;
712    return OK;
713}
714
715void Camera2Client::stopPreview() {
716    ATRACE_CALL();
717    ALOGV("%s: E", __FUNCTION__);
718    Mutex::Autolock icl(mICameraLock);
719    status_t res;
720    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
721    stopPreviewL();
722}
723
724void Camera2Client::stopPreviewL() {
725    ATRACE_CALL();
726    status_t res;
727    Parameters::State state;
728    {
729        SharedParameters::Lock l(mParameters);
730        state = l.mParameters.state;
731    }
732
733    switch (state) {
734        case Parameters::DISCONNECTED:
735            ALOGE("%s: Camera %d: Call before initialized",
736                    __FUNCTION__, mCameraId);
737            break;
738        case Parameters::STOPPED:
739            break;
740        case Parameters::STILL_CAPTURE:
741            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
742                    __FUNCTION__, mCameraId);
743            break;
744        case Parameters::RECORD:
745            // no break - identical to preview
746        case Parameters::PREVIEW:
747            mStreamingProcessor->stopStream();
748            res = mDevice->waitUntilDrained();
749            if (res != OK) {
750                ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
751                        __FUNCTION__, mCameraId, strerror(-res), res);
752            }
753            // no break
754        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
755            SharedParameters::Lock l(mParameters);
756            l.mParameters.state = Parameters::STOPPED;
757            commandStopFaceDetectionL(l.mParameters);
758            break;
759        }
760        default:
761            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
762                    state);
763    }
764}
765
766bool Camera2Client::previewEnabled() {
767    ATRACE_CALL();
768    Mutex::Autolock icl(mICameraLock);
769    status_t res;
770    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
771
772    SharedParameters::Lock l(mParameters);
773    return l.mParameters.state == Parameters::PREVIEW;
774}
775
776status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
777    ATRACE_CALL();
778    Mutex::Autolock icl(mICameraLock);
779    status_t res;
780    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
781
782    SharedParameters::Lock l(mParameters);
783    switch (l.mParameters.state) {
784        case Parameters::RECORD:
785        case Parameters::VIDEO_SNAPSHOT:
786            ALOGE("%s: Camera %d: Can't be called in state %s",
787                    __FUNCTION__, mCameraId,
788                    Parameters::getStateName(l.mParameters.state));
789            return INVALID_OPERATION;
790        default:
791            // OK
792            break;
793    }
794
795    l.mParameters.storeMetadataInBuffers = enabled;
796
797    return OK;
798}
799
800status_t Camera2Client::startRecording() {
801    ATRACE_CALL();
802    ALOGV("%s: E", __FUNCTION__);
803    Mutex::Autolock icl(mICameraLock);
804    status_t res;
805    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
806    SharedParameters::Lock l(mParameters);
807
808    return startRecordingL(l.mParameters, false);
809}
810
811status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
812    status_t res;
813
814    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
815
816    switch (params.state) {
817        case Parameters::STOPPED:
818            res = startPreviewL(params, false);
819            if (res != OK) return res;
820            break;
821        case Parameters::PREVIEW:
822            // Ready to go
823            break;
824        case Parameters::RECORD:
825        case Parameters::VIDEO_SNAPSHOT:
826            // OK to call this when recording is already on, just skip unless
827            // we're looking to restart
828            if (!restart) return OK;
829            break;
830        default:
831            ALOGE("%s: Camera %d: Can't start recording in state %s",
832                    __FUNCTION__, mCameraId,
833                    Parameters::getStateName(params.state));
834            return INVALID_OPERATION;
835    };
836
837    if (!params.storeMetadataInBuffers) {
838        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
839                "non-metadata recording mode requested!", __FUNCTION__,
840                mCameraId);
841        return INVALID_OPERATION;
842    }
843
844    if (!restart) {
845        mCameraService->playSound(CameraService::SOUND_RECORDING);
846        mStreamingProcessor->updateRecordingRequest(params);
847        if (res != OK) {
848            ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
849                    __FUNCTION__, mCameraId, strerror(-res), res);
850            return res;
851        }
852    }
853
854    res = mStreamingProcessor->updateRecordingStream(params);
855    if (res != OK) {
856        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
857                __FUNCTION__, mCameraId, strerror(-res), res);
858        return res;
859    }
860
861    Vector<uint8_t> outputStreams;
862    bool callbacksEnabled = params.previewCallbackFlags &
863        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
864    if (callbacksEnabled) {
865        res = mCallbackProcessor->updateStream(params);
866        if (res != OK) {
867            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
868                    __FUNCTION__, mCameraId, strerror(-res), res);
869            return res;
870        }
871        outputStreams.push(getCallbackStreamId());
872    }
873    outputStreams.push(getPreviewStreamId());
874    outputStreams.push(getRecordingStreamId());
875
876    res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
877            outputStreams);
878    if (res != OK) {
879        ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)",
880                __FUNCTION__, mCameraId, strerror(-res), res);
881        return res;
882    }
883
884    if (params.state < Parameters::RECORD) {
885        params.state = Parameters::RECORD;
886    }
887
888    return OK;
889}
890
891void Camera2Client::stopRecording() {
892    ATRACE_CALL();
893    ALOGV("%s: E", __FUNCTION__);
894    Mutex::Autolock icl(mICameraLock);
895    SharedParameters::Lock l(mParameters);
896
897    status_t res;
898    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
899
900    switch (l.mParameters.state) {
901        case Parameters::RECORD:
902            // OK to stop
903            break;
904        case Parameters::STOPPED:
905        case Parameters::PREVIEW:
906        case Parameters::STILL_CAPTURE:
907        case Parameters::VIDEO_SNAPSHOT:
908        default:
909            ALOGE("%s: Camera %d: Can't stop recording in state %s",
910                    __FUNCTION__, mCameraId,
911                    Parameters::getStateName(l.mParameters.state));
912            return;
913    };
914
915    mCameraService->playSound(CameraService::SOUND_RECORDING);
916
917    res = startPreviewL(l.mParameters, true);
918    if (res != OK) {
919        ALOGE("%s: Camera %d: Unable to return to preview",
920                __FUNCTION__, mCameraId);
921    }
922}
923
924bool Camera2Client::recordingEnabled() {
925    ATRACE_CALL();
926    Mutex::Autolock icl(mICameraLock);
927
928    if ( checkPid(__FUNCTION__) != OK) return false;
929
930    return recordingEnabledL();
931}
932
933bool Camera2Client::recordingEnabledL() {
934    ATRACE_CALL();
935    SharedParameters::Lock l(mParameters);
936
937    return (l.mParameters.state == Parameters::RECORD
938            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
939}
940
941void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
942    ATRACE_CALL();
943    Mutex::Autolock icl(mICameraLock);
944    if ( checkPid(__FUNCTION__) != OK) return;
945
946    mStreamingProcessor->releaseRecordingFrame(mem);
947}
948
949status_t Camera2Client::autoFocus() {
950    ATRACE_CALL();
951    Mutex::Autolock icl(mICameraLock);
952    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
953    status_t res;
954    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
955
956    int triggerId;
957    {
958        SharedParameters::Lock l(mParameters);
959        if (l.mParameters.state < Parameters::PREVIEW) {
960            return INVALID_OPERATION;
961        }
962
963        if (l.mParameters.quirks.triggerAfWithAuto &&
964                l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED &&
965                l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO) {
966            ALOGV("%s: Quirk: Switching from focusMode %d to AUTO",
967                    __FUNCTION__, l.mParameters.focusMode);
968            l.mParameters.shadowFocusMode = l.mParameters.focusMode;
969            l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
970            updateRequests(l.mParameters);
971        }
972
973        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
974        triggerId = l.mParameters.currentAfTriggerId;
975    }
976    syncWithDevice();
977
978    mDevice->triggerAutofocus(triggerId);
979
980    return OK;
981}
982
983status_t Camera2Client::cancelAutoFocus() {
984    ATRACE_CALL();
985    Mutex::Autolock icl(mICameraLock);
986    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
987    status_t res;
988    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
989
990    int triggerId;
991    {
992        SharedParameters::Lock l(mParameters);
993        triggerId = ++l.mParameters.afTriggerCounter;
994
995        // When using triggerAfWithAuto quirk, may need to reset focus mode to
996        // the real state at this point.
997        if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) {
998            ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__,
999                    l.mParameters.shadowFocusMode);
1000            l.mParameters.focusMode = l.mParameters.shadowFocusMode;
1001            l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID;
1002            updateRequests(l.mParameters);
1003        }
1004    }
1005    syncWithDevice();
1006
1007    mDevice->triggerCancelAutofocus(triggerId);
1008
1009    return OK;
1010}
1011
1012status_t Camera2Client::takePicture(int msgType) {
1013    ATRACE_CALL();
1014    Mutex::Autolock icl(mICameraLock);
1015    status_t res;
1016    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1017
1018    SharedParameters::Lock l(mParameters);
1019    switch (l.mParameters.state) {
1020        case Parameters::DISCONNECTED:
1021        case Parameters::STOPPED:
1022        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1023            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1024                    __FUNCTION__, mCameraId);
1025            return INVALID_OPERATION;
1026        case Parameters::PREVIEW:
1027            // Good to go for takePicture
1028            res = commandStopFaceDetectionL(l.mParameters);
1029            if (res != OK) {
1030                ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1031                        __FUNCTION__, mCameraId);
1032                return res;
1033            }
1034            l.mParameters.state = Parameters::STILL_CAPTURE;
1035            break;
1036        case Parameters::RECORD:
1037            // Good to go for video snapshot
1038            l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1039            break;
1040        case Parameters::STILL_CAPTURE:
1041        case Parameters::VIDEO_SNAPSHOT:
1042            ALOGE("%s: Camera %d: Already taking a picture",
1043                    __FUNCTION__, mCameraId);
1044            return INVALID_OPERATION;
1045    }
1046
1047    ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1048
1049    res = mJpegProcessor->updateStream(l.mParameters);
1050    if (res != OK) {
1051        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1052                __FUNCTION__, mCameraId, strerror(-res), res);
1053        return res;
1054    }
1055
1056    // Need HAL to have correct settings before (possibly) triggering precapture
1057    syncWithDevice();
1058
1059    res = mCaptureSequencer->startCapture();
1060    if (res != OK) {
1061        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
1062                __FUNCTION__, mCameraId, strerror(-res), res);
1063    }
1064
1065    return res;
1066}
1067
1068status_t Camera2Client::setParameters(const String8& params) {
1069    ATRACE_CALL();
1070    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1071    Mutex::Autolock icl(mICameraLock);
1072    status_t res;
1073    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1074
1075    SharedParameters::Lock l(mParameters);
1076
1077    res = l.mParameters.set(params);
1078    if (res != OK) return res;
1079
1080    res = updateRequests(l.mParameters);
1081
1082    return res;
1083}
1084
1085String8 Camera2Client::getParameters() const {
1086    ATRACE_CALL();
1087    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1088    Mutex::Autolock icl(mICameraLock);
1089    if ( checkPid(__FUNCTION__) != OK) return String8();
1090
1091    SharedParameters::ReadLock l(mParameters);
1092
1093    return l.mParameters.get();
1094}
1095
1096status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1097    ATRACE_CALL();
1098    Mutex::Autolock icl(mICameraLock);
1099    status_t res;
1100    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1101
1102    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1103            cmd, arg1, arg2);
1104
1105    switch (cmd) {
1106        case CAMERA_CMD_START_SMOOTH_ZOOM:
1107            return commandStartSmoothZoomL();
1108        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1109            return commandStopSmoothZoomL();
1110        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1111            return commandSetDisplayOrientationL(arg1);
1112        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1113            return commandEnableShutterSoundL(arg1 == 1);
1114        case CAMERA_CMD_PLAY_RECORDING_SOUND:
1115            return commandPlayRecordingSoundL();
1116        case CAMERA_CMD_START_FACE_DETECTION:
1117            return commandStartFaceDetectionL(arg1);
1118        case CAMERA_CMD_STOP_FACE_DETECTION: {
1119            SharedParameters::Lock l(mParameters);
1120            return commandStopFaceDetectionL(l.mParameters);
1121        }
1122        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1123            return commandEnableFocusMoveMsgL(arg1 == 1);
1124        case CAMERA_CMD_PING:
1125            return commandPingL();
1126        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1127            return commandSetVideoBufferCountL(arg1);
1128        default:
1129            ALOGE("%s: Unknown command %d (arguments %d, %d)",
1130                    __FUNCTION__, cmd, arg1, arg2);
1131            return BAD_VALUE;
1132    }
1133}
1134
1135status_t Camera2Client::commandStartSmoothZoomL() {
1136    ALOGE("%s: Unimplemented!", __FUNCTION__);
1137    return OK;
1138}
1139
1140status_t Camera2Client::commandStopSmoothZoomL() {
1141    ALOGE("%s: Unimplemented!", __FUNCTION__);
1142    return OK;
1143}
1144
1145status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
1146    int transform = Parameters::degToTransform(degrees,
1147            mCameraFacing == CAMERA_FACING_FRONT);
1148    if (transform == -1) {
1149        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1150                __FUNCTION__, mCameraId, degrees);
1151        return BAD_VALUE;
1152    }
1153    SharedParameters::Lock l(mParameters);
1154    if (transform != l.mParameters.previewTransform &&
1155            getPreviewStreamId() != NO_STREAM) {
1156        mDevice->setStreamTransform(getPreviewStreamId(), transform);
1157    }
1158    l.mParameters.previewTransform = transform;
1159    return OK;
1160}
1161
1162status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
1163    SharedParameters::Lock l(mParameters);
1164    if (enable) {
1165        l.mParameters.playShutterSound = true;
1166        return OK;
1167    }
1168
1169    // Disabling shutter sound may not be allowed. In that case only
1170    // allow the mediaserver process to disable the sound.
1171    char value[PROPERTY_VALUE_MAX];
1172    property_get("ro.camera.sound.forced", value, "0");
1173    if (strncmp(value, "0", 2) != 0) {
1174        // Disabling shutter sound is not allowed. Deny if the current
1175        // process is not mediaserver.
1176        if (getCallingPid() != getpid()) {
1177            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1178                    getCallingPid());
1179            return PERMISSION_DENIED;
1180        }
1181    }
1182
1183    l.mParameters.playShutterSound = false;
1184    return OK;
1185}
1186
1187status_t Camera2Client::commandPlayRecordingSoundL() {
1188    mCameraService->playSound(CameraService::SOUND_RECORDING);
1189    return OK;
1190}
1191
1192status_t Camera2Client::commandStartFaceDetectionL(int type) {
1193    ALOGV("%s: Camera %d: Starting face detection",
1194          __FUNCTION__, mCameraId);
1195    status_t res;
1196    SharedParameters::Lock l(mParameters);
1197    switch (l.mParameters.state) {
1198        case Parameters::DISCONNECTED:
1199        case Parameters::STOPPED:
1200        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1201        case Parameters::STILL_CAPTURE:
1202            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
1203                    __FUNCTION__, mCameraId);
1204            return INVALID_OPERATION;
1205        case Parameters::PREVIEW:
1206        case Parameters::RECORD:
1207        case Parameters::VIDEO_SNAPSHOT:
1208            // Good to go for starting face detect
1209            break;
1210    }
1211    // Ignoring type
1212    if (l.mParameters.fastInfo.bestFaceDetectMode ==
1213            ANDROID_STATS_FACE_DETECTION_OFF) {
1214        ALOGE("%s: Camera %d: Face detection not supported",
1215                __FUNCTION__, mCameraId);
1216        return INVALID_OPERATION;
1217    }
1218    if (l.mParameters.enableFaceDetect) return OK;
1219
1220    l.mParameters.enableFaceDetect = true;
1221
1222    res = updateRequests(l.mParameters);
1223
1224    return res;
1225}
1226
1227status_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
1228    status_t res = OK;
1229    ALOGV("%s: Camera %d: Stopping face detection",
1230          __FUNCTION__, mCameraId);
1231
1232    if (!params.enableFaceDetect) return OK;
1233
1234    params.enableFaceDetect = false;
1235
1236    if (params.state == Parameters::PREVIEW
1237            || params.state == Parameters::RECORD
1238            || params.state == Parameters::VIDEO_SNAPSHOT) {
1239        res = updateRequests(params);
1240    }
1241
1242    return res;
1243}
1244
1245status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
1246    SharedParameters::Lock l(mParameters);
1247    l.mParameters.enableFocusMoveMessages = enable;
1248
1249    return OK;
1250}
1251
1252status_t Camera2Client::commandPingL() {
1253    // Always ping back if access is proper and device is alive
1254    SharedParameters::Lock l(mParameters);
1255    if (l.mParameters.state != Parameters::DISCONNECTED) {
1256        return OK;
1257    } else {
1258        return NO_INIT;
1259    }
1260}
1261
1262status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
1263    if (recordingEnabledL()) {
1264        ALOGE("%s: Camera %d: Error setting video buffer count after "
1265                "recording was started", __FUNCTION__, mCameraId);
1266        return INVALID_OPERATION;
1267    }
1268
1269    return mStreamingProcessor->setRecordingBufferCount(count);
1270}
1271
1272/** Device-related methods */
1273
1274void Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1275    ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1276}
1277
1278void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1279    ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1280            frameNumber, timestamp);
1281}
1282
1283void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1284    ALOGV("%s: Autofocus state now %d, last trigger %d",
1285            __FUNCTION__, newState, triggerId);
1286    bool sendCompletedMessage = false;
1287    bool sendMovingMessage = false;
1288
1289    bool success = false;
1290    bool afInMotion = false;
1291    {
1292        SharedParameters::Lock l(mParameters);
1293        switch (l.mParameters.focusMode) {
1294            case Parameters::FOCUS_MODE_AUTO:
1295            case Parameters::FOCUS_MODE_MACRO:
1296                // Don't send notifications upstream if they're not for the current AF
1297                // trigger. For example, if cancel was called in between, or if we
1298                // already sent a notification about this AF call.
1299                if (triggerId != l.mParameters.currentAfTriggerId) break;
1300                switch (newState) {
1301                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1302                        success = true;
1303                        // no break
1304                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1305                        sendCompletedMessage = true;
1306                        l.mParameters.currentAfTriggerId = -1;
1307                        break;
1308                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1309                        // Just starting focusing, ignore
1310                        break;
1311                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1312                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1313                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1314                    default:
1315                        // Unexpected in AUTO/MACRO mode
1316                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1317                                __FUNCTION__, newState);
1318                        break;
1319                }
1320                break;
1321            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1322            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1323                switch (newState) {
1324                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1325                        success = true;
1326                        // no break
1327                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1328                        // Don't send notifications upstream if they're not for
1329                        // the current AF trigger. For example, if cancel was
1330                        // called in between, or if we already sent a
1331                        // notification about this AF call.
1332                        // Send both a 'AF done' callback and a 'AF move' callback
1333                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1334                        sendCompletedMessage = true;
1335                        afInMotion = false;
1336                        if (l.mParameters.enableFocusMoveMessages &&
1337                                l.mParameters.afInMotion) {
1338                            sendMovingMessage = true;
1339                        }
1340                        l.mParameters.currentAfTriggerId = -1;
1341                        break;
1342                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1343                        // Cancel was called, or we switched state; care if
1344                        // currently moving
1345                        afInMotion = false;
1346                        if (l.mParameters.enableFocusMoveMessages &&
1347                                l.mParameters.afInMotion) {
1348                            sendMovingMessage = true;
1349                        }
1350                        break;
1351                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1352                        // Start passive scan, inform upstream
1353                        afInMotion = true;
1354                        // no break
1355                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1356                        // Stop passive scan, inform upstream
1357                        if (l.mParameters.enableFocusMoveMessages) {
1358                            sendMovingMessage = true;
1359                        }
1360                        break;
1361                }
1362                l.mParameters.afInMotion = afInMotion;
1363                break;
1364            case Parameters::FOCUS_MODE_EDOF:
1365            case Parameters::FOCUS_MODE_INFINITY:
1366            case Parameters::FOCUS_MODE_FIXED:
1367            default:
1368                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1369                    ALOGE("%s: Unexpected AF state change %d "
1370                            "(ID %d) in focus mode %d",
1371                          __FUNCTION__, newState, triggerId,
1372                            l.mParameters.focusMode);
1373                }
1374        }
1375    }
1376    if (sendMovingMessage) {
1377        SharedCameraClient::Lock l(mSharedCameraClient);
1378        if (l.mCameraClient != 0) {
1379            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
1380                    afInMotion ? 1 : 0, 0);
1381        }
1382    }
1383    if (sendCompletedMessage) {
1384        SharedCameraClient::Lock l(mSharedCameraClient);
1385        if (l.mCameraClient != 0) {
1386            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1387                    success ? 1 : 0, 0);
1388        }
1389    }
1390}
1391
1392void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1393    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1394            __FUNCTION__, newState, triggerId);
1395    mCaptureSequencer->notifyAutoExposure(newState, triggerId);
1396}
1397
1398void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1399    ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1400            __FUNCTION__, newState, triggerId);
1401}
1402
1403int Camera2Client::getCameraId() const {
1404    return mCameraId;
1405}
1406
1407const sp<Camera2Device>& Camera2Client::getCameraDevice() {
1408    return mDevice;
1409}
1410
1411const sp<CameraService>& Camera2Client::getCameraService() {
1412    return mCameraService;
1413}
1414
1415camera2::SharedParameters& Camera2Client::getParameters() {
1416    return mParameters;
1417}
1418
1419int Camera2Client::getPreviewStreamId() const {
1420    return mStreamingProcessor->getPreviewStreamId();
1421}
1422
1423int Camera2Client::getCaptureStreamId() const {
1424    return mJpegProcessor->getStreamId();
1425}
1426
1427int Camera2Client::getCallbackStreamId() const {
1428    return mCallbackProcessor->getStreamId();
1429}
1430
1431int Camera2Client::getRecordingStreamId() const {
1432    return mStreamingProcessor->getRecordingStreamId();
1433}
1434
1435int Camera2Client::getZslStreamId() const {
1436    return mZslProcessor->getStreamId();
1437}
1438
1439status_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId,
1440        wp<camera2::FrameProcessor::FilteredListener> listener) {
1441    return mFrameProcessor->registerListener(minId, maxId, listener);
1442}
1443
1444status_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId,
1445        wp<camera2::FrameProcessor::FilteredListener> listener) {
1446    return mFrameProcessor->removeListener(minId, maxId, listener);
1447}
1448
1449status_t Camera2Client::stopStream() {
1450    return mStreamingProcessor->stopStream();
1451}
1452
1453Camera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1454        mCameraClient(client.mCameraClient),
1455        mSharedClient(client) {
1456    mSharedClient.mCameraClientLock.lock();
1457}
1458
1459Camera2Client::SharedCameraClient::Lock::~Lock() {
1460    mSharedClient.mCameraClientLock.unlock();
1461}
1462
1463Camera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1464        mCameraClient(client) {
1465}
1466
1467Camera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1468        const sp<ICameraClient>&client) {
1469    Mutex::Autolock l(mCameraClientLock);
1470    mCameraClient = client;
1471    return *this;
1472}
1473
1474void Camera2Client::SharedCameraClient::clear() {
1475    Mutex::Autolock l(mCameraClientLock);
1476    mCameraClient.clear();
1477}
1478
1479const int32_t Camera2Client::kPreviewRequestIdStart;
1480const int32_t Camera2Client::kPreviewRequestIdEnd;
1481const int32_t Camera2Client::kRecordingRequestIdStart;
1482const int32_t Camera2Client::kRecordingRequestIdEnd;
1483const int32_t Camera2Client::kCaptureRequestIdStart;
1484const int32_t Camera2Client::kCaptureRequestIdEnd;
1485
1486/** Utility methods */
1487
1488status_t Camera2Client::updateRequests(Parameters &params) {
1489    status_t res;
1490
1491    ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
1492
1493    res = mStreamingProcessor->incrementStreamingIds();
1494    if (res != OK) {
1495        ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)",
1496                __FUNCTION__, mCameraId, strerror(-res), res);
1497        return res;
1498    }
1499
1500    res = mStreamingProcessor->updatePreviewRequest(params);
1501    if (res != OK) {
1502        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1503                __FUNCTION__, mCameraId, strerror(-res), res);
1504        return res;
1505    }
1506    res = mStreamingProcessor->updateRecordingRequest(params);
1507    if (res != OK) {
1508        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1509                __FUNCTION__, mCameraId, strerror(-res), res);
1510        return res;
1511    }
1512
1513    if (params.state == Parameters::PREVIEW) {
1514        res = startPreviewL(params, true);
1515        if (res != OK) {
1516            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1517                    __FUNCTION__, mCameraId, strerror(-res), res);
1518            return res;
1519        }
1520    } else if (params.state == Parameters::RECORD ||
1521            params.state == Parameters::VIDEO_SNAPSHOT) {
1522        res = startRecordingL(params, true);
1523        if (res != OK) {
1524            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1525                    __FUNCTION__, mCameraId, strerror(-res), res);
1526            return res;
1527        }
1528    }
1529    return res;
1530}
1531
1532
1533size_t Camera2Client::calculateBufferSize(int width, int height,
1534        int format, int stride) {
1535    switch (format) {
1536        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1537            return width * height * 2;
1538        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1539            return width * height * 3 / 2;
1540        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1541            return width * height * 2;
1542        case HAL_PIXEL_FORMAT_YV12: {      // YV12
1543            size_t ySize = stride * height;
1544            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
1545            size_t uvSize = uvStride * height / 2;
1546            return ySize + uvSize * 2;
1547        }
1548        case HAL_PIXEL_FORMAT_RGB_565:
1549            return width * height * 2;
1550        case HAL_PIXEL_FORMAT_RGBA_8888:
1551            return width * height * 4;
1552        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1553            return width * height * 2;
1554        default:
1555            ALOGE("%s: Unknown preview format: %x",
1556                    __FUNCTION__,  format);
1557            return 0;
1558    }
1559}
1560
1561status_t Camera2Client::syncWithDevice() {
1562    ATRACE_CALL();
1563    const nsecs_t kMaxSyncTimeout = 100000000; // 100 ms
1564    status_t res;
1565
1566    int32_t activeRequestId = mStreamingProcessor->getActiveRequestId();
1567    if (activeRequestId == 0) return OK;
1568
1569    res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout);
1570    if (res == TIMED_OUT) {
1571        ALOGE("%s: Camera %d: Timed out waiting sync with HAL",
1572                __FUNCTION__, mCameraId);
1573    } else if (res != OK) {
1574        ALOGE("%s: Camera %d: Error while waiting to sync with HAL",
1575                __FUNCTION__, mCameraId);
1576    }
1577    return res;
1578}
1579
1580} // namespace android
1581