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