Camera2Client.cpp revision 10894e509f777c6bd7e408a57f5cf21ee2b36a96
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 <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 <media/hardware/MetadataBufferType.h>
28#include "camera2/Parameters.h"
29#include "Camera2Client.h"
30
31#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
32#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
33
34namespace android {
35using namespace camera2;
36
37static int getCallingPid() {
38    return IPCThreadState::self()->getCallingPid();
39}
40
41static int getCallingUid() {
42    return IPCThreadState::self()->getCallingUid();
43}
44
45// Interface used by CameraService
46
47Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
48        const sp<ICameraClient>& cameraClient,
49        int cameraId,
50        int cameraFacing,
51        int clientPid):
52        Client(cameraService, cameraClient,
53                cameraId, cameraFacing, clientPid),
54        mSharedCameraClient(cameraClient),
55        mParameters(cameraId, cameraFacing),
56        mPreviewStreamId(NO_STREAM),
57        mRecordingStreamId(NO_STREAM),
58        mRecordingHeapCount(kDefaultRecordingHeapCount)
59{
60    ATRACE_CALL();
61    ALOGI("Camera %d: Opened", cameraId);
62
63    mDevice = new Camera2Device(cameraId);
64
65    SharedParameters::Lock l(mParameters);
66    l.mParameters.state = Parameters::DISCONNECTED;
67
68    char value[PROPERTY_VALUE_MAX];
69    property_get("camera.zsl_mode", value, "0");
70    if (!strcmp(value,"1")) {
71        ALOGI("Camera %d: Enabling ZSL mode", cameraId);
72        l.mParameters.zslMode = true;
73    } else {
74        l.mParameters.zslMode = false;
75    }
76}
77
78status_t Camera2Client::checkPid(const char* checkLocation) const {
79    int callingPid = getCallingPid();
80    if (callingPid == mClientPid) return NO_ERROR;
81
82    ALOGE("%s: attempt to use a locked camera from a different process"
83            " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
84    return PERMISSION_DENIED;
85}
86
87status_t Camera2Client::initialize(camera_module_t *module)
88{
89    ATRACE_CALL();
90    ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
91    status_t res;
92
93    res = mDevice->initialize(module);
94    if (res != OK) {
95        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
96                __FUNCTION__, mCameraId, strerror(-res), res);
97        return NO_INIT;
98    }
99
100    res = mDevice->setNotifyCallback(this);
101
102    SharedParameters::Lock l(mParameters);
103
104    res = l.mParameters.initialize(&(mDevice->info()));
105    if (res != OK) {
106        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
107                __FUNCTION__, mCameraId, strerror(-res), res);
108        return NO_INIT;
109    }
110
111    String8 threadName;
112
113    mFrameProcessor = new FrameProcessor(this);
114    threadName = String8::format("Camera2Client[%d]::FrameProcessor",
115            mCameraId);
116    mFrameProcessor->run(threadName.string());
117
118    mCaptureSequencer = new CaptureSequencer(this);
119    threadName = String8::format("Camera2Client[%d]::CaptureSequencer",
120            mCameraId);
121    mCaptureSequencer->run(threadName.string());
122
123    mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
124    threadName = String8::format("Camera2Client[%d]::JpegProcessor",
125            mCameraId);
126    mJpegProcessor->run(threadName.string());
127
128    mZslProcessor = new ZslProcessor(this, mCaptureSequencer);
129    threadName = String8::format("Camera2Client[%d]::ZslProcessor",
130            mCameraId);
131    mZslProcessor->run(threadName.string());
132
133    mCallbackProcessor = new CallbackProcessor(this);
134    threadName = String8::format("Camera2Client[%d]::CallbackProcessor",
135            mCameraId);
136    mCallbackProcessor->run(threadName.string());
137
138    if (gLogLevel >= 1) {
139        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
140              mCameraId);
141        ALOGD("%s", l.mParameters.paramsFlattened.string());
142    }
143
144    return OK;
145}
146
147Camera2Client::~Camera2Client() {
148    ATRACE_CALL();
149    ALOGV("Camera %d: Shutting down", mCameraId);
150
151    mDestructionStarted = true;
152
153    // Rewrite mClientPid to allow shutdown by CameraService
154    mClientPid = getCallingPid();
155    disconnect();
156
157    mFrameProcessor->requestExit();
158    mCaptureSequencer->requestExit();
159    mJpegProcessor->requestExit();
160    mZslProcessor->requestExit();
161    mCallbackProcessor->requestExit();
162
163    ALOGI("Camera %d: Closed", mCameraId);
164}
165
166status_t Camera2Client::dump(int fd, const Vector<String16>& args) {
167    String8 result;
168    result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
169            mCameraId,
170            getCameraClient()->asBinder().get(),
171            mClientPid);
172    result.append("  State: ");
173#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
174
175    const Parameters& p = mParameters.unsafeAccess();
176
177    result.append(Parameters::getStateName(p.state));
178
179    result.append("\n  Current parameters:\n");
180    result.appendFormat("    Preview size: %d x %d\n",
181            p.previewWidth, p.previewHeight);
182    result.appendFormat("    Preview FPS range: %d - %d\n",
183            p.previewFpsRange[0], p.previewFpsRange[1]);
184    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
185            p.previewFormat);
186    result.appendFormat("    Preview transform: %x\n",
187            p.previewTransform);
188    result.appendFormat("    Picture size: %d x %d\n",
189            p.pictureWidth, p.pictureHeight);
190    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
191            p.jpegThumbSize[0], p.jpegThumbSize[1]);
192    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
193            p.jpegQuality, p.jpegThumbQuality);
194    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
195    result.appendFormat("    GPS tags %s\n",
196            p.gpsEnabled ? "enabled" : "disabled");
197    if (p.gpsEnabled) {
198        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
199                p.gpsCoordinates[0], p.gpsCoordinates[1],
200                p.gpsCoordinates[2]);
201        result.appendFormat("    GPS timestamp: %lld\n",
202                p.gpsTimestamp);
203        result.appendFormat("    GPS processing method: %s\n",
204                p.gpsProcessingMethod.string());
205    }
206
207    result.append("    White balance mode: ");
208    switch (p.wbMode) {
209        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
210        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
211        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
212        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
213        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
214        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
215        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
216        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
217        default: result.append("UNKNOWN\n");
218    }
219
220    result.append("    Effect mode: ");
221    switch (p.effectMode) {
222        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
223        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
224        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
225        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
226        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
227        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
228        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
229        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
230        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
231        default: result.append("UNKNOWN\n");
232    }
233
234    result.append("    Antibanding mode: ");
235    switch (p.antibandingMode) {
236        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
237        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
238        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
239        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
240        default: result.append("UNKNOWN\n");
241    }
242
243    result.append("    Scene mode: ");
244    switch (p.sceneMode) {
245        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
246            result.append("AUTO\n"); break;
247        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
248        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
249        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
250        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
251        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
252        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
253        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
254        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
255        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
256        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
257        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
258        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
259        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
260        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
261        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
262        default: result.append("UNKNOWN\n");
263    }
264
265    result.append("    Flash mode: ");
266    switch (p.flashMode) {
267        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
268        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
269        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
270        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
271        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
272        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
273        default: result.append("UNKNOWN\n");
274    }
275
276    result.append("    Focus mode: ");
277    switch (p.focusMode) {
278        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
279        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
280        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
281        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
282        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
283        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
284        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
285        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
286        default: result.append("UNKNOWN\n");
287    }
288
289    result.append("    Focusing areas:\n");
290    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
291        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
292                p.focusingAreas[i].left,
293                p.focusingAreas[i].top,
294                p.focusingAreas[i].right,
295                p.focusingAreas[i].bottom,
296                p.focusingAreas[i].weight);
297    }
298
299    result.appendFormat("    Exposure compensation index: %d\n",
300            p.exposureCompensation);
301
302    result.appendFormat("    AE lock %s, AWB lock %s\n",
303            p.autoExposureLock ? "enabled" : "disabled",
304            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
305
306    result.appendFormat("    Metering areas:\n");
307    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
308        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
309                p.meteringAreas[i].left,
310                p.meteringAreas[i].top,
311                p.meteringAreas[i].right,
312                p.meteringAreas[i].bottom,
313                p.meteringAreas[i].weight);
314    }
315
316    result.appendFormat("    Zoom index: %d\n", p.zoom);
317    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
318            p.videoHeight);
319
320    result.appendFormat("    Recording hint is %s\n",
321            p.recordingHint ? "set" : "not set");
322
323    result.appendFormat("    Video stabilization is %s\n",
324            p.videoStabilization ? "enabled" : "disabled");
325
326    result.append("  Current streams:\n");
327    result.appendFormat("    Preview stream ID: %d\n",
328            getPreviewStreamId());
329    result.appendFormat("    Capture stream ID: %d\n",
330            getCaptureStreamId());
331    result.appendFormat("    Recording stream ID: %d\n",
332            getRecordingStreamId());
333
334    result.append("  Current requests:\n");
335    if (mPreviewRequest.entryCount() != 0) {
336        result.append("    Preview request:\n");
337        write(fd, result.string(), result.size());
338        mPreviewRequest.dump(fd, 2, 6);
339    } else {
340        result.append("    Preview request: undefined\n");
341        write(fd, result.string(), result.size());
342    }
343
344    if (mRecordingRequest.entryCount() != 0) {
345        result = "    Recording request:\n";
346        write(fd, result.string(), result.size());
347        mRecordingRequest.dump(fd, 2, 6);
348    } else {
349        result = "    Recording request: undefined\n";
350        write(fd, result.string(), result.size());
351    }
352
353    mCaptureSequencer->dump(fd, args);
354
355    mFrameProcessor->dump(fd, args);
356
357    result = "  Device dump:\n";
358    write(fd, result.string(), result.size());
359
360    status_t res = mDevice->dump(fd, args);
361    if (res != OK) {
362        result = String8::format("   Error dumping device: %s (%d)",
363                strerror(-res), res);
364        write(fd, result.string(), result.size());
365    }
366
367#undef CASE_APPEND_ENUM
368    return NO_ERROR;
369}
370
371// ICamera interface
372
373void Camera2Client::disconnect() {
374    ATRACE_CALL();
375    ALOGV("%s: E", __FUNCTION__);
376    Mutex::Autolock icl(mICameraLock);
377    status_t res;
378    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
379
380    if (mDevice == 0) return;
381
382    stopPreviewL();
383
384    if (mPreviewStreamId != NO_STREAM) {
385        mDevice->deleteStream(mPreviewStreamId);
386        mPreviewStreamId = NO_STREAM;
387    }
388
389    mJpegProcessor->deleteStream();
390
391    if (mRecordingStreamId != NO_STREAM) {
392        mDevice->deleteStream(mRecordingStreamId);
393        mRecordingStreamId = NO_STREAM;
394    }
395
396    mCallbackProcessor->deleteStream();
397
398    mZslProcessor->deleteStream();
399
400    mDevice.clear();
401    SharedParameters::Lock l(mParameters);
402    l.mParameters.state = Parameters::DISCONNECTED;
403
404    CameraService::Client::disconnect();
405}
406
407status_t Camera2Client::connect(const sp<ICameraClient>& client) {
408    ATRACE_CALL();
409    ALOGV("%s: E", __FUNCTION__);
410    Mutex::Autolock icl(mICameraLock);
411
412    if (mClientPid != 0 && getCallingPid() != mClientPid) {
413        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
414                "current locked to pid %d", __FUNCTION__,
415                mCameraId, getCallingPid(), mClientPid);
416        return BAD_VALUE;
417    }
418
419    mClientPid = getCallingPid();
420
421    mCameraClient = client;
422    mSharedCameraClient = client;
423
424    SharedParameters::Lock l(mParameters);
425    l.mParameters.state = Parameters::STOPPED;
426
427    return OK;
428}
429
430status_t Camera2Client::lock() {
431    ATRACE_CALL();
432    ALOGV("%s: E", __FUNCTION__);
433    Mutex::Autolock icl(mICameraLock);
434    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
435            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
436
437    if (mClientPid == 0) {
438        mClientPid = getCallingPid();
439        return OK;
440    }
441
442    if (mClientPid != getCallingPid()) {
443        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
444                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
445        return EBUSY;
446    }
447
448    return OK;
449}
450
451status_t Camera2Client::unlock() {
452    ATRACE_CALL();
453    ALOGV("%s: E", __FUNCTION__);
454    Mutex::Autolock icl(mICameraLock);
455    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
456            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
457
458    // TODO: Check for uninterruptable conditions
459
460    if (mClientPid == getCallingPid()) {
461        mClientPid = 0;
462        mCameraClient.clear();
463        mSharedCameraClient.clear();
464        return OK;
465    }
466
467    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
468            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
469    return EBUSY;
470}
471
472status_t Camera2Client::setPreviewDisplay(
473        const sp<Surface>& surface) {
474    ATRACE_CALL();
475    ALOGV("%s: E", __FUNCTION__);
476    Mutex::Autolock icl(mICameraLock);
477    status_t res;
478    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
479
480    sp<IBinder> binder;
481    sp<ANativeWindow> window;
482    if (surface != 0) {
483        binder = surface->asBinder();
484        window = surface;
485    }
486
487    return setPreviewWindowL(binder,window);
488}
489
490status_t Camera2Client::setPreviewTexture(
491        const sp<ISurfaceTexture>& surfaceTexture) {
492    ATRACE_CALL();
493    ALOGV("%s: E", __FUNCTION__);
494    Mutex::Autolock icl(mICameraLock);
495    status_t res;
496    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
497
498    sp<IBinder> binder;
499    sp<ANativeWindow> window;
500    if (surfaceTexture != 0) {
501        binder = surfaceTexture->asBinder();
502        window = new SurfaceTextureClient(surfaceTexture);
503    }
504    return setPreviewWindowL(binder, window);
505}
506
507status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
508        sp<ANativeWindow> window) {
509    ATRACE_CALL();
510    status_t res;
511
512    if (binder == mPreviewSurface) {
513        ALOGV("%s: Camera %d: New window is same as old window",
514                __FUNCTION__, mCameraId);
515        return NO_ERROR;
516    }
517
518    SharedParameters::Lock l(mParameters);
519    switch (l.mParameters.state) {
520        case Parameters::DISCONNECTED:
521        case Parameters::RECORD:
522        case Parameters::STILL_CAPTURE:
523        case Parameters::VIDEO_SNAPSHOT:
524            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
525                    __FUNCTION__, mCameraId,
526                    Parameters::getStateName(l.mParameters.state));
527            return INVALID_OPERATION;
528        case Parameters::STOPPED:
529        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
530            // OK
531            break;
532        case Parameters::PREVIEW:
533            // Already running preview - need to stop and create a new stream
534            // TODO: Optimize this so that we don't wait for old stream to drain
535            // before spinning up new stream
536            mDevice->clearStreamingRequest();
537            l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
538            break;
539    }
540
541    if (mPreviewStreamId != NO_STREAM) {
542        res = mDevice->waitUntilDrained();
543        if (res != OK) {
544            ALOGE("%s: Error waiting for preview to drain: %s (%d)",
545                    __FUNCTION__, strerror(-res), res);
546            return res;
547        }
548        res = mDevice->deleteStream(mPreviewStreamId);
549        if (res != OK) {
550            ALOGE("%s: Unable to delete old preview stream: %s (%d)",
551                    __FUNCTION__, strerror(-res), res);
552            return res;
553        }
554        mPreviewStreamId = NO_STREAM;
555    }
556
557    mPreviewSurface = binder;
558    mPreviewWindow = window;
559
560    if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
561        return startPreviewL(l.mParameters, false);
562    }
563
564    return OK;
565}
566
567void Camera2Client::setPreviewCallbackFlag(int flag) {
568    ATRACE_CALL();
569    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
570    Mutex::Autolock icl(mICameraLock);
571    status_t res;
572    if ( checkPid(__FUNCTION__) != OK) return;
573
574    SharedParameters::Lock l(mParameters);
575    setPreviewCallbackFlagL(l.mParameters, flag);
576}
577
578void Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
579    status_t res = OK;
580    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
581        ALOGV("%s: setting oneshot", __FUNCTION__);
582        params.previewCallbackOneShot = true;
583    }
584    if (params.previewCallbackFlags != (uint32_t)flag) {
585        params.previewCallbackFlags = flag;
586        switch(params.state) {
587        case Parameters::PREVIEW:
588            res = startPreviewL(params, true);
589            break;
590        case Parameters::RECORD:
591        case Parameters::VIDEO_SNAPSHOT:
592            res = startRecordingL(params, true);
593            break;
594        default:
595            break;
596        }
597        if (res != OK) {
598            ALOGE("%s: Camera %d: Unable to refresh request in state %s",
599                    __FUNCTION__, mCameraId,
600                    Parameters::getStateName(params.state));
601        }
602    }
603
604}
605
606status_t Camera2Client::startPreview() {
607    ATRACE_CALL();
608    ALOGV("%s: E", __FUNCTION__);
609    Mutex::Autolock icl(mICameraLock);
610    status_t res;
611    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
612    SharedParameters::Lock l(mParameters);
613    return startPreviewL(l.mParameters, false);
614}
615
616status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
617    ATRACE_CALL();
618    status_t res;
619    if (params.state >= Parameters::PREVIEW && !restart) {
620        ALOGE("%s: Can't start preview in state %s",
621                __FUNCTION__,
622                Parameters::getStateName(params.state));
623        return INVALID_OPERATION;
624    }
625
626    if (mPreviewWindow == 0) {
627        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
628        return OK;
629    }
630    params.state = Parameters::STOPPED;
631
632    res = updatePreviewStream(params);
633    if (res != OK) {
634        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
635                __FUNCTION__, mCameraId, strerror(-res), res);
636        return res;
637    }
638    bool callbacksEnabled = params.previewCallbackFlags &
639        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
640    if (callbacksEnabled) {
641        res = mCallbackProcessor->updateStream(params);
642        if (res != OK) {
643            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
644                    __FUNCTION__, mCameraId, strerror(-res), res);
645            return res;
646        }
647    }
648    if (params.zslMode && !params.recordingHint) {
649        res = mZslProcessor->updateStream(params);
650        if (res != OK) {
651            ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
652                    __FUNCTION__, mCameraId, strerror(-res), res);
653            return res;
654        }
655    }
656
657    CameraMetadata *request;
658    if (!params.recordingHint) {
659        if (mPreviewRequest.entryCount() == 0) {
660            res = updatePreviewRequest(params);
661            if (res != OK) {
662                ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
663                        __FUNCTION__, mCameraId, strerror(-res), res);
664                return res;
665            }
666        }
667        request = &mPreviewRequest;
668    } else {
669        // With recording hint set, we're going to be operating under the
670        // assumption that the user will record video. To optimize recording
671        // startup time, create the necessary output streams for recording and
672        // video snapshot now if they don't already exist.
673        if (mRecordingRequest.entryCount() == 0) {
674            res = updateRecordingRequest(params);
675            if (res != OK) {
676                ALOGE("%s: Camera %d: Unable to create recording preview "
677                        "request: %s (%d)",
678                        __FUNCTION__, mCameraId, strerror(-res), res);
679                return res;
680            }
681        }
682        request = &mRecordingRequest;
683
684        res = updateRecordingStream(params);
685        if (res != OK) {
686            ALOGE("%s: Camera %d: Unable to pre-configure recording "
687                    "stream: %s (%d)",
688                    __FUNCTION__, mCameraId, strerror(-res), res);
689            return res;
690        }
691
692        res = mJpegProcessor->updateStream(params);
693        if (res != OK) {
694            ALOGE("%s: Camera %d: Can't pre-configure still image "
695                    "stream: %s (%d)",
696                    __FUNCTION__, mCameraId, strerror(-res), res);
697            return res;
698        }
699    }
700
701    Vector<uint8_t> outputStreams;
702    outputStreams.push(getPreviewStreamId());
703
704    if (callbacksEnabled) {
705        outputStreams.push(getCallbackStreamId());
706    }
707    if (params.zslMode && !params.recordingHint) {
708        outputStreams.push(getZslStreamId());
709    }
710
711    res = request->update(
712        ANDROID_REQUEST_OUTPUT_STREAMS,
713        outputStreams);
714
715    if (res != OK) {
716        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
717                __FUNCTION__, mCameraId, strerror(-res), res);
718        return res;
719    }
720    res = request->sort();
721    if (res != OK) {
722        ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
723                __FUNCTION__, mCameraId, strerror(-res), res);
724        return res;
725    }
726
727    res = mDevice->setStreamingRequest(*request);
728    if (res != OK) {
729        ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
730                "%s (%d)",
731                __FUNCTION__, mCameraId, strerror(-res), res);
732        return res;
733    }
734    params.state = Parameters::PREVIEW;
735
736    return OK;
737}
738
739void Camera2Client::stopPreview() {
740    ATRACE_CALL();
741    ALOGV("%s: E", __FUNCTION__);
742    Mutex::Autolock icl(mICameraLock);
743    status_t res;
744    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
745    stopPreviewL();
746}
747
748void Camera2Client::stopPreviewL() {
749    ATRACE_CALL();
750    Parameters::State state;
751    {
752        SharedParameters::Lock l(mParameters);
753        state = l.mParameters.state;
754    }
755
756    switch (state) {
757        case Parameters::DISCONNECTED:
758            ALOGE("%s: Camera %d: Call before initialized",
759                    __FUNCTION__, mCameraId);
760            break;
761        case Parameters::STOPPED:
762            break;
763        case Parameters::STILL_CAPTURE:
764            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
765                    __FUNCTION__, mCameraId);
766            break;
767        case Parameters::RECORD:
768            // no break - identical to preview
769        case Parameters::PREVIEW:
770            mDevice->clearStreamingRequest();
771            mDevice->waitUntilDrained();
772            // no break
773        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
774            SharedParameters::Lock l(mParameters);
775            l.mParameters.state = Parameters::STOPPED;
776            commandStopFaceDetectionL(l.mParameters);
777            break;
778        }
779        default:
780            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
781                    state);
782    }
783}
784
785bool Camera2Client::previewEnabled() {
786    ATRACE_CALL();
787    Mutex::Autolock icl(mICameraLock);
788    status_t res;
789    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
790
791    SharedParameters::Lock l(mParameters);
792    return l.mParameters.state == Parameters::PREVIEW;
793}
794
795status_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
796    ATRACE_CALL();
797    Mutex::Autolock icl(mICameraLock);
798    status_t res;
799    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
800
801    SharedParameters::Lock l(mParameters);
802    switch (l.mParameters.state) {
803        case Parameters::RECORD:
804        case Parameters::VIDEO_SNAPSHOT:
805            ALOGE("%s: Camera %d: Can't be called in state %s",
806                    __FUNCTION__, mCameraId,
807                    Parameters::getStateName(l.mParameters.state));
808            return INVALID_OPERATION;
809        default:
810            // OK
811            break;
812    }
813
814    l.mParameters.storeMetadataInBuffers = enabled;
815
816    return OK;
817}
818
819status_t Camera2Client::startRecording() {
820    ATRACE_CALL();
821    ALOGV("%s: E", __FUNCTION__);
822    Mutex::Autolock icl(mICameraLock);
823    status_t res;
824    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
825    SharedParameters::Lock l(mParameters);
826
827    return startRecordingL(l.mParameters, false);
828}
829
830status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
831    status_t res;
832    switch (params.state) {
833        case Parameters::STOPPED:
834            res = startPreviewL(params, false);
835            if (res != OK) return res;
836            break;
837        case Parameters::PREVIEW:
838            // Ready to go
839            break;
840        case Parameters::RECORD:
841        case Parameters::VIDEO_SNAPSHOT:
842            // OK to call this when recording is already on, just skip unless
843            // we're looking to restart
844            if (!restart) return OK;
845            break;
846        default:
847            ALOGE("%s: Camera %d: Can't start recording in state %s",
848                    __FUNCTION__, mCameraId,
849                    Parameters::getStateName(params.state));
850            return INVALID_OPERATION;
851    };
852
853    if (!params.storeMetadataInBuffers) {
854        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
855                "non-metadata recording mode requested!", __FUNCTION__,
856                mCameraId);
857        return INVALID_OPERATION;
858    }
859
860    mCameraService->playSound(CameraService::SOUND_RECORDING);
861
862    res = updateRecordingStream(params);
863    if (res != OK) {
864        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
865                __FUNCTION__, mCameraId, strerror(-res), res);
866        return res;
867    }
868    bool callbacksEnabled = params.previewCallbackFlags &
869        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
870    if (callbacksEnabled) {
871        res = mCallbackProcessor->updateStream(params);
872        if (res != OK) {
873            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
874                    __FUNCTION__, mCameraId, strerror(-res), res);
875            return res;
876        }
877    }
878
879    if (mRecordingRequest.entryCount() == 0) {
880        res = updateRecordingRequest(params);
881        if (res != OK) {
882            ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
883                    __FUNCTION__, mCameraId, strerror(-res), res);
884            return res;
885        }
886    }
887
888    if (callbacksEnabled) {
889        uint8_t outputStreams[3] ={
890            getPreviewStreamId(),
891            getRecordingStreamId(),
892            getCallbackStreamId()
893        };
894        res = mRecordingRequest.update(
895                ANDROID_REQUEST_OUTPUT_STREAMS,
896                outputStreams, 3);
897    } else {
898        uint8_t outputStreams[2] = {
899            getPreviewStreamId(),
900            getRecordingStreamId()
901        };
902        res = mRecordingRequest.update(
903                ANDROID_REQUEST_OUTPUT_STREAMS,
904                outputStreams, 2);
905    }
906    if (res != OK) {
907        ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
908                __FUNCTION__, mCameraId, strerror(-res), res);
909        return res;
910    }
911    res = mRecordingRequest.sort();
912    if (res != OK) {
913        ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
914                __FUNCTION__, mCameraId, strerror(-res), res);
915        return res;
916    }
917
918    res = mDevice->setStreamingRequest(mRecordingRequest);
919    if (res != OK) {
920        ALOGE("%s: Camera %d: Unable to set recording request to start "
921                "recording: %s (%d)", __FUNCTION__, mCameraId,
922                strerror(-res), res);
923        return res;
924    }
925    if (params.state < Parameters::RECORD) {
926        params.state = Parameters::RECORD;
927    }
928
929    return OK;
930}
931
932void Camera2Client::stopRecording() {
933    ATRACE_CALL();
934    ALOGV("%s: E", __FUNCTION__);
935    Mutex::Autolock icl(mICameraLock);
936    SharedParameters::Lock l(mParameters);
937
938    status_t res;
939    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
940
941    switch (l.mParameters.state) {
942        case Parameters::RECORD:
943            // OK to stop
944            break;
945        case Parameters::STOPPED:
946        case Parameters::PREVIEW:
947        case Parameters::STILL_CAPTURE:
948        case Parameters::VIDEO_SNAPSHOT:
949        default:
950            ALOGE("%s: Camera %d: Can't stop recording in state %s",
951                    __FUNCTION__, mCameraId,
952                    Parameters::getStateName(l.mParameters.state));
953            return;
954    };
955
956    mCameraService->playSound(CameraService::SOUND_RECORDING);
957
958    res = startPreviewL(l.mParameters, true);
959    if (res != OK) {
960        ALOGE("%s: Camera %d: Unable to return to preview",
961                __FUNCTION__, mCameraId);
962    }
963}
964
965bool Camera2Client::recordingEnabled() {
966    ATRACE_CALL();
967    Mutex::Autolock icl(mICameraLock);
968
969    if ( checkPid(__FUNCTION__) != OK) return false;
970
971    return recordingEnabledL();
972}
973
974bool Camera2Client::recordingEnabledL() {
975    ATRACE_CALL();
976    SharedParameters::Lock l(mParameters);
977
978    return (l.mParameters.state == Parameters::RECORD
979            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
980}
981
982void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
983    ATRACE_CALL();
984    Mutex::Autolock icl(mICameraLock);
985    status_t res;
986    if ( checkPid(__FUNCTION__) != OK) return;
987
988    SharedParameters::Lock l(mParameters);
989
990    // Make sure this is for the current heap
991    ssize_t offset;
992    size_t size;
993    sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
994    if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
995        ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
996                "(got %x, expected %x)", __FUNCTION__, mCameraId,
997                heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
998        return;
999    }
1000    uint8_t *data = (uint8_t*)heap->getBase() + offset;
1001    uint32_t type = *(uint32_t*)data;
1002    if (type != kMetadataBufferTypeGrallocSource) {
1003        ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)",
1004                __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource);
1005        return;
1006    }
1007
1008    // Release the buffer back to the recording queue
1009
1010    buffer_handle_t imgHandle = *(buffer_handle_t*)(data + 4);
1011
1012    size_t itemIndex;
1013    for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) {
1014        const BufferItemConsumer::BufferItem item = mRecordingBuffers[itemIndex];
1015        if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT &&
1016                item.mGraphicBuffer->handle == imgHandle) {
1017            break;
1018        }
1019    }
1020    if (itemIndex == mRecordingBuffers.size()) {
1021        ALOGE("%s: Camera %d: Can't find buffer_handle_t %p in list of "
1022                "outstanding buffers", __FUNCTION__, mCameraId, imgHandle);
1023        return;
1024    }
1025
1026    ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId,
1027            imgHandle);
1028
1029    res = mRecordingConsumer->releaseBuffer(mRecordingBuffers[itemIndex]);
1030    if (res != OK) {
1031        ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):"
1032                "%s (%d)",
1033                __FUNCTION__, mCameraId, imgHandle, strerror(-res), res);
1034        return;
1035    }
1036    mRecordingBuffers.replaceAt(itemIndex);
1037
1038    mRecordingHeapFree++;
1039}
1040
1041status_t Camera2Client::autoFocus() {
1042    ATRACE_CALL();
1043    Mutex::Autolock icl(mICameraLock);
1044    status_t res;
1045    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1046
1047    int triggerId;
1048    {
1049        SharedParameters::Lock l(mParameters);
1050        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
1051        triggerId = l.mParameters.currentAfTriggerId;
1052    }
1053
1054    mDevice->triggerAutofocus(triggerId);
1055
1056    return OK;
1057}
1058
1059status_t Camera2Client::cancelAutoFocus() {
1060    ATRACE_CALL();
1061    Mutex::Autolock icl(mICameraLock);
1062    status_t res;
1063    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1064
1065    int triggerId;
1066    {
1067        SharedParameters::Lock l(mParameters);
1068        triggerId = ++l.mParameters.afTriggerCounter;
1069    }
1070
1071    mDevice->triggerCancelAutofocus(triggerId);
1072
1073    return OK;
1074}
1075
1076status_t Camera2Client::takePicture(int msgType) {
1077    ATRACE_CALL();
1078    Mutex::Autolock icl(mICameraLock);
1079    status_t res;
1080    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1081
1082    SharedParameters::Lock l(mParameters);
1083    switch (l.mParameters.state) {
1084        case Parameters::DISCONNECTED:
1085        case Parameters::STOPPED:
1086        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1087            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1088                    __FUNCTION__, mCameraId);
1089            return INVALID_OPERATION;
1090        case Parameters::PREVIEW:
1091            // Good to go for takePicture
1092            res = commandStopFaceDetectionL(l.mParameters);
1093            if (res != OK) {
1094                ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1095                        __FUNCTION__, mCameraId);
1096                return res;
1097            }
1098            l.mParameters.state = Parameters::STILL_CAPTURE;
1099            break;
1100        case Parameters::RECORD:
1101            // Good to go for video snapshot
1102            l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1103            break;
1104        case Parameters::STILL_CAPTURE:
1105        case Parameters::VIDEO_SNAPSHOT:
1106            ALOGE("%s: Camera %d: Already taking a picture",
1107                    __FUNCTION__, mCameraId);
1108            return INVALID_OPERATION;
1109    }
1110
1111    ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1112
1113    res = mJpegProcessor->updateStream(l.mParameters);
1114    if (res != OK) {
1115        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1116                __FUNCTION__, mCameraId, strerror(-res), res);
1117        return res;
1118    }
1119
1120    res = mCaptureSequencer->startCapture();
1121    if (res != OK) {
1122        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
1123                __FUNCTION__, mCameraId, strerror(-res), res);
1124    }
1125
1126    return res;
1127}
1128
1129status_t Camera2Client::setParameters(const String8& params) {
1130    ATRACE_CALL();
1131    ALOGV("%s: E", __FUNCTION__);
1132    Mutex::Autolock icl(mICameraLock);
1133    status_t res;
1134    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1135
1136    SharedParameters::Lock l(mParameters);
1137
1138    res = l.mParameters.set(params);
1139    if (res != OK) return res;
1140
1141    res = updateRequests(l.mParameters);
1142
1143    return res;
1144}
1145
1146String8 Camera2Client::getParameters() const {
1147    ATRACE_CALL();
1148    Mutex::Autolock icl(mICameraLock);
1149    if ( checkPid(__FUNCTION__) != OK) return String8();
1150
1151    SharedParameters::ReadLock l(mParameters);
1152
1153    // TODO: Deal with focus distances
1154    return l.mParameters.paramsFlattened;
1155}
1156
1157status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1158    ATRACE_CALL();
1159    Mutex::Autolock icl(mICameraLock);
1160    status_t res;
1161    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1162
1163    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1164            cmd, arg1, arg2);
1165
1166    switch (cmd) {
1167        case CAMERA_CMD_START_SMOOTH_ZOOM:
1168            return commandStartSmoothZoomL();
1169        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
1170            return commandStopSmoothZoomL();
1171        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
1172            return commandSetDisplayOrientationL(arg1);
1173        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
1174            return commandEnableShutterSoundL(arg1 == 1);
1175        case CAMERA_CMD_PLAY_RECORDING_SOUND:
1176            return commandPlayRecordingSoundL();
1177        case CAMERA_CMD_START_FACE_DETECTION:
1178            return commandStartFaceDetectionL(arg1);
1179        case CAMERA_CMD_STOP_FACE_DETECTION: {
1180            SharedParameters::Lock l(mParameters);
1181            return commandStopFaceDetectionL(l.mParameters);
1182        }
1183        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
1184            return commandEnableFocusMoveMsgL(arg1 == 1);
1185        case CAMERA_CMD_PING:
1186            return commandPingL();
1187        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1188            return commandSetVideoBufferCountL(arg1);
1189        default:
1190            ALOGE("%s: Unknown command %d (arguments %d, %d)",
1191                    __FUNCTION__, cmd, arg1, arg2);
1192            return BAD_VALUE;
1193    }
1194}
1195
1196status_t Camera2Client::commandStartSmoothZoomL() {
1197    ALOGE("%s: Unimplemented!", __FUNCTION__);
1198    return OK;
1199}
1200
1201status_t Camera2Client::commandStopSmoothZoomL() {
1202    ALOGE("%s: Unimplemented!", __FUNCTION__);
1203    return OK;
1204}
1205
1206status_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
1207    int transform = Parameters::degToTransform(degrees,
1208            mCameraFacing == CAMERA_FACING_FRONT);
1209    if (transform == -1) {
1210        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1211                __FUNCTION__, mCameraId, degrees);
1212        return BAD_VALUE;
1213    }
1214    SharedParameters::Lock l(mParameters);
1215    if (transform != l.mParameters.previewTransform &&
1216            mPreviewStreamId != NO_STREAM) {
1217        mDevice->setStreamTransform(mPreviewStreamId, transform);
1218    }
1219    l.mParameters.previewTransform = transform;
1220    return OK;
1221}
1222
1223status_t Camera2Client::commandEnableShutterSoundL(bool enable) {
1224    SharedParameters::Lock l(mParameters);
1225    if (enable) {
1226        l.mParameters.playShutterSound = true;
1227        return OK;
1228    }
1229
1230    // Disabling shutter sound may not be allowed. In that case only
1231    // allow the mediaserver process to disable the sound.
1232    char value[PROPERTY_VALUE_MAX];
1233    property_get("ro.camera.sound.forced", value, "0");
1234    if (strncmp(value, "0", 2) != 0) {
1235        // Disabling shutter sound is not allowed. Deny if the current
1236        // process is not mediaserver.
1237        if (getCallingPid() != getpid()) {
1238            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
1239                    getCallingPid());
1240            return PERMISSION_DENIED;
1241        }
1242    }
1243
1244    l.mParameters.playShutterSound = false;
1245    return OK;
1246}
1247
1248status_t Camera2Client::commandPlayRecordingSoundL() {
1249    mCameraService->playSound(CameraService::SOUND_RECORDING);
1250    return OK;
1251}
1252
1253status_t Camera2Client::commandStartFaceDetectionL(int type) {
1254    ALOGV("%s: Camera %d: Starting face detection",
1255          __FUNCTION__, mCameraId);
1256    status_t res;
1257    SharedParameters::Lock l(mParameters);
1258    switch (l.mParameters.state) {
1259        case Parameters::DISCONNECTED:
1260        case Parameters::STOPPED:
1261        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1262        case Parameters::STILL_CAPTURE:
1263            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
1264                    __FUNCTION__, mCameraId);
1265            return INVALID_OPERATION;
1266        case Parameters::PREVIEW:
1267        case Parameters::RECORD:
1268        case Parameters::VIDEO_SNAPSHOT:
1269            // Good to go for starting face detect
1270            break;
1271    }
1272    // Ignoring type
1273    if (l.mParameters.fastInfo.bestFaceDetectMode ==
1274            ANDROID_STATS_FACE_DETECTION_OFF) {
1275        ALOGE("%s: Camera %d: Face detection not supported",
1276                __FUNCTION__, mCameraId);
1277        return INVALID_OPERATION;
1278    }
1279    if (l.mParameters.enableFaceDetect) return OK;
1280
1281    l.mParameters.enableFaceDetect = true;
1282
1283    res = updateRequests(l.mParameters);
1284
1285    return res;
1286}
1287
1288status_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
1289    status_t res = OK;
1290    ALOGV("%s: Camera %d: Stopping face detection",
1291          __FUNCTION__, mCameraId);
1292
1293    if (!params.enableFaceDetect) return OK;
1294
1295    params.enableFaceDetect = false;
1296
1297    if (params.state == Parameters::PREVIEW
1298            || params.state == Parameters::RECORD
1299            || params.state == Parameters::VIDEO_SNAPSHOT) {
1300        res = updateRequests(params);
1301    }
1302
1303    return res;
1304}
1305
1306status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
1307    SharedParameters::Lock l(mParameters);
1308    l.mParameters.enableFocusMoveMessages = enable;
1309
1310    return OK;
1311}
1312
1313status_t Camera2Client::commandPingL() {
1314    // Always ping back if access is proper and device is alive
1315    SharedParameters::Lock l(mParameters);
1316    if (l.mParameters.state != Parameters::DISCONNECTED) {
1317        return OK;
1318    } else {
1319        return NO_INIT;
1320    }
1321}
1322
1323status_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
1324    if (recordingEnabledL()) {
1325        ALOGE("%s: Camera %d: Error setting video buffer count after "
1326                "recording was started", __FUNCTION__, mCameraId);
1327        return INVALID_OPERATION;
1328    }
1329
1330    // 32 is the current upper limit on the video buffer count for BufferQueue
1331    if (count > 32) {
1332        ALOGE("%s: Camera %d: Error setting %d as video buffer count value",
1333                __FUNCTION__, mCameraId, count);
1334        return BAD_VALUE;
1335    }
1336
1337    // Need to reallocate memory for heap
1338    if (mRecordingHeapCount != count) {
1339        if  (mRecordingHeap != 0) {
1340            mRecordingHeap.clear();
1341            mRecordingHeap = NULL;
1342        }
1343        mRecordingHeapCount = count;
1344    }
1345
1346    return OK;
1347}
1348
1349/** Device-related methods */
1350
1351void Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1352    ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1353}
1354
1355void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1356    ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1357            frameNumber, timestamp);
1358}
1359
1360void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1361    ALOGV("%s: Autofocus state now %d, last trigger %d",
1362            __FUNCTION__, newState, triggerId);
1363    bool sendCompletedMessage = false;
1364    bool sendMovingMessage = false;
1365
1366    bool success = false;
1367    bool afInMotion = false;
1368    {
1369        SharedParameters::Lock l(mParameters);
1370        switch (l.mParameters.focusMode) {
1371            case Parameters::FOCUS_MODE_AUTO:
1372            case Parameters::FOCUS_MODE_MACRO:
1373                // Don't send notifications upstream if they're not for the current AF
1374                // trigger. For example, if cancel was called in between, or if we
1375                // already sent a notification about this AF call.
1376                if (triggerId != l.mParameters.currentAfTriggerId) break;
1377                switch (newState) {
1378                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1379                        success = true;
1380                        // no break
1381                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1382                        sendCompletedMessage = true;
1383                        l.mParameters.currentAfTriggerId = -1;
1384                        break;
1385                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1386                        // Just starting focusing, ignore
1387                        break;
1388                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1389                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1390                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1391                    default:
1392                        // Unexpected in AUTO/MACRO mode
1393                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1394                                __FUNCTION__, newState);
1395                        break;
1396                }
1397                break;
1398            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1399            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1400                switch (newState) {
1401                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1402                        success = true;
1403                        // no break
1404                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1405                        // Don't send notifications upstream if they're not for
1406                        // the current AF trigger. For example, if cancel was
1407                        // called in between, or if we already sent a
1408                        // notification about this AF call.
1409                        // Send both a 'AF done' callback and a 'AF move' callback
1410                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1411                        sendCompletedMessage = true;
1412                        afInMotion = false;
1413                        if (l.mParameters.enableFocusMoveMessages &&
1414                                l.mParameters.afInMotion) {
1415                            sendMovingMessage = true;
1416                        }
1417                        l.mParameters.currentAfTriggerId = -1;
1418                        break;
1419                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1420                        // Cancel was called, or we switched state; care if
1421                        // currently moving
1422                        afInMotion = false;
1423                        if (l.mParameters.enableFocusMoveMessages &&
1424                                l.mParameters.afInMotion) {
1425                            sendMovingMessage = true;
1426                        }
1427                        break;
1428                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1429                        // Start passive scan, inform upstream
1430                        afInMotion = true;
1431                        // no break
1432                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1433                        // Stop passive scan, inform upstream
1434                        if (l.mParameters.enableFocusMoveMessages) {
1435                            sendMovingMessage = true;
1436                        }
1437                        break;
1438                }
1439                l.mParameters.afInMotion = afInMotion;
1440                break;
1441            case Parameters::FOCUS_MODE_EDOF:
1442            case Parameters::FOCUS_MODE_INFINITY:
1443            case Parameters::FOCUS_MODE_FIXED:
1444            default:
1445                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1446                    ALOGE("%s: Unexpected AF state change %d "
1447                            "(ID %d) in focus mode %d",
1448                          __FUNCTION__, newState, triggerId,
1449                            l.mParameters.focusMode);
1450                }
1451        }
1452    }
1453    if (sendMovingMessage) {
1454        SharedCameraClient::Lock l(mSharedCameraClient);
1455        if (l.mCameraClient != 0) {
1456            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
1457                    afInMotion ? 1 : 0, 0);
1458        }
1459    }
1460    if (sendCompletedMessage) {
1461        SharedCameraClient::Lock l(mSharedCameraClient);
1462        if (l.mCameraClient != 0) {
1463            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1464                    success ? 1 : 0, 0);
1465        }
1466    }
1467}
1468
1469void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1470    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1471            __FUNCTION__, newState, triggerId);
1472    mCaptureSequencer->notifyAutoExposure(newState, triggerId);
1473}
1474
1475void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1476    ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1477            __FUNCTION__, newState, triggerId);
1478}
1479
1480int Camera2Client::getCameraId() const {
1481    return mCameraId;
1482}
1483
1484const sp<Camera2Device>& Camera2Client::getCameraDevice() {
1485    return mDevice;
1486}
1487
1488const sp<CameraService>& Camera2Client::getCameraService() {
1489    return mCameraService;
1490}
1491
1492camera2::SharedParameters& Camera2Client::getParameters() {
1493    return mParameters;
1494}
1495
1496int Camera2Client::getPreviewStreamId() const {
1497    return mPreviewStreamId;
1498}
1499
1500int Camera2Client::getCaptureStreamId() const {
1501    return mJpegProcessor->getStreamId();
1502}
1503
1504int Camera2Client::getCallbackStreamId() const {
1505    return mCallbackProcessor->getStreamId();
1506}
1507
1508int Camera2Client::getRecordingStreamId() const {
1509    return mRecordingStreamId;
1510}
1511
1512int Camera2Client::getZslStreamId() const {
1513    return mZslProcessor->getStreamId();
1514}
1515
1516status_t Camera2Client::registerFrameListener(int32_t id,
1517        wp<camera2::FrameProcessor::FilteredListener> listener) {
1518    return mFrameProcessor->registerListener(id, listener);
1519}
1520
1521status_t Camera2Client::removeFrameListener(int32_t id) {
1522    return mFrameProcessor->removeListener(id);
1523}
1524
1525Camera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1526        mCameraClient(client.mCameraClient),
1527        mSharedClient(client) {
1528    mSharedClient.mCameraClientLock.lock();
1529}
1530
1531Camera2Client::SharedCameraClient::Lock::~Lock() {
1532    mSharedClient.mCameraClientLock.unlock();
1533}
1534
1535Camera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1536        mCameraClient(client) {
1537}
1538
1539Camera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1540        const sp<ICameraClient>&client) {
1541    Mutex::Autolock l(mCameraClientLock);
1542    mCameraClient = client;
1543    return *this;
1544}
1545
1546void Camera2Client::SharedCameraClient::clear() {
1547    Mutex::Autolock l(mCameraClientLock);
1548    mCameraClient.clear();
1549}
1550
1551const int32_t Camera2Client::kPreviewRequestId;
1552const int32_t Camera2Client::kRecordRequestId;
1553const int32_t Camera2Client::kFirstCaptureRequestId;
1554
1555void Camera2Client::onRecordingFrameAvailable() {
1556    ATRACE_CALL();
1557    status_t res;
1558    sp<Camera2Heap> recordingHeap;
1559    size_t heapIdx = 0;
1560    nsecs_t timestamp;
1561    {
1562        SharedParameters::Lock l(mParameters);
1563
1564        BufferItemConsumer::BufferItem imgBuffer;
1565        res = mRecordingConsumer->acquireBuffer(&imgBuffer);
1566        if (res != OK) {
1567            ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
1568                    __FUNCTION__, mCameraId, strerror(-res), res);
1569            return;
1570        }
1571        timestamp = imgBuffer.mTimestamp;
1572
1573        mRecordingFrameCount++;
1574        ALOGV("OnRecordingFrame: Frame %d", mRecordingFrameCount);
1575
1576        // TODO: Signal errors here upstream
1577        if (l.mParameters.state != Parameters::RECORD &&
1578                l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
1579            ALOGV("%s: Camera %d: Discarding recording image buffers received after "
1580                    "recording done",
1581                    __FUNCTION__, mCameraId);
1582            mRecordingConsumer->releaseBuffer(imgBuffer);
1583            return;
1584        }
1585
1586        if (mRecordingHeap == 0) {
1587            const size_t bufferSize = 4 + sizeof(buffer_handle_t);
1588            ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
1589                    "size %d bytes", __FUNCTION__, mCameraId,
1590                    mRecordingHeapCount, bufferSize);
1591
1592            mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount,
1593                    "Camera2Client::RecordingHeap");
1594            if (mRecordingHeap->mHeap->getSize() == 0) {
1595                ALOGE("%s: Camera %d: Unable to allocate memory for recording",
1596                        __FUNCTION__, mCameraId);
1597                mRecordingConsumer->releaseBuffer(imgBuffer);
1598                return;
1599            }
1600            for (size_t i = 0; i < mRecordingBuffers.size(); i++) {
1601                if (mRecordingBuffers[i].mBuf !=
1602                        BufferItemConsumer::INVALID_BUFFER_SLOT) {
1603                    ALOGE("%s: Camera %d: Non-empty recording buffers list!",
1604                            __FUNCTION__, mCameraId);
1605                }
1606            }
1607            mRecordingBuffers.clear();
1608            mRecordingBuffers.setCapacity(mRecordingHeapCount);
1609            mRecordingBuffers.insertAt(0, mRecordingHeapCount);
1610
1611            mRecordingHeapHead = 0;
1612            mRecordingHeapFree = mRecordingHeapCount;
1613        }
1614
1615        if ( mRecordingHeapFree == 0) {
1616            ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
1617                    __FUNCTION__, mCameraId);
1618            mRecordingConsumer->releaseBuffer(imgBuffer);
1619            return;
1620        }
1621
1622        heapIdx = mRecordingHeapHead;
1623        mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount;
1624        mRecordingHeapFree--;
1625
1626        ALOGV("%s: Camera %d: Timestamp %lld",
1627                __FUNCTION__, mCameraId, timestamp);
1628
1629        ssize_t offset;
1630        size_t size;
1631        sp<IMemoryHeap> heap =
1632                mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
1633                        &size);
1634
1635        uint8_t *data = (uint8_t*)heap->getBase() + offset;
1636        uint32_t type = kMetadataBufferTypeGrallocSource;
1637        *((uint32_t*)data) = type;
1638        *((buffer_handle_t*)(data + 4)) = imgBuffer.mGraphicBuffer->handle;
1639        ALOGV("%s: Camera %d: Sending out buffer_handle_t %p",
1640                __FUNCTION__, mCameraId, imgBuffer.mGraphicBuffer->handle);
1641        mRecordingBuffers.replaceAt(imgBuffer, heapIdx);
1642        recordingHeap = mRecordingHeap;
1643    }
1644
1645    // Call outside locked parameters to allow re-entrancy from notification
1646    SharedCameraClient::Lock l(mSharedCameraClient);
1647    if (l.mCameraClient != 0) {
1648        l.mCameraClient->dataCallbackTimestamp(timestamp,
1649                CAMERA_MSG_VIDEO_FRAME,
1650                recordingHeap->mBuffers[heapIdx]);
1651    }
1652}
1653
1654/** Utility methods */
1655
1656status_t Camera2Client::updateRequests(Parameters &params) {
1657    status_t res;
1658
1659    res = updatePreviewRequest(params);
1660    if (res != OK) {
1661        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1662                __FUNCTION__, mCameraId, strerror(-res), res);
1663        return res;
1664    }
1665    res = updateRecordingRequest(params);
1666    if (res != OK) {
1667        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
1668                __FUNCTION__, mCameraId, strerror(-res), res);
1669        return res;
1670    }
1671
1672    if (params.state == Parameters::PREVIEW) {
1673        res = startPreviewL(params, true);
1674        if (res != OK) {
1675            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1676                    __FUNCTION__, mCameraId, strerror(-res), res);
1677            return res;
1678        }
1679    } else if (params.state == Parameters::RECORD ||
1680            params.state == Parameters::VIDEO_SNAPSHOT) {
1681        res = mDevice->setStreamingRequest(mRecordingRequest);
1682        if (res != OK) {
1683            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
1684                    __FUNCTION__, mCameraId, strerror(-res), res);
1685            return res;
1686        }
1687    }
1688    return res;
1689}
1690
1691status_t Camera2Client::updatePreviewStream(const Parameters &params) {
1692    ATRACE_CALL();
1693    status_t res;
1694
1695    if (mPreviewStreamId != NO_STREAM) {
1696        // Check if stream parameters have to change
1697        uint32_t currentWidth, currentHeight;
1698        res = mDevice->getStreamInfo(mPreviewStreamId,
1699                &currentWidth, &currentHeight, 0);
1700        if (res != OK) {
1701            ALOGE("%s: Camera %d: Error querying preview stream info: "
1702                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1703            return res;
1704        }
1705        if (currentWidth != (uint32_t)params.previewWidth ||
1706                currentHeight != (uint32_t)params.previewHeight) {
1707            ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
1708                    __FUNCTION__, mCameraId, currentWidth, currentHeight,
1709                    params.previewWidth, params.previewHeight);
1710            res = mDevice->waitUntilDrained();
1711            if (res != OK) {
1712                ALOGE("%s: Camera %d: Error waiting for preview to drain: "
1713                        "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1714                return res;
1715            }
1716            res = mDevice->deleteStream(mPreviewStreamId);
1717            if (res != OK) {
1718                ALOGE("%s: Camera %d: Unable to delete old output stream "
1719                        "for preview: %s (%d)", __FUNCTION__, mCameraId,
1720                        strerror(-res), res);
1721                return res;
1722            }
1723            mPreviewStreamId = NO_STREAM;
1724        }
1725    }
1726
1727    if (mPreviewStreamId == NO_STREAM) {
1728        res = mDevice->createStream(mPreviewWindow,
1729                params.previewWidth, params.previewHeight,
1730                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
1731                &mPreviewStreamId);
1732        if (res != OK) {
1733            ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
1734                    __FUNCTION__, mCameraId, strerror(-res), res);
1735            return res;
1736        }
1737    }
1738
1739    res = mDevice->setStreamTransform(mPreviewStreamId,
1740            params.previewTransform);
1741    if (res != OK) {
1742        ALOGE("%s: Camera %d: Unable to set preview stream transform: "
1743                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1744        return res;
1745    }
1746
1747    return OK;
1748}
1749
1750status_t Camera2Client::updatePreviewRequest(const Parameters &params) {
1751    ATRACE_CALL();
1752    status_t res;
1753    if (mPreviewRequest.entryCount() == 0) {
1754        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
1755                &mPreviewRequest);
1756        if (res != OK) {
1757            ALOGE("%s: Camera %d: Unable to create default preview request: "
1758                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1759            return res;
1760        }
1761    }
1762
1763    res = params.updateRequest(&mPreviewRequest);
1764    if (res != OK) {
1765        ALOGE("%s: Camera %d: Unable to update common entries of preview "
1766                "request: %s (%d)", __FUNCTION__, mCameraId,
1767                strerror(-res), res);
1768        return res;
1769    }
1770
1771    res = mPreviewRequest.update(ANDROID_REQUEST_ID,
1772            &kPreviewRequestId, 1);
1773
1774    return OK;
1775}
1776
1777status_t Camera2Client::updateRecordingRequest(const Parameters &params) {
1778    ATRACE_CALL();
1779    status_t res;
1780    if (mRecordingRequest.entryCount() == 0) {
1781        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
1782                &mRecordingRequest);
1783        if (res != OK) {
1784            ALOGE("%s: Camera %d: Unable to create default recording request:"
1785                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1786            return res;
1787        }
1788    }
1789
1790    res = params.updateRequest(&mRecordingRequest);
1791    if (res != OK) {
1792        ALOGE("%s: Camera %d: Unable to update common entries of recording "
1793                "request: %s (%d)", __FUNCTION__, mCameraId,
1794                strerror(-res), res);
1795        return res;
1796    }
1797
1798    return OK;
1799}
1800
1801status_t Camera2Client::updateRecordingStream(const Parameters &params) {
1802    status_t res;
1803
1804    if (mRecordingConsumer == 0) {
1805        // Create CPU buffer queue endpoint. We need one more buffer here so that we can
1806        // always acquire and free a buffer when the heap is full; otherwise the consumer
1807        // will have buffers in flight we'll never clear out.
1808        mRecordingConsumer = new BufferItemConsumer(
1809                GRALLOC_USAGE_HW_VIDEO_ENCODER,
1810                mRecordingHeapCount + 1,
1811                true);
1812        mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
1813        mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
1814        mRecordingWindow = new SurfaceTextureClient(
1815            mRecordingConsumer->getProducerInterface());
1816        // Allocate memory later, since we don't know buffer size until receipt
1817    }
1818
1819    if (mRecordingStreamId != NO_STREAM) {
1820        // Check if stream parameters have to change
1821        uint32_t currentWidth, currentHeight;
1822        res = mDevice->getStreamInfo(mRecordingStreamId,
1823                &currentWidth, &currentHeight, 0);
1824        if (res != OK) {
1825            ALOGE("%s: Camera %d: Error querying recording output stream info: "
1826                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1827            return res;
1828        }
1829        if (currentWidth != (uint32_t)params.videoWidth ||
1830                currentHeight != (uint32_t)params.videoHeight) {
1831            // TODO: Should wait to be sure previous recording has finished
1832            res = mDevice->deleteStream(mRecordingStreamId);
1833            if (res != OK) {
1834                ALOGE("%s: Camera %d: Unable to delete old output stream "
1835                        "for recording: %s (%d)", __FUNCTION__, mCameraId,
1836                        strerror(-res), res);
1837                return res;
1838            }
1839            mRecordingStreamId = NO_STREAM;
1840        }
1841    }
1842
1843    if (mRecordingStreamId == NO_STREAM) {
1844        mRecordingFrameCount = 0;
1845        res = mDevice->createStream(mRecordingWindow,
1846                params.videoWidth, params.videoHeight,
1847                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId);
1848        if (res != OK) {
1849            ALOGE("%s: Camera %d: Can't create output stream for recording: "
1850                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1851            return res;
1852        }
1853    }
1854
1855    return OK;
1856}
1857
1858size_t Camera2Client::calculateBufferSize(int width, int height,
1859        int format, int stride) {
1860    switch (format) {
1861        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1862            return width * height * 2;
1863        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1864            return width * height * 3 / 2;
1865        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1866            return width * height * 2;
1867        case HAL_PIXEL_FORMAT_YV12: {      // YV12
1868            size_t ySize = stride * height;
1869            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
1870            size_t uvSize = uvStride * height / 2;
1871            return ySize + uvSize * 2;
1872        }
1873        case HAL_PIXEL_FORMAT_RGB_565:
1874            return width * height * 2;
1875        case HAL_PIXEL_FORMAT_RGBA_8888:
1876            return width * height * 4;
1877        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1878            return width * height * 2;
1879        default:
1880            ALOGE("%s: Unknown preview format: %x",
1881                    __FUNCTION__,  format);
1882            return 0;
1883    }
1884}
1885
1886} // namespace android
1887