Camera2Client.cpp revision 377b2ec9a2885f9b6405b07ba900a9e3f4349c38
1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "Camera2Client"
18#define ATRACE_TAG ATRACE_TAG_CAMERA
19//#define LOG_NDEBUG 0
20
21#include <inttypes.h>
22#include <utils/Log.h>
23#include <utils/Trace.h>
24
25#include <cutils/properties.h>
26#include <gui/Surface.h>
27
28#include "api1/Camera2Client.h"
29
30#include "api1/client2/StreamingProcessor.h"
31#include "api1/client2/JpegProcessor.h"
32#include "api1/client2/CaptureSequencer.h"
33#include "api1/client2/CallbackProcessor.h"
34#include "api1/client2/ZslProcessor.h"
35#include "api1/client2/ZslProcessor3.h"
36
37#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
38#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
39
40namespace android {
41using namespace camera2;
42
43static int getCallingPid() {
44    return IPCThreadState::self()->getCallingPid();
45}
46
47// Interface used by CameraService
48
49Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
50        const sp<ICameraClient>& cameraClient,
51        const String16& clientPackageName,
52        int cameraId,
53        int cameraFacing,
54        int clientPid,
55        uid_t clientUid,
56        int servicePid,
57        int deviceVersion):
58        Camera2ClientBase(cameraService, cameraClient, clientPackageName,
59                cameraId, cameraFacing, clientPid, clientUid, servicePid),
60        mParameters(cameraId, cameraFacing),
61        mDeviceVersion(deviceVersion)
62{
63    ATRACE_CALL();
64
65    SharedParameters::Lock l(mParameters);
66    l.mParameters.state = Parameters::DISCONNECTED;
67}
68
69status_t Camera2Client::initialize(camera_module_t *module)
70{
71    ATRACE_CALL();
72    ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
73    status_t res;
74
75    res = Camera2ClientBase::initialize(module);
76    if (res != OK) {
77        return res;
78    }
79
80    {
81        SharedParameters::Lock l(mParameters);
82
83        res = l.mParameters.initialize(&(mDevice->info()));
84        if (res != OK) {
85            ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
86                    __FUNCTION__, mCameraId, strerror(-res), res);
87            return NO_INIT;
88        }
89    }
90
91    String8 threadName;
92
93    mStreamingProcessor = new StreamingProcessor(this);
94    threadName = String8::format("C2-%d-StreamProc",
95            mCameraId);
96    mStreamingProcessor->run(threadName.string());
97
98    mFrameProcessor = new FrameProcessor(mDevice, this);
99    threadName = String8::format("C2-%d-FrameProc",
100            mCameraId);
101    mFrameProcessor->run(threadName.string());
102
103    mCaptureSequencer = new CaptureSequencer(this);
104    threadName = String8::format("C2-%d-CaptureSeq",
105            mCameraId);
106    mCaptureSequencer->run(threadName.string());
107
108    mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
109    threadName = String8::format("C2-%d-JpegProc",
110            mCameraId);
111    mJpegProcessor->run(threadName.string());
112
113    switch (mDeviceVersion) {
114        case CAMERA_DEVICE_API_VERSION_2_0: {
115            sp<ZslProcessor> zslProc =
116                    new ZslProcessor(this, mCaptureSequencer);
117            mZslProcessor = zslProc;
118            mZslProcessorThread = zslProc;
119            break;
120        }
121        case CAMERA_DEVICE_API_VERSION_3_0:{
122            sp<ZslProcessor3> zslProc =
123                    new ZslProcessor3(this, mCaptureSequencer);
124            mZslProcessor = zslProc;
125            mZslProcessorThread = zslProc;
126            break;
127        }
128        default:
129            break;
130    }
131    threadName = String8::format("C2-%d-ZslProc",
132            mCameraId);
133    mZslProcessorThread->run(threadName.string());
134
135    mCallbackProcessor = new CallbackProcessor(this);
136    threadName = String8::format("C2-%d-CallbkProc",
137            mCameraId);
138    mCallbackProcessor->run(threadName.string());
139
140    if (gLogLevel >= 1) {
141        SharedParameters::Lock l(mParameters);
142        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
143              mCameraId);
144        ALOGD("%s", l.mParameters.paramsFlattened.string());
145    }
146
147    return OK;
148}
149
150Camera2Client::~Camera2Client() {
151    ATRACE_CALL();
152    ALOGV("~Camera2Client");
153
154    mDestructionStarted = true;
155
156    disconnect();
157
158    ALOGI("Camera %d: Closed", mCameraId);
159}
160
161status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
162    String8 result;
163    result.appendFormat("Client2[%d] (%p) Client: %s PID: %d, dump:\n",
164            mCameraId,
165            getRemoteCallback()->asBinder().get(),
166            String8(mClientPackageName).string(),
167            mClientPid);
168    result.append("  State: ");
169#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
170
171    const Parameters& p = mParameters.unsafeAccess();
172
173    result.append(Parameters::getStateName(p.state));
174
175    result.append("\n  Current parameters:\n");
176    result.appendFormat("    Preview size: %d x %d\n",
177            p.previewWidth, p.previewHeight);
178    result.appendFormat("    Preview FPS range: %d - %d\n",
179            p.previewFpsRange[0], p.previewFpsRange[1]);
180    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
181            p.previewFormat);
182    result.appendFormat("    Preview transform: %x\n",
183            p.previewTransform);
184    result.appendFormat("    Picture size: %d x %d\n",
185            p.pictureWidth, p.pictureHeight);
186    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
187            p.jpegThumbSize[0], p.jpegThumbSize[1]);
188    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
189            p.jpegQuality, p.jpegThumbQuality);
190    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
191    result.appendFormat("    GPS tags %s\n",
192            p.gpsEnabled ? "enabled" : "disabled");
193    if (p.gpsEnabled) {
194        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
195                p.gpsCoordinates[0], p.gpsCoordinates[1],
196                p.gpsCoordinates[2]);
197        result.appendFormat("    GPS timestamp: %" PRId64 "\n",
198                p.gpsTimestamp);
199        result.appendFormat("    GPS processing method: %s\n",
200                p.gpsProcessingMethod.string());
201    }
202
203    result.append("    White balance mode: ");
204    switch (p.wbMode) {
205        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_AUTO)
206        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_INCANDESCENT)
207        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_FLUORESCENT)
208        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT)
209        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_DAYLIGHT)
210        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT)
211        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_TWILIGHT)
212        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_SHADE)
213        default: result.append("UNKNOWN\n");
214    }
215
216    result.append("    Effect mode: ");
217    switch (p.effectMode) {
218        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_OFF)
219        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_MONO)
220        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_NEGATIVE)
221        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SOLARIZE)
222        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SEPIA)
223        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_POSTERIZE)
224        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD)
225        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD)
226        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_AQUA)
227        default: result.append("UNKNOWN\n");
228    }
229
230    result.append("    Antibanding mode: ");
231    switch (p.antibandingMode) {
232        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO)
233        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF)
234        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ)
235        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ)
236        default: result.append("UNKNOWN\n");
237    }
238
239    result.append("    Scene mode: ");
240    switch (p.sceneMode) {
241        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
242            result.append("AUTO\n"); break;
243        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
244        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
245        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
246        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
247        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
248        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
249        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
250        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
251        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
252        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
253        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
254        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
255        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
256        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
257        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
258        default: result.append("UNKNOWN\n");
259    }
260
261    result.append("    Flash mode: ");
262    switch (p.flashMode) {
263        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
264        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
265        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
266        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
267        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
268        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
269        default: result.append("UNKNOWN\n");
270    }
271
272    result.append("    Focus mode: ");
273    switch (p.focusMode) {
274        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
275        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
276        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
277        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
278        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
279        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
280        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
281        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
282        default: result.append("UNKNOWN\n");
283    }
284
285    result.append("   Focus state: ");
286    switch (p.focusState) {
287        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_INACTIVE)
288        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN)
289        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)
290        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED)
291        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN)
292        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED)
293        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED)
294        default: result.append("UNKNOWN\n");
295    }
296
297    result.append("    Focusing areas:\n");
298    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
299        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
300                p.focusingAreas[i].left,
301                p.focusingAreas[i].top,
302                p.focusingAreas[i].right,
303                p.focusingAreas[i].bottom,
304                p.focusingAreas[i].weight);
305    }
306
307    result.appendFormat("    Exposure compensation index: %d\n",
308            p.exposureCompensation);
309
310    result.appendFormat("    AE lock %s, AWB lock %s\n",
311            p.autoExposureLock ? "enabled" : "disabled",
312            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
313
314    result.appendFormat("    Metering areas:\n");
315    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
316        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
317                p.meteringAreas[i].left,
318                p.meteringAreas[i].top,
319                p.meteringAreas[i].right,
320                p.meteringAreas[i].bottom,
321                p.meteringAreas[i].weight);
322    }
323
324    result.appendFormat("    Zoom index: %d\n", p.zoom);
325    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
326            p.videoHeight);
327
328    result.appendFormat("    Recording hint is %s\n",
329            p.recordingHint ? "set" : "not set");
330
331    result.appendFormat("    Video stabilization is %s\n",
332            p.videoStabilization ? "enabled" : "disabled");
333
334    result.appendFormat("    Selected still capture FPS range: %d - %d\n",
335            p.fastInfo.bestStillCaptureFpsRange[0],
336            p.fastInfo.bestStillCaptureFpsRange[1]);
337
338    result.append("  Current streams:\n");
339    result.appendFormat("    Preview stream ID: %d\n",
340            getPreviewStreamId());
341    result.appendFormat("    Capture stream ID: %d\n",
342            getCaptureStreamId());
343    result.appendFormat("    Recording stream ID: %d\n",
344            getRecordingStreamId());
345
346    result.append("  Quirks for this camera:\n");
347    bool haveQuirk = false;
348    if (p.quirks.triggerAfWithAuto) {
349        result.appendFormat("    triggerAfWithAuto\n");
350        haveQuirk = true;
351    }
352    if (p.quirks.useZslFormat) {
353        result.appendFormat("    useZslFormat\n");
354        haveQuirk = true;
355    }
356    if (p.quirks.meteringCropRegion) {
357        result.appendFormat("    meteringCropRegion\n");
358        haveQuirk = true;
359    }
360    if (p.quirks.partialResults) {
361        result.appendFormat("    usePartialResult\n");
362        haveQuirk = true;
363    }
364    if (!haveQuirk) {
365        result.appendFormat("    none\n");
366    }
367
368    write(fd, result.string(), result.size());
369
370    mStreamingProcessor->dump(fd, args);
371
372    mCaptureSequencer->dump(fd, args);
373
374    mFrameProcessor->dump(fd, args);
375
376    mZslProcessor->dump(fd, args);
377
378    return dumpDevice(fd, args);
379#undef CASE_APPEND_ENUM
380}
381
382// ICamera interface
383
384void Camera2Client::disconnect() {
385    ATRACE_CALL();
386    Mutex::Autolock icl(mBinderSerializationLock);
387
388    // Allow both client and the media server to disconnect at all times
389    int callingPid = getCallingPid();
390    if (callingPid != mClientPid && callingPid != mServicePid) return;
391
392    if (mDevice == 0) return;
393
394    ALOGV("Camera %d: Shutting down", mCameraId);
395
396    /**
397     * disconnect() cannot call any methods that might need to promote a
398     * wp<Camera2Client>, since disconnect can be called from the destructor, at
399     * which point all such promotions will fail.
400     */
401
402    stopPreviewL();
403
404    {
405        SharedParameters::Lock l(mParameters);
406        if (l.mParameters.state == Parameters::DISCONNECTED) return;
407        l.mParameters.state = Parameters::DISCONNECTED;
408    }
409
410    mStreamingProcessor->deletePreviewStream();
411    mStreamingProcessor->deleteRecordingStream();
412    mJpegProcessor->deleteStream();
413    mCallbackProcessor->deleteStream();
414    mZslProcessor->deleteStream();
415
416    mStreamingProcessor->requestExit();
417    mFrameProcessor->requestExit();
418    mCaptureSequencer->requestExit();
419    mJpegProcessor->requestExit();
420    mZslProcessorThread->requestExit();
421    mCallbackProcessor->requestExit();
422
423    ALOGV("Camera %d: Waiting for threads", mCameraId);
424
425    mStreamingProcessor->join();
426    mFrameProcessor->join();
427    mCaptureSequencer->join();
428    mJpegProcessor->join();
429    mZslProcessorThread->join();
430    mCallbackProcessor->join();
431
432    ALOGV("Camera %d: Disconnecting device", mCameraId);
433
434    mDevice->disconnect();
435
436    mDevice.clear();
437
438    CameraService::Client::disconnect();
439}
440
441status_t Camera2Client::connect(const sp<ICameraClient>& client) {
442    ATRACE_CALL();
443    ALOGV("%s: E", __FUNCTION__);
444    Mutex::Autolock icl(mBinderSerializationLock);
445
446    if (mClientPid != 0 && getCallingPid() != mClientPid) {
447        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
448                "current locked to pid %d", __FUNCTION__,
449                mCameraId, getCallingPid(), mClientPid);
450        return BAD_VALUE;
451    }
452
453    mClientPid = getCallingPid();
454
455    mRemoteCallback = client;
456    mSharedCameraCallbacks = client;
457
458    return OK;
459}
460
461status_t Camera2Client::lock() {
462    ATRACE_CALL();
463    ALOGV("%s: E", __FUNCTION__);
464    Mutex::Autolock icl(mBinderSerializationLock);
465    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
466            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
467
468    if (mClientPid == 0) {
469        mClientPid = getCallingPid();
470        return OK;
471    }
472
473    if (mClientPid != getCallingPid()) {
474        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
475                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
476        return EBUSY;
477    }
478
479    return OK;
480}
481
482status_t Camera2Client::unlock() {
483    ATRACE_CALL();
484    ALOGV("%s: E", __FUNCTION__);
485    Mutex::Autolock icl(mBinderSerializationLock);
486    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
487            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
488
489    if (mClientPid == getCallingPid()) {
490        SharedParameters::Lock l(mParameters);
491        if (l.mParameters.state == Parameters::RECORD ||
492                l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
493            ALOGD("Not allowed to unlock camera during recording.");
494            return INVALID_OPERATION;
495        }
496        mClientPid = 0;
497        mRemoteCallback.clear();
498        mSharedCameraCallbacks.clear();
499        return OK;
500    }
501
502    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
503            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
504    return EBUSY;
505}
506
507status_t Camera2Client::setPreviewTarget(
508        const sp<IGraphicBufferProducer>& bufferProducer) {
509    ATRACE_CALL();
510    ALOGV("%s: E", __FUNCTION__);
511    Mutex::Autolock icl(mBinderSerializationLock);
512    status_t res;
513    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
514
515    sp<IBinder> binder;
516    sp<ANativeWindow> window;
517    if (bufferProducer != 0) {
518        binder = bufferProducer->asBinder();
519        // Using controlledByApp flag to ensure that the buffer queue remains in
520        // async mode for the old camera API, where many applications depend
521        // on that behavior.
522        window = new Surface(bufferProducer, /*controlledByApp*/ true);
523    }
524    return setPreviewWindowL(binder, window);
525}
526
527status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
528        sp<ANativeWindow> window) {
529    ATRACE_CALL();
530    status_t res;
531
532    if (binder == mPreviewSurface) {
533        ALOGV("%s: Camera %d: New window is same as old window",
534                __FUNCTION__, mCameraId);
535        return NO_ERROR;
536    }
537
538    Parameters::State state;
539    {
540        SharedParameters::Lock l(mParameters);
541        state = l.mParameters.state;
542    }
543    switch (state) {
544        case Parameters::DISCONNECTED:
545        case Parameters::RECORD:
546        case Parameters::STILL_CAPTURE:
547        case Parameters::VIDEO_SNAPSHOT:
548            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
549                    __FUNCTION__, mCameraId,
550                    Parameters::getStateName(state));
551            return INVALID_OPERATION;
552        case Parameters::STOPPED:
553        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
554            // OK
555            break;
556        case Parameters::PREVIEW:
557            // Already running preview - need to stop and create a new stream
558            res = stopStream();
559            if (res != OK) {
560                ALOGE("%s: Unable to stop preview to swap windows: %s (%d)",
561                        __FUNCTION__, strerror(-res), res);
562                return res;
563            }
564            state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
565            break;
566    }
567
568    mPreviewSurface = binder;
569    res = mStreamingProcessor->setPreviewWindow(window);
570    if (res != OK) {
571        ALOGE("%s: Unable to set new preview window: %s (%d)",
572                __FUNCTION__, strerror(-res), res);
573        return res;
574    }
575
576    if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
577        SharedParameters::Lock l(mParameters);
578        l.mParameters.state = state;
579        return startPreviewL(l.mParameters, false);
580    }
581
582    return OK;
583}
584
585void Camera2Client::setPreviewCallbackFlag(int flag) {
586    ATRACE_CALL();
587    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
588    Mutex::Autolock icl(mBinderSerializationLock);
589
590    if ( checkPid(__FUNCTION__) != OK) return;
591
592    SharedParameters::Lock l(mParameters);
593    setPreviewCallbackFlagL(l.mParameters, flag);
594}
595
596void Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
597    status_t res = OK;
598
599    switch(params.state) {
600        case Parameters::STOPPED:
601        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
602        case Parameters::PREVIEW:
603        case Parameters::STILL_CAPTURE:
604            // OK
605            break;
606        default:
607            if (flag & CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) {
608                ALOGE("%s: Camera %d: Can't use preview callbacks "
609                        "in state %d", __FUNCTION__, mCameraId, params.state);
610                return;
611            }
612    }
613
614    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
615        ALOGV("%s: setting oneshot", __FUNCTION__);
616        params.previewCallbackOneShot = true;
617    }
618    if (params.previewCallbackFlags != (uint32_t)flag) {
619
620        if (params.previewCallbackSurface && flag != CAMERA_FRAME_CALLBACK_FLAG_NOOP) {
621            // Disable any existing preview callback window when enabling
622            // preview callback flags
623            res = mCallbackProcessor->setCallbackWindow(NULL);
624            if (res != OK) {
625                ALOGE("%s: Camera %d: Unable to clear preview callback surface:"
626                        " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
627                return;
628            }
629            params.previewCallbackSurface = false;
630        }
631
632        params.previewCallbackFlags = flag;
633
634        if (params.state == Parameters::PREVIEW) {
635            res = startPreviewL(params, true);
636            if (res != OK) {
637                ALOGE("%s: Camera %d: Unable to refresh request in state %s",
638                        __FUNCTION__, mCameraId,
639                        Parameters::getStateName(params.state));
640            }
641        }
642    }
643}
644
645status_t Camera2Client::setPreviewCallbackTarget(
646        const sp<IGraphicBufferProducer>& callbackProducer) {
647    ATRACE_CALL();
648    ALOGV("%s: E", __FUNCTION__);
649    Mutex::Autolock icl(mBinderSerializationLock);
650    status_t res;
651    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
652
653    sp<ANativeWindow> window;
654    if (callbackProducer != 0) {
655        window = new Surface(callbackProducer);
656    }
657
658    res = mCallbackProcessor->setCallbackWindow(window);
659    if (res != OK) {
660        ALOGE("%s: Camera %d: Unable to set preview callback surface: %s (%d)",
661                __FUNCTION__, mCameraId, strerror(-res), res);
662        return res;
663    }
664
665    SharedParameters::Lock l(mParameters);
666
667    if (window != NULL) {
668        // Disable traditional callbacks when a valid callback target is given
669        l.mParameters.previewCallbackFlags = CAMERA_FRAME_CALLBACK_FLAG_NOOP;
670        l.mParameters.previewCallbackOneShot = false;
671        l.mParameters.previewCallbackSurface = true;
672    } else {
673        // Disable callback target if given a NULL interface.
674        l.mParameters.previewCallbackSurface = false;
675    }
676
677    switch(l.mParameters.state) {
678        case Parameters::PREVIEW:
679            res = startPreviewL(l.mParameters, true);
680            break;
681        case Parameters::RECORD:
682        case Parameters::VIDEO_SNAPSHOT:
683            res = startRecordingL(l.mParameters, true);
684            break;
685        default:
686            break;
687    }
688    if (res != OK) {
689        ALOGE("%s: Camera %d: Unable to refresh request in state %s",
690                __FUNCTION__, mCameraId,
691                Parameters::getStateName(l.mParameters.state));
692    }
693
694    return OK;
695}
696
697
698status_t Camera2Client::startPreview() {
699    ATRACE_CALL();
700    ALOGV("%s: E", __FUNCTION__);
701    Mutex::Autolock icl(mBinderSerializationLock);
702    status_t res;
703    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
704    SharedParameters::Lock l(mParameters);
705    return startPreviewL(l.mParameters, false);
706}
707
708status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
709    ATRACE_CALL();
710    status_t res;
711
712    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
713
714    if ( (params.state == Parameters::PREVIEW ||
715                    params.state == Parameters::RECORD ||
716                    params.state == Parameters::VIDEO_SNAPSHOT)
717            && !restart) {
718        // Succeed attempt to re-enter a streaming state
719        ALOGI("%s: Camera %d: Preview already active, ignoring restart",
720                __FUNCTION__, mCameraId);
721        return OK;
722    }
723    if (params.state > Parameters::PREVIEW && !restart) {
724        ALOGE("%s: Can't start preview in state %s",
725                __FUNCTION__,
726                Parameters::getStateName(params.state));
727        return INVALID_OPERATION;
728    }
729
730    if (!mStreamingProcessor->haveValidPreviewWindow()) {
731        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
732        return OK;
733    }
734    params.state = Parameters::STOPPED;
735
736    res = mStreamingProcessor->updatePreviewStream(params);
737    if (res != OK) {
738        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
739                __FUNCTION__, mCameraId, strerror(-res), res);
740        return res;
741    }
742
743    // We could wait to create the JPEG output stream until first actual use
744    // (first takePicture call). However, this would substantially increase the
745    // first capture latency on HAL3 devices, and potentially on some HAL2
746    // devices. So create it unconditionally at preview start. As a drawback,
747    // this increases gralloc memory consumption for applications that don't
748    // ever take a picture.
749    // TODO: Find a better compromise, though this likely would involve HAL
750    // changes.
751    res = updateProcessorStream(mJpegProcessor, params);
752    if (res != OK) {
753        ALOGE("%s: Camera %d: Can't pre-configure still image "
754                "stream: %s (%d)",
755                __FUNCTION__, mCameraId, strerror(-res), res);
756        return res;
757    }
758
759    Vector<int32_t> outputStreams;
760    bool callbacksEnabled = (params.previewCallbackFlags &
761            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) ||
762            params.previewCallbackSurface;
763
764    if (callbacksEnabled) {
765        // Can't have recording stream hanging around when enabling callbacks,
766        // since it exceeds the max stream count on some devices.
767        if (mStreamingProcessor->getRecordingStreamId() != NO_STREAM) {
768            ALOGV("%s: Camera %d: Clearing out recording stream before "
769                    "creating callback stream", __FUNCTION__, mCameraId);
770            res = mStreamingProcessor->stopStream();
771            if (res != OK) {
772                ALOGE("%s: Camera %d: Can't stop streaming to delete "
773                        "recording stream", __FUNCTION__, mCameraId);
774                return res;
775            }
776            res = mStreamingProcessor->deleteRecordingStream();
777            if (res != OK) {
778                ALOGE("%s: Camera %d: Unable to delete recording stream before "
779                        "enabling callbacks: %s (%d)", __FUNCTION__, mCameraId,
780                        strerror(-res), res);
781                return res;
782            }
783        }
784
785        res = mCallbackProcessor->updateStream(params);
786        if (res != OK) {
787            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
788                    __FUNCTION__, mCameraId, strerror(-res), res);
789            return res;
790        }
791        outputStreams.push(getCallbackStreamId());
792    }
793    if (params.zslMode && !params.recordingHint) {
794        res = updateProcessorStream(mZslProcessor, params);
795        if (res != OK) {
796            ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
797                    __FUNCTION__, mCameraId, strerror(-res), res);
798            return res;
799        }
800        outputStreams.push(getZslStreamId());
801    }
802
803    outputStreams.push(getPreviewStreamId());
804
805    if (!params.recordingHint) {
806        if (!restart) {
807            res = mStreamingProcessor->updatePreviewRequest(params);
808            if (res != OK) {
809                ALOGE("%s: Camera %d: Can't set up preview request: "
810                        "%s (%d)", __FUNCTION__, mCameraId,
811                        strerror(-res), res);
812                return res;
813            }
814        }
815        res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW,
816                outputStreams);
817    } else {
818        if (!restart) {
819            res = mStreamingProcessor->updateRecordingRequest(params);
820            if (res != OK) {
821                ALOGE("%s: Camera %d: Can't set up preview request with "
822                        "record hint: %s (%d)", __FUNCTION__, mCameraId,
823                        strerror(-res), res);
824                return res;
825            }
826        }
827        res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
828                outputStreams);
829    }
830    if (res != OK) {
831        ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)",
832                __FUNCTION__, mCameraId, strerror(-res), res);
833        return res;
834    }
835
836    params.state = Parameters::PREVIEW;
837    return OK;
838}
839
840void Camera2Client::stopPreview() {
841    ATRACE_CALL();
842    ALOGV("%s: E", __FUNCTION__);
843    Mutex::Autolock icl(mBinderSerializationLock);
844    status_t res;
845    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
846    stopPreviewL();
847}
848
849void Camera2Client::stopPreviewL() {
850    ATRACE_CALL();
851    status_t res;
852    const nsecs_t kStopCaptureTimeout = 3000000000LL; // 3 seconds
853    Parameters::State state;
854    {
855        SharedParameters::Lock l(mParameters);
856        state = l.mParameters.state;
857    }
858
859    switch (state) {
860        case Parameters::DISCONNECTED:
861            // Nothing to do.
862            break;
863        case Parameters::STOPPED:
864        case Parameters::VIDEO_SNAPSHOT:
865        case Parameters::STILL_CAPTURE:
866            mCaptureSequencer->waitUntilIdle(kStopCaptureTimeout);
867            // no break
868        case Parameters::RECORD:
869        case Parameters::PREVIEW:
870            syncWithDevice();
871            res = stopStream();
872            if (res != OK) {
873                ALOGE("%s: Camera %d: Can't stop streaming: %s (%d)",
874                        __FUNCTION__, mCameraId, strerror(-res), res);
875            }
876            res = mDevice->waitUntilDrained();
877            if (res != OK) {
878                ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
879                        __FUNCTION__, mCameraId, strerror(-res), res);
880            }
881            // no break
882        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
883            SharedParameters::Lock l(mParameters);
884            l.mParameters.state = Parameters::STOPPED;
885            commandStopFaceDetectionL(l.mParameters);
886            break;
887        }
888        default:
889            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
890                    state);
891    }
892}
893
894bool Camera2Client::previewEnabled() {
895    ATRACE_CALL();
896    Mutex::Autolock icl(mBinderSerializationLock);
897    status_t res;
898    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
899
900    SharedParameters::Lock l(mParameters);
901    return l.mParameters.state == Parameters::PREVIEW;
902}
903
904status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
905    ATRACE_CALL();
906    Mutex::Autolock icl(mBinderSerializationLock);
907    status_t res;
908    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
909
910    SharedParameters::Lock l(mParameters);
911    switch (l.mParameters.state) {
912        case Parameters::RECORD:
913        case Parameters::VIDEO_SNAPSHOT:
914            ALOGE("%s: Camera %d: Can't be called in state %s",
915                    __FUNCTION__, mCameraId,
916                    Parameters::getStateName(l.mParameters.state));
917            return INVALID_OPERATION;
918        default:
919            // OK
920            break;
921    }
922
923    l.mParameters.storeMetadataInBuffers = enabled;
924
925    return OK;
926}
927
928status_t Camera2Client::startRecording() {
929    ATRACE_CALL();
930    ALOGV("%s: E", __FUNCTION__);
931    Mutex::Autolock icl(mBinderSerializationLock);
932    status_t res;
933    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
934    SharedParameters::Lock l(mParameters);
935
936    return startRecordingL(l.mParameters, false);
937}
938
939status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
940    status_t res;
941
942    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
943
944    switch (params.state) {
945        case Parameters::STOPPED:
946            res = startPreviewL(params, false);
947            if (res != OK) return res;
948            break;
949        case Parameters::PREVIEW:
950            // Ready to go
951            break;
952        case Parameters::RECORD:
953        case Parameters::VIDEO_SNAPSHOT:
954            // OK to call this when recording is already on, just skip unless
955            // we're looking to restart
956            if (!restart) return OK;
957            break;
958        default:
959            ALOGE("%s: Camera %d: Can't start recording in state %s",
960                    __FUNCTION__, mCameraId,
961                    Parameters::getStateName(params.state));
962            return INVALID_OPERATION;
963    };
964
965    if (!params.storeMetadataInBuffers) {
966        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
967                "non-metadata recording mode requested!", __FUNCTION__,
968                mCameraId);
969        return INVALID_OPERATION;
970    }
971
972    if (!restart) {
973        mCameraService->playSound(CameraService::SOUND_RECORDING);
974        mStreamingProcessor->updateRecordingRequest(params);
975        if (res != OK) {
976            ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
977                    __FUNCTION__, mCameraId, strerror(-res), res);
978            return res;
979        }
980    }
981
982    // Not all devices can support a preview callback stream and a recording
983    // stream at the same time, so assume none of them can.
984    if (mCallbackProcessor->getStreamId() != NO_STREAM) {
985        ALOGV("%s: Camera %d: Clearing out callback stream before "
986                "creating recording stream", __FUNCTION__, mCameraId);
987        res = mStreamingProcessor->stopStream();
988        if (res != OK) {
989            ALOGE("%s: Camera %d: Can't stop streaming to delete callback stream",
990                    __FUNCTION__, mCameraId);
991            return res;
992        }
993        res = mCallbackProcessor->deleteStream();
994        if (res != OK) {
995            ALOGE("%s: Camera %d: Unable to delete callback stream before "
996                    "record: %s (%d)", __FUNCTION__, mCameraId,
997                    strerror(-res), res);
998            return res;
999        }
1000    }
1001    // Disable callbacks if they're enabled; can't record and use callbacks,
1002    // and we can't fail record start without stagefright asserting.
1003    params.previewCallbackFlags = 0;
1004
1005    res = updateProcessorStream<
1006            StreamingProcessor,
1007            &StreamingProcessor::updateRecordingStream>(mStreamingProcessor,
1008                                                        params);
1009    if (res != OK) {
1010        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
1011                __FUNCTION__, mCameraId, strerror(-res), res);
1012        return res;
1013    }
1014
1015    Vector<int32_t> outputStreams;
1016    outputStreams.push(getPreviewStreamId());
1017    outputStreams.push(getRecordingStreamId());
1018
1019    res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
1020            outputStreams);
1021    if (res != OK) {
1022        ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)",
1023                __FUNCTION__, mCameraId, strerror(-res), res);
1024        return res;
1025    }
1026
1027    if (params.state < Parameters::RECORD) {
1028        params.state = Parameters::RECORD;
1029    }
1030
1031    return OK;
1032}
1033
1034void Camera2Client::stopRecording() {
1035    ATRACE_CALL();
1036    ALOGV("%s: E", __FUNCTION__);
1037    Mutex::Autolock icl(mBinderSerializationLock);
1038    SharedParameters::Lock l(mParameters);
1039
1040    status_t res;
1041    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
1042
1043    switch (l.mParameters.state) {
1044        case Parameters::RECORD:
1045            // OK to stop
1046            break;
1047        case Parameters::STOPPED:
1048        case Parameters::PREVIEW:
1049        case Parameters::STILL_CAPTURE:
1050        case Parameters::VIDEO_SNAPSHOT:
1051        default:
1052            ALOGE("%s: Camera %d: Can't stop recording in state %s",
1053                    __FUNCTION__, mCameraId,
1054                    Parameters::getStateName(l.mParameters.state));
1055            return;
1056    };
1057
1058    mCameraService->playSound(CameraService::SOUND_RECORDING);
1059
1060    res = startPreviewL(l.mParameters, true);
1061    if (res != OK) {
1062        ALOGE("%s: Camera %d: Unable to return to preview",
1063                __FUNCTION__, mCameraId);
1064    }
1065}
1066
1067bool Camera2Client::recordingEnabled() {
1068    ATRACE_CALL();
1069    Mutex::Autolock icl(mBinderSerializationLock);
1070
1071    if ( checkPid(__FUNCTION__) != OK) return false;
1072
1073    return recordingEnabledL();
1074}
1075
1076bool Camera2Client::recordingEnabledL() {
1077    ATRACE_CALL();
1078    SharedParameters::Lock l(mParameters);
1079
1080    return (l.mParameters.state == Parameters::RECORD
1081            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
1082}
1083
1084void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
1085    ATRACE_CALL();
1086    Mutex::Autolock icl(mBinderSerializationLock);
1087    if ( checkPid(__FUNCTION__) != OK) return;
1088
1089    mStreamingProcessor->releaseRecordingFrame(mem);
1090}
1091
1092status_t Camera2Client::autoFocus() {
1093    ATRACE_CALL();
1094    Mutex::Autolock icl(mBinderSerializationLock);
1095    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1096    status_t res;
1097    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1098
1099    int triggerId;
1100    bool notifyImmediately = false;
1101    bool notifySuccess = false;
1102    {
1103        SharedParameters::Lock l(mParameters);
1104        if (l.mParameters.state < Parameters::PREVIEW) {
1105            return INVALID_OPERATION;
1106        }
1107
1108        /**
1109          * If the camera does not support auto-focus, it is a no-op and
1110          * onAutoFocus(boolean, Camera) callback will be called immediately
1111          * with a fake value of success set to true.
1112          *
1113          * Similarly, if focus mode is set to INFINITY, there's no reason to
1114          * bother the HAL.
1115          */
1116        if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED ||
1117                l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) {
1118            notifyImmediately = true;
1119            notifySuccess = true;
1120        }
1121        /**
1122         * If we're in CAF mode, and AF has already been locked, just fire back
1123         * the callback right away; the HAL would not send a notification since
1124         * no state change would happen on a AF trigger.
1125         */
1126        if ( (l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_PICTURE ||
1127                l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) &&
1128                l.mParameters.focusState == ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED ) {
1129            notifyImmediately = true;
1130            notifySuccess = true;
1131        }
1132        /**
1133         * Send immediate notification back to client
1134         */
1135        if (notifyImmediately) {
1136            SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
1137            if (l.mRemoteCallback != 0) {
1138                l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS,
1139                        notifySuccess ? 1 : 0, 0);
1140            }
1141            return OK;
1142        }
1143        /**
1144         * Handle quirk mode for AF in scene modes
1145         */
1146        if (l.mParameters.quirks.triggerAfWithAuto &&
1147                l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED &&
1148                l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO &&
1149                !l.mParameters.focusingAreas[0].isEmpty()) {
1150            ALOGV("%s: Quirk: Switching from focusMode %d to AUTO",
1151                    __FUNCTION__, l.mParameters.focusMode);
1152            l.mParameters.shadowFocusMode = l.mParameters.focusMode;
1153            l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
1154            updateRequests(l.mParameters);
1155        }
1156
1157        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
1158        triggerId = l.mParameters.currentAfTriggerId;
1159    }
1160    ATRACE_ASYNC_BEGIN(kAutofocusLabel, triggerId);
1161
1162    syncWithDevice();
1163
1164    mDevice->triggerAutofocus(triggerId);
1165
1166    return OK;
1167}
1168
1169status_t Camera2Client::cancelAutoFocus() {
1170    ATRACE_CALL();
1171    Mutex::Autolock icl(mBinderSerializationLock);
1172    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1173    status_t res;
1174    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1175
1176    int triggerId;
1177    {
1178        SharedParameters::Lock l(mParameters);
1179        // Canceling does nothing in FIXED or INFINITY modes
1180        if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED ||
1181                l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) {
1182            return OK;
1183        }
1184
1185        // An active AF trigger is canceled
1186        if (l.mParameters.afTriggerCounter == l.mParameters.currentAfTriggerId) {
1187            ATRACE_ASYNC_END(kAutofocusLabel, l.mParameters.currentAfTriggerId);
1188        }
1189
1190        triggerId = ++l.mParameters.afTriggerCounter;
1191
1192        // When using triggerAfWithAuto quirk, may need to reset focus mode to
1193        // the real state at this point. No need to cancel explicitly if
1194        // changing the AF mode.
1195        if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) {
1196            ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__,
1197                    l.mParameters.shadowFocusMode);
1198            l.mParameters.focusMode = l.mParameters.shadowFocusMode;
1199            l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID;
1200            updateRequests(l.mParameters);
1201
1202            return OK;
1203        }
1204    }
1205    syncWithDevice();
1206
1207    mDevice->triggerCancelAutofocus(triggerId);
1208
1209    return OK;
1210}
1211
1212status_t Camera2Client::takePicture(int msgType) {
1213    ATRACE_CALL();
1214    Mutex::Autolock icl(mBinderSerializationLock);
1215    status_t res;
1216    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1217
1218    int takePictureCounter;
1219    {
1220        SharedParameters::Lock l(mParameters);
1221        switch (l.mParameters.state) {
1222            case Parameters::DISCONNECTED:
1223            case Parameters::STOPPED:
1224            case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1225                ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1226                        __FUNCTION__, mCameraId);
1227                return INVALID_OPERATION;
1228            case Parameters::PREVIEW:
1229                // Good to go for takePicture
1230                res = commandStopFaceDetectionL(l.mParameters);
1231                if (res != OK) {
1232                    ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1233                            __FUNCTION__, mCameraId);
1234                    return res;
1235                }
1236                l.mParameters.state = Parameters::STILL_CAPTURE;
1237                break;
1238            case Parameters::RECORD:
1239                // Good to go for video snapshot
1240                l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1241                break;
1242            case Parameters::STILL_CAPTURE:
1243            case Parameters::VIDEO_SNAPSHOT:
1244                ALOGE("%s: Camera %d: Already taking a picture",
1245                        __FUNCTION__, mCameraId);
1246                return INVALID_OPERATION;
1247        }
1248
1249        ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1250
1251        res = updateProcessorStream(mJpegProcessor, l.mParameters);
1252        if (res != OK) {
1253            ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1254                    __FUNCTION__, mCameraId, strerror(-res), res);
1255            return res;
1256        }
1257        takePictureCounter = ++l.mParameters.takePictureCounter;
1258    }
1259
1260    ATRACE_ASYNC_BEGIN(kTakepictureLabel, takePictureCounter);
1261
1262    // Need HAL to have correct settings before (possibly) triggering precapture
1263    syncWithDevice();
1264
1265    res = mCaptureSequencer->startCapture(msgType);
1266    if (res != OK) {
1267        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
1268                __FUNCTION__, mCameraId, strerror(-res), res);
1269    }
1270
1271    return res;
1272}
1273
1274status_t Camera2Client::setParameters(const String8& params) {
1275    ATRACE_CALL();
1276    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1277    Mutex::Autolock icl(mBinderSerializationLock);
1278    status_t res;
1279    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1280
1281    SharedParameters::Lock l(mParameters);
1282
1283    res = l.mParameters.set(params);
1284    if (res != OK) return res;
1285
1286    res = updateRequests(l.mParameters);
1287
1288    return res;
1289}
1290
1291String8 Camera2Client::getParameters() const {
1292    ATRACE_CALL();
1293    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1294    Mutex::Autolock icl(mBinderSerializationLock);
1295    if ( checkPid(__FUNCTION__) != OK) return String8();
1296
1297    SharedParameters::ReadLock l(mParameters);
1298
1299    return l.mParameters.get();
1300}
1301
1302status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1303    ATRACE_CALL();
1304    Mutex::Autolock icl(mBinderSerializationLock);
1305    status_t res;
1306    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1307
1308    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1309            cmd, arg1, arg2);
1310
1311    switch (cmd) {
1312        case CAMERA_CMD_START_SMOOTH_ZOOM:
1313            return commandStartSmoothZoomL();
1314        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1315            return commandStopSmoothZoomL();
1316        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1317            return commandSetDisplayOrientationL(arg1);
1318        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1319            return commandEnableShutterSoundL(arg1 == 1);
1320        case CAMERA_CMD_PLAY_RECORDING_SOUND:
1321            return commandPlayRecordingSoundL();
1322        case CAMERA_CMD_START_FACE_DETECTION:
1323            return commandStartFaceDetectionL(arg1);
1324        case CAMERA_CMD_STOP_FACE_DETECTION: {
1325            SharedParameters::Lock l(mParameters);
1326            return commandStopFaceDetectionL(l.mParameters);
1327        }
1328        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1329            return commandEnableFocusMoveMsgL(arg1 == 1);
1330        case CAMERA_CMD_PING:
1331            return commandPingL();
1332        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1333            return commandSetVideoBufferCountL(arg1);
1334        default:
1335            ALOGE("%s: Unknown command %d (arguments %d, %d)",
1336                    __FUNCTION__, cmd, arg1, arg2);
1337            return BAD_VALUE;
1338    }
1339}
1340
1341status_t Camera2Client::commandStartSmoothZoomL() {
1342    ALOGE("%s: Unimplemented!", __FUNCTION__);
1343    return OK;
1344}
1345
1346status_t Camera2Client::commandStopSmoothZoomL() {
1347    ALOGE("%s: Unimplemented!", __FUNCTION__);
1348    return OK;
1349}
1350
1351status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
1352    int transform = Parameters::degToTransform(degrees,
1353            mCameraFacing == CAMERA_FACING_FRONT);
1354    if (transform == -1) {
1355        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1356                __FUNCTION__, mCameraId, degrees);
1357        return BAD_VALUE;
1358    }
1359    SharedParameters::Lock l(mParameters);
1360    if (transform != l.mParameters.previewTransform &&
1361            getPreviewStreamId() != NO_STREAM) {
1362        mDevice->setStreamTransform(getPreviewStreamId(), transform);
1363    }
1364    l.mParameters.previewTransform = transform;
1365    return OK;
1366}
1367
1368status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
1369    SharedParameters::Lock l(mParameters);
1370    if (enable) {
1371        l.mParameters.playShutterSound = true;
1372        return OK;
1373    }
1374
1375    // Disabling shutter sound may not be allowed. In that case only
1376    // allow the mediaserver process to disable the sound.
1377    char value[PROPERTY_VALUE_MAX];
1378    property_get("ro.camera.sound.forced", value, "0");
1379    if (strncmp(value, "0", 2) != 0) {
1380        // Disabling shutter sound is not allowed. Deny if the current
1381        // process is not mediaserver.
1382        if (getCallingPid() != getpid()) {
1383            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1384                    getCallingPid());
1385            return PERMISSION_DENIED;
1386        }
1387    }
1388
1389    l.mParameters.playShutterSound = false;
1390    return OK;
1391}
1392
1393status_t Camera2Client::commandPlayRecordingSoundL() {
1394    mCameraService->playSound(CameraService::SOUND_RECORDING);
1395    return OK;
1396}
1397
1398status_t Camera2Client::commandStartFaceDetectionL(int /*type*/) {
1399    ALOGV("%s: Camera %d: Starting face detection",
1400          __FUNCTION__, mCameraId);
1401    status_t res;
1402    SharedParameters::Lock l(mParameters);
1403    switch (l.mParameters.state) {
1404        case Parameters::DISCONNECTED:
1405        case Parameters::STOPPED:
1406        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1407        case Parameters::STILL_CAPTURE:
1408            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
1409                    __FUNCTION__, mCameraId);
1410            return INVALID_OPERATION;
1411        case Parameters::PREVIEW:
1412        case Parameters::RECORD:
1413        case Parameters::VIDEO_SNAPSHOT:
1414            // Good to go for starting face detect
1415            break;
1416    }
1417    // Ignoring type
1418    if (l.mParameters.fastInfo.bestFaceDetectMode ==
1419            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) {
1420        ALOGE("%s: Camera %d: Face detection not supported",
1421                __FUNCTION__, mCameraId);
1422        return BAD_VALUE;
1423    }
1424    if (l.mParameters.enableFaceDetect) return OK;
1425
1426    l.mParameters.enableFaceDetect = true;
1427
1428    res = updateRequests(l.mParameters);
1429
1430    return res;
1431}
1432
1433status_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
1434    status_t res = OK;
1435    ALOGV("%s: Camera %d: Stopping face detection",
1436          __FUNCTION__, mCameraId);
1437
1438    if (!params.enableFaceDetect) return OK;
1439
1440    params.enableFaceDetect = false;
1441
1442    if (params.state == Parameters::PREVIEW
1443            || params.state == Parameters::RECORD
1444            || params.state == Parameters::VIDEO_SNAPSHOT) {
1445        res = updateRequests(params);
1446    }
1447
1448    return res;
1449}
1450
1451status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
1452    SharedParameters::Lock l(mParameters);
1453    l.mParameters.enableFocusMoveMessages = enable;
1454
1455    return OK;
1456}
1457
1458status_t Camera2Client::commandPingL() {
1459    // Always ping back if access is proper and device is alive
1460    SharedParameters::Lock l(mParameters);
1461    if (l.mParameters.state != Parameters::DISCONNECTED) {
1462        return OK;
1463    } else {
1464        return NO_INIT;
1465    }
1466}
1467
1468status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
1469    if (recordingEnabledL()) {
1470        ALOGE("%s: Camera %d: Error setting video buffer count after "
1471                "recording was started", __FUNCTION__, mCameraId);
1472        return INVALID_OPERATION;
1473    }
1474
1475    return mStreamingProcessor->setRecordingBufferCount(count);
1476}
1477
1478/** Device-related methods */
1479void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1480    ALOGV("%s: Autofocus state now %d, last trigger %d",
1481            __FUNCTION__, newState, triggerId);
1482    bool sendCompletedMessage = false;
1483    bool sendMovingMessage = false;
1484
1485    bool success = false;
1486    bool afInMotion = false;
1487    {
1488        SharedParameters::Lock l(mParameters);
1489        // Trace end of AF state
1490        char tmp[32];
1491        if (l.mParameters.afStateCounter > 0) {
1492            camera_metadata_enum_snprint(
1493                ANDROID_CONTROL_AF_STATE, l.mParameters.focusState, tmp, sizeof(tmp));
1494            ATRACE_ASYNC_END(tmp, l.mParameters.afStateCounter);
1495        }
1496
1497        // Update state
1498        l.mParameters.focusState = newState;
1499        l.mParameters.afStateCounter++;
1500
1501        // Trace start of AF state
1502
1503        camera_metadata_enum_snprint(
1504            ANDROID_CONTROL_AF_STATE, l.mParameters.focusState, tmp, sizeof(tmp));
1505        ATRACE_ASYNC_BEGIN(tmp, l.mParameters.afStateCounter);
1506
1507        switch (l.mParameters.focusMode) {
1508            case Parameters::FOCUS_MODE_AUTO:
1509            case Parameters::FOCUS_MODE_MACRO:
1510                // Don't send notifications upstream if they're not for the current AF
1511                // trigger. For example, if cancel was called in between, or if we
1512                // already sent a notification about this AF call.
1513                if (triggerId != l.mParameters.currentAfTriggerId) break;
1514                switch (newState) {
1515                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1516                        success = true;
1517                        // no break
1518                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1519                        sendCompletedMessage = true;
1520                        l.mParameters.currentAfTriggerId = -1;
1521                        break;
1522                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1523                        // Just starting focusing, ignore
1524                        break;
1525                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1526                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1527                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1528                    case ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED:
1529                    default:
1530                        // Unexpected in AUTO/MACRO mode
1531                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1532                                __FUNCTION__, newState);
1533                        break;
1534                }
1535                break;
1536            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1537            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1538                switch (newState) {
1539                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1540                        success = true;
1541                        // no break
1542                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1543                        // Don't send notifications upstream if they're not for
1544                        // the current AF trigger. For example, if cancel was
1545                        // called in between, or if we already sent a
1546                        // notification about this AF call.
1547                        // Send both a 'AF done' callback and a 'AF move' callback
1548                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1549                        sendCompletedMessage = true;
1550                        afInMotion = false;
1551                        if (l.mParameters.enableFocusMoveMessages &&
1552                                l.mParameters.afInMotion) {
1553                            sendMovingMessage = true;
1554                        }
1555                        l.mParameters.currentAfTriggerId = -1;
1556                        break;
1557                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1558                        // Cancel was called, or we switched state; care if
1559                        // currently moving
1560                        afInMotion = false;
1561                        if (l.mParameters.enableFocusMoveMessages &&
1562                                l.mParameters.afInMotion) {
1563                            sendMovingMessage = true;
1564                        }
1565                        break;
1566                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1567                        // Start passive scan, inform upstream
1568                        afInMotion = true;
1569                        // no break
1570                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1571                    case ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED:
1572                        // Stop passive scan, inform upstream
1573                        if (l.mParameters.enableFocusMoveMessages) {
1574                            sendMovingMessage = true;
1575                        }
1576                        break;
1577                }
1578                l.mParameters.afInMotion = afInMotion;
1579                break;
1580            case Parameters::FOCUS_MODE_EDOF:
1581            case Parameters::FOCUS_MODE_INFINITY:
1582            case Parameters::FOCUS_MODE_FIXED:
1583            default:
1584                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1585                    ALOGE("%s: Unexpected AF state change %d "
1586                            "(ID %d) in focus mode %d",
1587                          __FUNCTION__, newState, triggerId,
1588                            l.mParameters.focusMode);
1589                }
1590        }
1591    }
1592    if (sendMovingMessage) {
1593        SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
1594        if (l.mRemoteCallback != 0) {
1595            l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
1596                    afInMotion ? 1 : 0, 0);
1597        }
1598    }
1599    if (sendCompletedMessage) {
1600        ATRACE_ASYNC_END(kAutofocusLabel, triggerId);
1601        SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
1602        if (l.mRemoteCallback != 0) {
1603            l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS,
1604                    success ? 1 : 0, 0);
1605        }
1606    }
1607}
1608
1609void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1610    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1611            __FUNCTION__, newState, triggerId);
1612    mCaptureSequencer->notifyAutoExposure(newState, triggerId);
1613}
1614
1615camera2::SharedParameters& Camera2Client::getParameters() {
1616    return mParameters;
1617}
1618
1619int Camera2Client::getPreviewStreamId() const {
1620    return mStreamingProcessor->getPreviewStreamId();
1621}
1622
1623int Camera2Client::getCaptureStreamId() const {
1624    return mJpegProcessor->getStreamId();
1625}
1626
1627int Camera2Client::getCallbackStreamId() const {
1628    return mCallbackProcessor->getStreamId();
1629}
1630
1631int Camera2Client::getRecordingStreamId() const {
1632    return mStreamingProcessor->getRecordingStreamId();
1633}
1634
1635int Camera2Client::getZslStreamId() const {
1636    return mZslProcessor->getStreamId();
1637}
1638
1639status_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId,
1640        wp<camera2::FrameProcessor::FilteredListener> listener) {
1641    return mFrameProcessor->registerListener(minId, maxId, listener);
1642}
1643
1644status_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId,
1645        wp<camera2::FrameProcessor::FilteredListener> listener) {
1646    return mFrameProcessor->removeListener(minId, maxId, listener);
1647}
1648
1649status_t Camera2Client::stopStream() {
1650    return mStreamingProcessor->stopStream();
1651}
1652
1653const int32_t Camera2Client::kPreviewRequestIdStart;
1654const int32_t Camera2Client::kPreviewRequestIdEnd;
1655const int32_t Camera2Client::kRecordingRequestIdStart;
1656const int32_t Camera2Client::kRecordingRequestIdEnd;
1657const int32_t Camera2Client::kCaptureRequestIdStart;
1658const int32_t Camera2Client::kCaptureRequestIdEnd;
1659
1660/** Utility methods */
1661
1662status_t Camera2Client::updateRequests(Parameters &params) {
1663    status_t res;
1664
1665    ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
1666
1667    res = mStreamingProcessor->incrementStreamingIds();
1668    if (res != OK) {
1669        ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)",
1670                __FUNCTION__, mCameraId, strerror(-res), res);
1671        return res;
1672    }
1673
1674    res = mStreamingProcessor->updatePreviewRequest(params);
1675    if (res != OK) {
1676        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1677                __FUNCTION__, mCameraId, strerror(-res), res);
1678        return res;
1679    }
1680    res = mStreamingProcessor->updateRecordingRequest(params);
1681    if (res != OK) {
1682        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1683                __FUNCTION__, mCameraId, strerror(-res), res);
1684        return res;
1685    }
1686
1687    if (params.state == Parameters::PREVIEW) {
1688        res = startPreviewL(params, true);
1689        if (res != OK) {
1690            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1691                    __FUNCTION__, mCameraId, strerror(-res), res);
1692            return res;
1693        }
1694    } else if (params.state == Parameters::RECORD ||
1695            params.state == Parameters::VIDEO_SNAPSHOT) {
1696        res = startRecordingL(params, true);
1697        if (res != OK) {
1698            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1699                    __FUNCTION__, mCameraId, strerror(-res), res);
1700            return res;
1701        }
1702    }
1703    return res;
1704}
1705
1706
1707size_t Camera2Client::calculateBufferSize(int width, int height,
1708        int format, int stride) {
1709    switch (format) {
1710        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1711            return width * height * 2;
1712        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1713            return width * height * 3 / 2;
1714        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1715            return width * height * 2;
1716        case HAL_PIXEL_FORMAT_YV12: {      // YV12
1717            size_t ySize = stride * height;
1718            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
1719            size_t uvSize = uvStride * height / 2;
1720            return ySize + uvSize * 2;
1721        }
1722        case HAL_PIXEL_FORMAT_RGB_565:
1723            return width * height * 2;
1724        case HAL_PIXEL_FORMAT_RGBA_8888:
1725            return width * height * 4;
1726        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1727            return width * height * 2;
1728        default:
1729            ALOGE("%s: Unknown preview format: %x",
1730                    __FUNCTION__,  format);
1731            return 0;
1732    }
1733}
1734
1735status_t Camera2Client::syncWithDevice() {
1736    ATRACE_CALL();
1737    const nsecs_t kMaxSyncTimeout = 500000000; // 500 ms
1738    status_t res;
1739
1740    int32_t activeRequestId = mStreamingProcessor->getActiveRequestId();
1741    if (activeRequestId == 0) return OK;
1742
1743    res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout);
1744    if (res == TIMED_OUT) {
1745        ALOGE("%s: Camera %d: Timed out waiting sync with HAL",
1746                __FUNCTION__, mCameraId);
1747    } else if (res != OK) {
1748        ALOGE("%s: Camera %d: Error while waiting to sync with HAL",
1749                __FUNCTION__, mCameraId);
1750    }
1751    return res;
1752}
1753
1754template <typename ProcessorT>
1755status_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
1756                                              camera2::Parameters params) {
1757    // No default template arguments until C++11, so we need this overload
1758    return updateProcessorStream<ProcessorT, &ProcessorT::updateStream>(
1759            processor, params);
1760}
1761
1762template <typename ProcessorT,
1763          status_t (ProcessorT::*updateStreamF)(const Parameters &)>
1764status_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
1765                                              Parameters params) {
1766    status_t res;
1767
1768    // Get raw pointer since sp<T> doesn't have operator->*
1769    ProcessorT *processorPtr = processor.get();
1770    res = (processorPtr->*updateStreamF)(params);
1771
1772    /**
1773     * Can't update the stream if it's busy?
1774     *
1775     * Then we need to stop the device (by temporarily clearing the request
1776     * queue) and then try again. Resume streaming once we're done.
1777     */
1778    if (res == -EBUSY) {
1779        ALOGV("%s: Camera %d: Pausing to update stream", __FUNCTION__,
1780                mCameraId);
1781        res = mStreamingProcessor->togglePauseStream(/*pause*/true);
1782        if (res != OK) {
1783            ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)",
1784                    __FUNCTION__, mCameraId, strerror(-res), res);
1785        }
1786
1787        res = mDevice->waitUntilDrained();
1788        if (res != OK) {
1789            ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
1790                    __FUNCTION__, mCameraId, strerror(-res), res);
1791        }
1792
1793        res = (processorPtr->*updateStreamF)(params);
1794        if (res != OK) {
1795            ALOGE("%s: Camera %d: Failed to update processing stream "
1796                  " despite having halted streaming first: %s (%d)",
1797                  __FUNCTION__, mCameraId, strerror(-res), res);
1798        }
1799
1800        res = mStreamingProcessor->togglePauseStream(/*pause*/false);
1801        if (res != OK) {
1802            ALOGE("%s: Camera %d: Can't unpause streaming: %s (%d)",
1803                    __FUNCTION__, mCameraId, strerror(-res), res);
1804        }
1805    }
1806
1807    return res;
1808}
1809
1810const char* Camera2Client::kAutofocusLabel = "autofocus";
1811const char* Camera2Client::kTakepictureLabel = "take_picture";
1812
1813} // namespace android
1814