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