Home | History | Annotate | Download | only in device3
      1 /*
      2  * Copyright (C) 2013-2018 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 "Camera3-Device"
     18 #define ATRACE_TAG ATRACE_TAG_CAMERA
     19 //#define LOG_NDEBUG 0
     20 //#define LOG_NNDEBUG 0  // Per-frame verbose logging
     21 
     22 #ifdef LOG_NNDEBUG
     23 #define ALOGVV(...) ALOGV(__VA_ARGS__)
     24 #else
     25 #define ALOGVV(...) ((void)0)
     26 #endif
     27 
     28 // Convenience macro for transient errors
     29 #define CLOGE(fmt, ...) ALOGE("Camera %s: %s: " fmt, mId.string(), __FUNCTION__, \
     30             ##__VA_ARGS__)
     31 
     32 // Convenience macros for transitioning to the error state
     33 #define SET_ERR(fmt, ...) setErrorState(   \
     34     "%s: " fmt, __FUNCTION__,              \
     35     ##__VA_ARGS__)
     36 #define SET_ERR_L(fmt, ...) setErrorStateLocked( \
     37     "%s: " fmt, __FUNCTION__,                    \
     38     ##__VA_ARGS__)
     39 
     40 #include <inttypes.h>
     41 
     42 #include <utility>
     43 
     44 #include <utils/Log.h>
     45 #include <utils/Trace.h>
     46 #include <utils/Timers.h>
     47 #include <cutils/properties.h>
     48 
     49 #include <android/hardware/camera2/ICameraDeviceUser.h>
     50 
     51 #include "utils/CameraTraces.h"
     52 #include "mediautils/SchedulingPolicyService.h"
     53 #include "device3/Camera3Device.h"
     54 #include "device3/Camera3OutputStream.h"
     55 #include "device3/Camera3InputStream.h"
     56 #include "device3/Camera3DummyStream.h"
     57 #include "device3/Camera3SharedOutputStream.h"
     58 #include "CameraService.h"
     59 
     60 using namespace android::camera3;
     61 using namespace android::hardware::camera;
     62 using namespace android::hardware::camera::device::V3_2;
     63 
     64 namespace android {
     65 
     66 Camera3Device::Camera3Device(const String8 &id):
     67         mId(id),
     68         mOperatingMode(NO_MODE),
     69         mIsConstrainedHighSpeedConfiguration(false),
     70         mStatus(STATUS_UNINITIALIZED),
     71         mStatusWaiters(0),
     72         mUsePartialResult(false),
     73         mNumPartialResults(1),
     74         mTimestampOffset(0),
     75         mNextResultFrameNumber(0),
     76         mNextReprocessResultFrameNumber(0),
     77         mNextShutterFrameNumber(0),
     78         mNextReprocessShutterFrameNumber(0),
     79         mListener(NULL),
     80         mVendorTagId(CAMERA_METADATA_INVALID_VENDOR_ID),
     81         mLastTemplateId(-1)
     82 {
     83     ATRACE_CALL();
     84     camera3_callback_ops::notify = &sNotify;
     85     camera3_callback_ops::process_capture_result = &sProcessCaptureResult;
     86     ALOGV("%s: Created device for camera %s", __FUNCTION__, mId.string());
     87 }
     88 
     89 Camera3Device::~Camera3Device()
     90 {
     91     ATRACE_CALL();
     92     ALOGV("%s: Tearing down for camera id %s", __FUNCTION__, mId.string());
     93     disconnect();
     94 }
     95 
     96 const String8& Camera3Device::getId() const {
     97     return mId;
     98 }
     99 
    100 status_t Camera3Device::initialize(sp<CameraProviderManager> manager, const String8& monitorTags) {
    101     ATRACE_CALL();
    102     Mutex::Autolock il(mInterfaceLock);
    103     Mutex::Autolock l(mLock);
    104 
    105     ALOGV("%s: Initializing HIDL device for camera %s", __FUNCTION__, mId.string());
    106     if (mStatus != STATUS_UNINITIALIZED) {
    107         CLOGE("Already initialized!");
    108         return INVALID_OPERATION;
    109     }
    110     if (manager == nullptr) return INVALID_OPERATION;
    111 
    112     sp<ICameraDeviceSession> session;
    113     ATRACE_BEGIN("CameraHal::openSession");
    114     status_t res = manager->openSession(mId.string(), this,
    115             /*out*/ &session);
    116     ATRACE_END();
    117     if (res != OK) {
    118         SET_ERR_L("Could not open camera session: %s (%d)", strerror(-res), res);
    119         return res;
    120     }
    121 
    122     res = manager->getCameraCharacteristics(mId.string(), &mDeviceInfo);
    123     if (res != OK) {
    124         SET_ERR_L("Could not retrive camera characteristics: %s (%d)", strerror(-res), res);
    125         session->close();
    126         return res;
    127     }
    128 
    129     std::shared_ptr<RequestMetadataQueue> queue;
    130     auto requestQueueRet = session->getCaptureRequestMetadataQueue(
    131         [&queue](const auto& descriptor) {
    132             queue = std::make_shared<RequestMetadataQueue>(descriptor);
    133             if (!queue->isValid() || queue->availableToWrite() <= 0) {
    134                 ALOGE("HAL returns empty request metadata fmq, not use it");
    135                 queue = nullptr;
    136                 // don't use the queue onwards.
    137             }
    138         });
    139     if (!requestQueueRet.isOk()) {
    140         ALOGE("Transaction error when getting request metadata fmq: %s, not use it",
    141                 requestQueueRet.description().c_str());
    142         return DEAD_OBJECT;
    143     }
    144 
    145     std::unique_ptr<ResultMetadataQueue>& resQueue = mResultMetadataQueue;
    146     auto resultQueueRet = session->getCaptureResultMetadataQueue(
    147         [&resQueue](const auto& descriptor) {
    148             resQueue = std::make_unique<ResultMetadataQueue>(descriptor);
    149             if (!resQueue->isValid() || resQueue->availableToWrite() <= 0) {
    150                 ALOGE("HAL returns empty result metadata fmq, not use it");
    151                 resQueue = nullptr;
    152                 // Don't use the resQueue onwards.
    153             }
    154         });
    155     if (!resultQueueRet.isOk()) {
    156         ALOGE("Transaction error when getting result metadata queue from camera session: %s",
    157                 resultQueueRet.description().c_str());
    158         return DEAD_OBJECT;
    159     }
    160     IF_ALOGV() {
    161         session->interfaceChain([](
    162             ::android::hardware::hidl_vec<::android::hardware::hidl_string> interfaceChain) {
    163                 ALOGV("Session interface chain:");
    164                 for (auto iface : interfaceChain) {
    165                     ALOGV("  %s", iface.c_str());
    166                 }
    167             });
    168     }
    169 
    170     mInterface = new HalInterface(session, queue);
    171     std::string providerType;
    172     mVendorTagId = manager->getProviderTagIdLocked(mId.string());
    173     mTagMonitor.initialize(mVendorTagId);
    174     if (!monitorTags.isEmpty()) {
    175         mTagMonitor.parseTagsToMonitor(String8(monitorTags));
    176     }
    177 
    178     return initializeCommonLocked();
    179 }
    180 
    181 status_t Camera3Device::initializeCommonLocked() {
    182 
    183     /** Start up status tracker thread */
    184     mStatusTracker = new StatusTracker(this);
    185     status_t res = mStatusTracker->run(String8::format("C3Dev-%s-Status", mId.string()).string());
    186     if (res != OK) {
    187         SET_ERR_L("Unable to start status tracking thread: %s (%d)",
    188                 strerror(-res), res);
    189         mInterface->close();
    190         mStatusTracker.clear();
    191         return res;
    192     }
    193 
    194     /** Register in-flight map to the status tracker */
    195     mInFlightStatusId = mStatusTracker->addComponent();
    196 
    197     /** Create buffer manager */
    198     mBufferManager = new Camera3BufferManager();
    199 
    200     Vector<int32_t> sessionParamKeys;
    201     camera_metadata_entry_t sessionKeysEntry = mDeviceInfo.find(
    202             ANDROID_REQUEST_AVAILABLE_SESSION_KEYS);
    203     if (sessionKeysEntry.count > 0) {
    204         sessionParamKeys.insertArrayAt(sessionKeysEntry.data.i32, 0, sessionKeysEntry.count);
    205     }
    206     /** Start up request queue thread */
    207     mRequestThread = new RequestThread(this, mStatusTracker, mInterface, sessionParamKeys);
    208     res = mRequestThread->run(String8::format("C3Dev-%s-ReqQueue", mId.string()).string());
    209     if (res != OK) {
    210         SET_ERR_L("Unable to start request queue thread: %s (%d)",
    211                 strerror(-res), res);
    212         mInterface->close();
    213         mRequestThread.clear();
    214         return res;
    215     }
    216 
    217     mPreparerThread = new PreparerThread();
    218 
    219     internalUpdateStatusLocked(STATUS_UNCONFIGURED);
    220     mNextStreamId = 0;
    221     mDummyStreamId = NO_STREAM;
    222     mNeedConfig = true;
    223     mPauseStateNotify = false;
    224 
    225     // Measure the clock domain offset between camera and video/hw_composer
    226     camera_metadata_entry timestampSource =
    227             mDeviceInfo.find(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE);
    228     if (timestampSource.count > 0 && timestampSource.data.u8[0] ==
    229             ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME) {
    230         mTimestampOffset = getMonoToBoottimeOffset();
    231     }
    232 
    233     // Will the HAL be sending in early partial result metadata?
    234     camera_metadata_entry partialResultsCount =
    235             mDeviceInfo.find(ANDROID_REQUEST_PARTIAL_RESULT_COUNT);
    236     if (partialResultsCount.count > 0) {
    237         mNumPartialResults = partialResultsCount.data.i32[0];
    238         mUsePartialResult = (mNumPartialResults > 1);
    239     }
    240 
    241     camera_metadata_entry configs =
    242             mDeviceInfo.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
    243     for (uint32_t i = 0; i < configs.count; i += 4) {
    244         if (configs.data.i32[i] == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED &&
    245                 configs.data.i32[i + 3] ==
    246                 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT) {
    247             mSupportedOpaqueInputSizes.add(Size(configs.data.i32[i + 1],
    248                     configs.data.i32[i + 2]));
    249         }
    250     }
    251 
    252     if (DistortionMapper::isDistortionSupported(mDeviceInfo)) {
    253         res = mDistortionMapper.setupStaticInfo(mDeviceInfo);
    254         if (res != OK) {
    255             SET_ERR_L("Unable to read necessary calibration fields for distortion correction");
    256             return res;
    257         }
    258     }
    259 
    260     return OK;
    261 }
    262 
    263 status_t Camera3Device::disconnect() {
    264     ATRACE_CALL();
    265     Mutex::Autolock il(mInterfaceLock);
    266 
    267     ALOGI("%s: E", __FUNCTION__);
    268 
    269     status_t res = OK;
    270     std::vector<wp<Camera3StreamInterface>> streams;
    271     nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
    272     {
    273         Mutex::Autolock l(mLock);
    274         if (mStatus == STATUS_UNINITIALIZED) return res;
    275 
    276         if (mStatus == STATUS_ACTIVE ||
    277                 (mStatus == STATUS_ERROR && mRequestThread != NULL)) {
    278             res = mRequestThread->clearRepeatingRequests();
    279             if (res != OK) {
    280                 SET_ERR_L("Can't stop streaming");
    281                 // Continue to close device even in case of error
    282             } else {
    283                 res = waitUntilStateThenRelock(/*active*/ false, maxExpectedDuration);
    284                 if (res != OK) {
    285                     SET_ERR_L("Timeout waiting for HAL to drain (% " PRIi64 " ns)",
    286                             maxExpectedDuration);
    287                     // Continue to close device even in case of error
    288                 }
    289             }
    290         }
    291 
    292         if (mStatus == STATUS_ERROR) {
    293             CLOGE("Shutting down in an error state");
    294         }
    295 
    296         if (mStatusTracker != NULL) {
    297             mStatusTracker->requestExit();
    298         }
    299 
    300         if (mRequestThread != NULL) {
    301             mRequestThread->requestExit();
    302         }
    303 
    304         streams.reserve(mOutputStreams.size() + (mInputStream != nullptr ? 1 : 0));
    305         for (size_t i = 0; i < mOutputStreams.size(); i++) {
    306             streams.push_back(mOutputStreams[i]);
    307         }
    308         if (mInputStream != nullptr) {
    309             streams.push_back(mInputStream);
    310         }
    311     }
    312 
    313     // Joining done without holding mLock, otherwise deadlocks may ensue
    314     // as the threads try to access parent state
    315     if (mRequestThread != NULL && mStatus != STATUS_ERROR) {
    316         // HAL may be in a bad state, so waiting for request thread
    317         // (which may be stuck in the HAL processCaptureRequest call)
    318         // could be dangerous.
    319         mRequestThread->join();
    320     }
    321 
    322     if (mStatusTracker != NULL) {
    323         mStatusTracker->join();
    324     }
    325 
    326     HalInterface* interface;
    327     {
    328         Mutex::Autolock l(mLock);
    329         mRequestThread.clear();
    330         mStatusTracker.clear();
    331         interface = mInterface.get();
    332     }
    333 
    334     // Call close without internal mutex held, as the HAL close may need to
    335     // wait on assorted callbacks,etc, to complete before it can return.
    336     interface->close();
    337 
    338     flushInflightRequests();
    339 
    340     {
    341         Mutex::Autolock l(mLock);
    342         mInterface->clear();
    343         mOutputStreams.clear();
    344         mInputStream.clear();
    345         mDeletedStreams.clear();
    346         mBufferManager.clear();
    347         internalUpdateStatusLocked(STATUS_UNINITIALIZED);
    348     }
    349 
    350     for (auto& weakStream : streams) {
    351         sp<Camera3StreamInterface> stream = weakStream.promote();
    352         if (stream != nullptr) {
    353             ALOGE("%s: Stream %d leaked! strong reference (%d)!",
    354                     __FUNCTION__, stream->getId(), stream->getStrongCount() - 1);
    355         }
    356     }
    357 
    358     ALOGI("%s: X", __FUNCTION__);
    359     return res;
    360 }
    361 
    362 // For dumping/debugging only -
    363 // try to acquire a lock a few times, eventually give up to proceed with
    364 // debug/dump operations
    365 bool Camera3Device::tryLockSpinRightRound(Mutex& lock) {
    366     bool gotLock = false;
    367     for (size_t i = 0; i < kDumpLockAttempts; ++i) {
    368         if (lock.tryLock() == NO_ERROR) {
    369             gotLock = true;
    370             break;
    371         } else {
    372             usleep(kDumpSleepDuration);
    373         }
    374     }
    375     return gotLock;
    376 }
    377 
    378 Camera3Device::Size Camera3Device::getMaxJpegResolution() const {
    379     int32_t maxJpegWidth = 0, maxJpegHeight = 0;
    380     const int STREAM_CONFIGURATION_SIZE = 4;
    381     const int STREAM_FORMAT_OFFSET = 0;
    382     const int STREAM_WIDTH_OFFSET = 1;
    383     const int STREAM_HEIGHT_OFFSET = 2;
    384     const int STREAM_IS_INPUT_OFFSET = 3;
    385     camera_metadata_ro_entry_t availableStreamConfigs =
    386             mDeviceInfo.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
    387     if (availableStreamConfigs.count == 0 ||
    388             availableStreamConfigs.count % STREAM_CONFIGURATION_SIZE != 0) {
    389         return Size(0, 0);
    390     }
    391 
    392     // Get max jpeg size (area-wise).
    393     for (size_t i=0; i < availableStreamConfigs.count; i+= STREAM_CONFIGURATION_SIZE) {
    394         int32_t format = availableStreamConfigs.data.i32[i + STREAM_FORMAT_OFFSET];
    395         int32_t width = availableStreamConfigs.data.i32[i + STREAM_WIDTH_OFFSET];
    396         int32_t height = availableStreamConfigs.data.i32[i + STREAM_HEIGHT_OFFSET];
    397         int32_t isInput = availableStreamConfigs.data.i32[i + STREAM_IS_INPUT_OFFSET];
    398         if (isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT
    399                 && format == HAL_PIXEL_FORMAT_BLOB &&
    400                 (width * height > maxJpegWidth * maxJpegHeight)) {
    401             maxJpegWidth = width;
    402             maxJpegHeight = height;
    403         }
    404     }
    405 
    406     return Size(maxJpegWidth, maxJpegHeight);
    407 }
    408 
    409 nsecs_t Camera3Device::getMonoToBoottimeOffset() {
    410     // try three times to get the clock offset, choose the one
    411     // with the minimum gap in measurements.
    412     const int tries = 3;
    413     nsecs_t bestGap, measured;
    414     for (int i = 0; i < tries; ++i) {
    415         const nsecs_t tmono = systemTime(SYSTEM_TIME_MONOTONIC);
    416         const nsecs_t tbase = systemTime(SYSTEM_TIME_BOOTTIME);
    417         const nsecs_t tmono2 = systemTime(SYSTEM_TIME_MONOTONIC);
    418         const nsecs_t gap = tmono2 - tmono;
    419         if (i == 0 || gap < bestGap) {
    420             bestGap = gap;
    421             measured = tbase - ((tmono + tmono2) >> 1);
    422         }
    423     }
    424     return measured;
    425 }
    426 
    427 hardware::graphics::common::V1_0::PixelFormat Camera3Device::mapToPixelFormat(
    428         int frameworkFormat) {
    429     return (hardware::graphics::common::V1_0::PixelFormat) frameworkFormat;
    430 }
    431 
    432 DataspaceFlags Camera3Device::mapToHidlDataspace(
    433         android_dataspace dataSpace) {
    434     return dataSpace;
    435 }
    436 
    437 BufferUsageFlags Camera3Device::mapToConsumerUsage(
    438         uint64_t usage) {
    439     return usage;
    440 }
    441 
    442 StreamRotation Camera3Device::mapToStreamRotation(camera3_stream_rotation_t rotation) {
    443     switch (rotation) {
    444         case CAMERA3_STREAM_ROTATION_0:
    445             return StreamRotation::ROTATION_0;
    446         case CAMERA3_STREAM_ROTATION_90:
    447             return StreamRotation::ROTATION_90;
    448         case CAMERA3_STREAM_ROTATION_180:
    449             return StreamRotation::ROTATION_180;
    450         case CAMERA3_STREAM_ROTATION_270:
    451             return StreamRotation::ROTATION_270;
    452     }
    453     ALOGE("%s: Unknown stream rotation %d", __FUNCTION__, rotation);
    454     return StreamRotation::ROTATION_0;
    455 }
    456 
    457 status_t Camera3Device::mapToStreamConfigurationMode(
    458         camera3_stream_configuration_mode_t operationMode, StreamConfigurationMode *mode) {
    459     if (mode == nullptr) return BAD_VALUE;
    460     if (operationMode < CAMERA3_VENDOR_STREAM_CONFIGURATION_MODE_START) {
    461         switch(operationMode) {
    462             case CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE:
    463                 *mode = StreamConfigurationMode::NORMAL_MODE;
    464                 break;
    465             case CAMERA3_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE:
    466                 *mode = StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE;
    467                 break;
    468             default:
    469                 ALOGE("%s: Unknown stream configuration mode %d", __FUNCTION__, operationMode);
    470                 return BAD_VALUE;
    471         }
    472     } else {
    473         *mode = static_cast<StreamConfigurationMode>(operationMode);
    474     }
    475     return OK;
    476 }
    477 
    478 camera3_buffer_status_t Camera3Device::mapHidlBufferStatus(BufferStatus status) {
    479     switch (status) {
    480         case BufferStatus::OK: return CAMERA3_BUFFER_STATUS_OK;
    481         case BufferStatus::ERROR: return CAMERA3_BUFFER_STATUS_ERROR;
    482     }
    483     return CAMERA3_BUFFER_STATUS_ERROR;
    484 }
    485 
    486 int Camera3Device::mapToFrameworkFormat(
    487         hardware::graphics::common::V1_0::PixelFormat pixelFormat) {
    488     return static_cast<uint32_t>(pixelFormat);
    489 }
    490 
    491 android_dataspace Camera3Device::mapToFrameworkDataspace(
    492         DataspaceFlags dataSpace) {
    493     return static_cast<android_dataspace>(dataSpace);
    494 }
    495 
    496 uint64_t Camera3Device::mapConsumerToFrameworkUsage(
    497         BufferUsageFlags usage) {
    498     return usage;
    499 }
    500 
    501 uint64_t Camera3Device::mapProducerToFrameworkUsage(
    502         BufferUsageFlags usage) {
    503     return usage;
    504 }
    505 
    506 ssize_t Camera3Device::getJpegBufferSize(uint32_t width, uint32_t height) const {
    507     // Get max jpeg size (area-wise).
    508     Size maxJpegResolution = getMaxJpegResolution();
    509     if (maxJpegResolution.width == 0) {
    510         ALOGE("%s: Camera %s: Can't find valid available jpeg sizes in static metadata!",
    511                 __FUNCTION__, mId.string());
    512         return BAD_VALUE;
    513     }
    514 
    515     // Get max jpeg buffer size
    516     ssize_t maxJpegBufferSize = 0;
    517     camera_metadata_ro_entry jpegBufMaxSize = mDeviceInfo.find(ANDROID_JPEG_MAX_SIZE);
    518     if (jpegBufMaxSize.count == 0) {
    519         ALOGE("%s: Camera %s: Can't find maximum JPEG size in static metadata!", __FUNCTION__,
    520                 mId.string());
    521         return BAD_VALUE;
    522     }
    523     maxJpegBufferSize = jpegBufMaxSize.data.i32[0];
    524     assert(kMinJpegBufferSize < maxJpegBufferSize);
    525 
    526     // Calculate final jpeg buffer size for the given resolution.
    527     float scaleFactor = ((float) (width * height)) /
    528             (maxJpegResolution.width * maxJpegResolution.height);
    529     ssize_t jpegBufferSize = scaleFactor * (maxJpegBufferSize - kMinJpegBufferSize) +
    530             kMinJpegBufferSize;
    531     if (jpegBufferSize > maxJpegBufferSize) {
    532         jpegBufferSize = maxJpegBufferSize;
    533     }
    534 
    535     return jpegBufferSize;
    536 }
    537 
    538 ssize_t Camera3Device::getPointCloudBufferSize() const {
    539     const int FLOATS_PER_POINT=4;
    540     camera_metadata_ro_entry maxPointCount = mDeviceInfo.find(ANDROID_DEPTH_MAX_DEPTH_SAMPLES);
    541     if (maxPointCount.count == 0) {
    542         ALOGE("%s: Camera %s: Can't find maximum depth point cloud size in static metadata!",
    543                 __FUNCTION__, mId.string());
    544         return BAD_VALUE;
    545     }
    546     ssize_t maxBytesForPointCloud = sizeof(android_depth_points) +
    547             maxPointCount.data.i32[0] * sizeof(float) * FLOATS_PER_POINT;
    548     return maxBytesForPointCloud;
    549 }
    550 
    551 ssize_t Camera3Device::getRawOpaqueBufferSize(int32_t width, int32_t height) const {
    552     const int PER_CONFIGURATION_SIZE = 3;
    553     const int WIDTH_OFFSET = 0;
    554     const int HEIGHT_OFFSET = 1;
    555     const int SIZE_OFFSET = 2;
    556     camera_metadata_ro_entry rawOpaqueSizes =
    557         mDeviceInfo.find(ANDROID_SENSOR_OPAQUE_RAW_SIZE);
    558     size_t count = rawOpaqueSizes.count;
    559     if (count == 0 || (count % PER_CONFIGURATION_SIZE)) {
    560         ALOGE("%s: Camera %s: bad opaque RAW size static metadata length(%zu)!",
    561                 __FUNCTION__, mId.string(), count);
    562         return BAD_VALUE;
    563     }
    564 
    565     for (size_t i = 0; i < count; i += PER_CONFIGURATION_SIZE) {
    566         if (width == rawOpaqueSizes.data.i32[i + WIDTH_OFFSET] &&
    567                 height == rawOpaqueSizes.data.i32[i + HEIGHT_OFFSET]) {
    568             return rawOpaqueSizes.data.i32[i + SIZE_OFFSET];
    569         }
    570     }
    571 
    572     ALOGE("%s: Camera %s: cannot find size for %dx%d opaque RAW image!",
    573             __FUNCTION__, mId.string(), width, height);
    574     return BAD_VALUE;
    575 }
    576 
    577 status_t Camera3Device::dump(int fd, const Vector<String16> &args) {
    578     ATRACE_CALL();
    579     (void)args;
    580 
    581     // Try to lock, but continue in case of failure (to avoid blocking in
    582     // deadlocks)
    583     bool gotInterfaceLock = tryLockSpinRightRound(mInterfaceLock);
    584     bool gotLock = tryLockSpinRightRound(mLock);
    585 
    586     ALOGW_IF(!gotInterfaceLock,
    587             "Camera %s: %s: Unable to lock interface lock, proceeding anyway",
    588             mId.string(), __FUNCTION__);
    589     ALOGW_IF(!gotLock,
    590             "Camera %s: %s: Unable to lock main lock, proceeding anyway",
    591             mId.string(), __FUNCTION__);
    592 
    593     bool dumpTemplates = false;
    594 
    595     String16 templatesOption("-t");
    596     int n = args.size();
    597     for (int i = 0; i < n; i++) {
    598         if (args[i] == templatesOption) {
    599             dumpTemplates = true;
    600         }
    601         if (args[i] == TagMonitor::kMonitorOption) {
    602             if (i + 1 < n) {
    603                 String8 monitorTags = String8(args[i + 1]);
    604                 if (monitorTags == "off") {
    605                     mTagMonitor.disableMonitoring();
    606                 } else {
    607                     mTagMonitor.parseTagsToMonitor(monitorTags);
    608                 }
    609             } else {
    610                 mTagMonitor.disableMonitoring();
    611             }
    612         }
    613     }
    614 
    615     String8 lines;
    616 
    617     const char *status =
    618             mStatus == STATUS_ERROR         ? "ERROR" :
    619             mStatus == STATUS_UNINITIALIZED ? "UNINITIALIZED" :
    620             mStatus == STATUS_UNCONFIGURED  ? "UNCONFIGURED" :
    621             mStatus == STATUS_CONFIGURED    ? "CONFIGURED" :
    622             mStatus == STATUS_ACTIVE        ? "ACTIVE" :
    623             "Unknown";
    624 
    625     lines.appendFormat("    Device status: %s\n", status);
    626     if (mStatus == STATUS_ERROR) {
    627         lines.appendFormat("    Error cause: %s\n", mErrorCause.string());
    628     }
    629     lines.appendFormat("    Stream configuration:\n");
    630     const char *mode =
    631             mOperatingMode == static_cast<int>(StreamConfigurationMode::NORMAL_MODE) ? "NORMAL" :
    632             mOperatingMode == static_cast<int>(
    633                 StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE) ? "CONSTRAINED_HIGH_SPEED" :
    634             "CUSTOM";
    635     lines.appendFormat("    Operation mode: %s (%d) \n", mode, mOperatingMode);
    636 
    637     if (mInputStream != NULL) {
    638         write(fd, lines.string(), lines.size());
    639         mInputStream->dump(fd, args);
    640     } else {
    641         lines.appendFormat("      No input stream.\n");
    642         write(fd, lines.string(), lines.size());
    643     }
    644     for (size_t i = 0; i < mOutputStreams.size(); i++) {
    645         mOutputStreams[i]->dump(fd,args);
    646     }
    647 
    648     if (mBufferManager != NULL) {
    649         lines = String8("    Camera3 Buffer Manager:\n");
    650         write(fd, lines.string(), lines.size());
    651         mBufferManager->dump(fd, args);
    652     }
    653 
    654     lines = String8("    In-flight requests:\n");
    655     if (mInFlightMap.size() == 0) {
    656         lines.append("      None\n");
    657     } else {
    658         for (size_t i = 0; i < mInFlightMap.size(); i++) {
    659             InFlightRequest r = mInFlightMap.valueAt(i);
    660             lines.appendFormat("      Frame %d |  Timestamp: %" PRId64 ", metadata"
    661                     " arrived: %s, buffers left: %d\n", mInFlightMap.keyAt(i),
    662                     r.shutterTimestamp, r.haveResultMetadata ? "true" : "false",
    663                     r.numBuffersLeft);
    664         }
    665     }
    666     write(fd, lines.string(), lines.size());
    667 
    668     if (mRequestThread != NULL) {
    669         mRequestThread->dumpCaptureRequestLatency(fd,
    670                 "    ProcessCaptureRequest latency histogram:");
    671     }
    672 
    673     {
    674         lines = String8("    Last request sent:\n");
    675         write(fd, lines.string(), lines.size());
    676 
    677         CameraMetadata lastRequest = getLatestRequestLocked();
    678         lastRequest.dump(fd, /*verbosity*/2, /*indentation*/6);
    679     }
    680 
    681     if (dumpTemplates) {
    682         const char *templateNames[CAMERA3_TEMPLATE_COUNT] = {
    683             "TEMPLATE_PREVIEW",
    684             "TEMPLATE_STILL_CAPTURE",
    685             "TEMPLATE_VIDEO_RECORD",
    686             "TEMPLATE_VIDEO_SNAPSHOT",
    687             "TEMPLATE_ZERO_SHUTTER_LAG",
    688             "TEMPLATE_MANUAL",
    689         };
    690 
    691         for (int i = 1; i < CAMERA3_TEMPLATE_COUNT; i++) {
    692             camera_metadata_t *templateRequest = nullptr;
    693             mInterface->constructDefaultRequestSettings(
    694                     (camera3_request_template_t) i, &templateRequest);
    695             lines = String8::format("    HAL Request %s:\n", templateNames[i-1]);
    696             if (templateRequest == nullptr) {
    697                 lines.append("       Not supported\n");
    698                 write(fd, lines.string(), lines.size());
    699             } else {
    700                 write(fd, lines.string(), lines.size());
    701                 dump_indented_camera_metadata(templateRequest,
    702                         fd, /*verbosity*/2, /*indentation*/8);
    703             }
    704             free_camera_metadata(templateRequest);
    705         }
    706     }
    707 
    708     mTagMonitor.dumpMonitoredMetadata(fd);
    709 
    710     if (mInterface->valid()) {
    711         lines = String8("     HAL device dump:\n");
    712         write(fd, lines.string(), lines.size());
    713         mInterface->dump(fd);
    714     }
    715 
    716     if (gotLock) mLock.unlock();
    717     if (gotInterfaceLock) mInterfaceLock.unlock();
    718 
    719     return OK;
    720 }
    721 
    722 const CameraMetadata& Camera3Device::info() const {
    723     ALOGVV("%s: E", __FUNCTION__);
    724     if (CC_UNLIKELY(mStatus == STATUS_UNINITIALIZED ||
    725                     mStatus == STATUS_ERROR)) {
    726         ALOGW("%s: Access to static info %s!", __FUNCTION__,
    727                 mStatus == STATUS_ERROR ?
    728                 "when in error state" : "before init");
    729     }
    730     return mDeviceInfo;
    731 }
    732 
    733 status_t Camera3Device::checkStatusOkToCaptureLocked() {
    734     switch (mStatus) {
    735         case STATUS_ERROR:
    736             CLOGE("Device has encountered a serious error");
    737             return INVALID_OPERATION;
    738         case STATUS_UNINITIALIZED:
    739             CLOGE("Device not initialized");
    740             return INVALID_OPERATION;
    741         case STATUS_UNCONFIGURED:
    742         case STATUS_CONFIGURED:
    743         case STATUS_ACTIVE:
    744             // OK
    745             break;
    746         default:
    747             SET_ERR_L("Unexpected status: %d", mStatus);
    748             return INVALID_OPERATION;
    749     }
    750     return OK;
    751 }
    752 
    753 status_t Camera3Device::convertMetadataListToRequestListLocked(
    754         const List<const PhysicalCameraSettingsList> &metadataList,
    755         const std::list<const SurfaceMap> &surfaceMaps,
    756         bool repeating,
    757         RequestList *requestList) {
    758     if (requestList == NULL) {
    759         CLOGE("requestList cannot be NULL.");
    760         return BAD_VALUE;
    761     }
    762 
    763     int32_t burstId = 0;
    764     List<const PhysicalCameraSettingsList>::const_iterator metadataIt = metadataList.begin();
    765     std::list<const SurfaceMap>::const_iterator surfaceMapIt = surfaceMaps.begin();
    766     for (; metadataIt != metadataList.end() && surfaceMapIt != surfaceMaps.end();
    767             ++metadataIt, ++surfaceMapIt) {
    768         sp<CaptureRequest> newRequest = setUpRequestLocked(*metadataIt, *surfaceMapIt);
    769         if (newRequest == 0) {
    770             CLOGE("Can't create capture request");
    771             return BAD_VALUE;
    772         }
    773 
    774         newRequest->mRepeating = repeating;
    775 
    776         // Setup burst Id and request Id
    777         newRequest->mResultExtras.burstId = burstId++;
    778         if (metadataIt->begin()->metadata.exists(ANDROID_REQUEST_ID)) {
    779             if (metadataIt->begin()->metadata.find(ANDROID_REQUEST_ID).count == 0) {
    780                 CLOGE("RequestID entry exists; but must not be empty in metadata");
    781                 return BAD_VALUE;
    782             }
    783             newRequest->mResultExtras.requestId = metadataIt->begin()->metadata.find(
    784                     ANDROID_REQUEST_ID).data.i32[0];
    785         } else {
    786             CLOGE("RequestID does not exist in metadata");
    787             return BAD_VALUE;
    788         }
    789 
    790         requestList->push_back(newRequest);
    791 
    792         ALOGV("%s: requestId = %" PRId32, __FUNCTION__, newRequest->mResultExtras.requestId);
    793     }
    794     if (metadataIt != metadataList.end() || surfaceMapIt != surfaceMaps.end()) {
    795         ALOGE("%s: metadataList and surfaceMaps are not the same size!", __FUNCTION__);
    796         return BAD_VALUE;
    797     }
    798 
    799     // Setup batch size if this is a high speed video recording request.
    800     if (mIsConstrainedHighSpeedConfiguration && requestList->size() > 0) {
    801         auto firstRequest = requestList->begin();
    802         for (auto& outputStream : (*firstRequest)->mOutputStreams) {
    803             if (outputStream->isVideoStream()) {
    804                 (*firstRequest)->mBatchSize = requestList->size();
    805                 break;
    806             }
    807         }
    808     }
    809 
    810     return OK;
    811 }
    812 
    813 status_t Camera3Device::capture(CameraMetadata &request, int64_t* /*lastFrameNumber*/) {
    814     ATRACE_CALL();
    815 
    816     List<const PhysicalCameraSettingsList> requestsList;
    817     std::list<const SurfaceMap> surfaceMaps;
    818     convertToRequestList(requestsList, surfaceMaps, request);
    819 
    820     return captureList(requestsList, surfaceMaps, /*lastFrameNumber*/NULL);
    821 }
    822 
    823 void Camera3Device::convertToRequestList(List<const PhysicalCameraSettingsList>& requestsList,
    824         std::list<const SurfaceMap>& surfaceMaps,
    825         const CameraMetadata& request) {
    826     PhysicalCameraSettingsList requestList;
    827     requestList.push_back({std::string(getId().string()), request});
    828     requestsList.push_back(requestList);
    829 
    830     SurfaceMap surfaceMap;
    831     camera_metadata_ro_entry streams = request.find(ANDROID_REQUEST_OUTPUT_STREAMS);
    832     // With no surface list passed in, stream and surface will have 1-to-1
    833     // mapping. So the surface index is 0 for each stream in the surfaceMap.
    834     for (size_t i = 0; i < streams.count; i++) {
    835         surfaceMap[streams.data.i32[i]].push_back(0);
    836     }
    837     surfaceMaps.push_back(surfaceMap);
    838 }
    839 
    840 status_t Camera3Device::submitRequestsHelper(
    841         const List<const PhysicalCameraSettingsList> &requests,
    842         const std::list<const SurfaceMap> &surfaceMaps,
    843         bool repeating,
    844         /*out*/
    845         int64_t *lastFrameNumber) {
    846     ATRACE_CALL();
    847     Mutex::Autolock il(mInterfaceLock);
    848     Mutex::Autolock l(mLock);
    849 
    850     status_t res = checkStatusOkToCaptureLocked();
    851     if (res != OK) {
    852         // error logged by previous call
    853         return res;
    854     }
    855 
    856     RequestList requestList;
    857 
    858     res = convertMetadataListToRequestListLocked(requests, surfaceMaps,
    859             repeating, /*out*/&requestList);
    860     if (res != OK) {
    861         // error logged by previous call
    862         return res;
    863     }
    864 
    865     if (repeating) {
    866         res = mRequestThread->setRepeatingRequests(requestList, lastFrameNumber);
    867     } else {
    868         res = mRequestThread->queueRequestList(requestList, lastFrameNumber);
    869     }
    870 
    871     if (res == OK) {
    872         waitUntilStateThenRelock(/*active*/true, kActiveTimeout);
    873         if (res != OK) {
    874             SET_ERR_L("Can't transition to active in %f seconds!",
    875                     kActiveTimeout/1e9);
    876         }
    877         ALOGV("Camera %s: Capture request %" PRId32 " enqueued", mId.string(),
    878               (*(requestList.begin()))->mResultExtras.requestId);
    879     } else {
    880         CLOGE("Cannot queue request. Impossible.");
    881         return BAD_VALUE;
    882     }
    883 
    884     return res;
    885 }
    886 
    887 hardware::Return<void> Camera3Device::processCaptureResult_3_4(
    888         const hardware::hidl_vec<
    889                 hardware::camera::device::V3_4::CaptureResult>& results) {
    890     // Ideally we should grab mLock, but that can lead to deadlock, and
    891     // it's not super important to get up to date value of mStatus for this
    892     // warning print, hence skipping the lock here
    893     if (mStatus == STATUS_ERROR) {
    894         // Per API contract, HAL should act as closed after device error
    895         // But mStatus can be set to error by framework as well, so just log
    896         // a warning here.
    897         ALOGW("%s: received capture result in error state.", __FUNCTION__);
    898     }
    899 
    900     if (mProcessCaptureResultLock.tryLock() != OK) {
    901         // This should never happen; it indicates a wrong client implementation
    902         // that doesn't follow the contract. But, we can be tolerant here.
    903         ALOGE("%s: callback overlapped! waiting 1s...",
    904                 __FUNCTION__);
    905         if (mProcessCaptureResultLock.timedLock(1000000000 /* 1s */) != OK) {
    906             ALOGE("%s: cannot acquire lock in 1s, dropping results",
    907                     __FUNCTION__);
    908             // really don't know what to do, so bail out.
    909             return hardware::Void();
    910         }
    911     }
    912     for (const auto& result : results) {
    913         processOneCaptureResultLocked(result.v3_2, result.physicalCameraMetadata);
    914     }
    915     mProcessCaptureResultLock.unlock();
    916     return hardware::Void();
    917 }
    918 
    919 // Only one processCaptureResult should be called at a time, so
    920 // the locks won't block. The locks are present here simply to enforce this.
    921 hardware::Return<void> Camera3Device::processCaptureResult(
    922         const hardware::hidl_vec<
    923                 hardware::camera::device::V3_2::CaptureResult>& results) {
    924     hardware::hidl_vec<hardware::camera::device::V3_4::PhysicalCameraMetadata> noPhysMetadata;
    925 
    926     // Ideally we should grab mLock, but that can lead to deadlock, and
    927     // it's not super important to get up to date value of mStatus for this
    928     // warning print, hence skipping the lock here
    929     if (mStatus == STATUS_ERROR) {
    930         // Per API contract, HAL should act as closed after device error
    931         // But mStatus can be set to error by framework as well, so just log
    932         // a warning here.
    933         ALOGW("%s: received capture result in error state.", __FUNCTION__);
    934     }
    935 
    936     if (mProcessCaptureResultLock.tryLock() != OK) {
    937         // This should never happen; it indicates a wrong client implementation
    938         // that doesn't follow the contract. But, we can be tolerant here.
    939         ALOGE("%s: callback overlapped! waiting 1s...",
    940                 __FUNCTION__);
    941         if (mProcessCaptureResultLock.timedLock(1000000000 /* 1s */) != OK) {
    942             ALOGE("%s: cannot acquire lock in 1s, dropping results",
    943                     __FUNCTION__);
    944             // really don't know what to do, so bail out.
    945             return hardware::Void();
    946         }
    947     }
    948     for (const auto& result : results) {
    949         processOneCaptureResultLocked(result, noPhysMetadata);
    950     }
    951     mProcessCaptureResultLock.unlock();
    952     return hardware::Void();
    953 }
    954 
    955 status_t Camera3Device::readOneCameraMetadataLocked(
    956         uint64_t fmqResultSize, hardware::camera::device::V3_2::CameraMetadata& resultMetadata,
    957         const hardware::camera::device::V3_2::CameraMetadata& result) {
    958     if (fmqResultSize > 0) {
    959         resultMetadata.resize(fmqResultSize);
    960         if (mResultMetadataQueue == nullptr) {
    961             return NO_MEMORY; // logged in initialize()
    962         }
    963         if (!mResultMetadataQueue->read(resultMetadata.data(), fmqResultSize)) {
    964             ALOGE("%s: Cannot read camera metadata from fmq, size = %" PRIu64,
    965                     __FUNCTION__, fmqResultSize);
    966             return INVALID_OPERATION;
    967         }
    968     } else {
    969         resultMetadata.setToExternal(const_cast<uint8_t *>(result.data()),
    970                 result.size());
    971     }
    972 
    973     if (resultMetadata.size() != 0) {
    974         status_t res;
    975         const camera_metadata_t* metadata =
    976                 reinterpret_cast<const camera_metadata_t*>(resultMetadata.data());
    977         size_t expected_metadata_size = resultMetadata.size();
    978         if ((res = validate_camera_metadata_structure(metadata, &expected_metadata_size)) != OK) {
    979             ALOGE("%s: Invalid camera metadata received by camera service from HAL: %s (%d)",
    980                     __FUNCTION__, strerror(-res), res);
    981             return INVALID_OPERATION;
    982         }
    983     }
    984 
    985     return OK;
    986 }
    987 
    988 void Camera3Device::processOneCaptureResultLocked(
    989         const hardware::camera::device::V3_2::CaptureResult& result,
    990         const hardware::hidl_vec<
    991                 hardware::camera::device::V3_4::PhysicalCameraMetadata> physicalCameraMetadatas) {
    992     camera3_capture_result r;
    993     status_t res;
    994     r.frame_number = result.frameNumber;
    995 
    996     // Read and validate the result metadata.
    997     hardware::camera::device::V3_2::CameraMetadata resultMetadata;
    998     res = readOneCameraMetadataLocked(result.fmqResultSize, resultMetadata, result.result);
    999     if (res != OK) {
   1000         ALOGE("%s: Frame %d: Failed to read capture result metadata",
   1001                 __FUNCTION__, result.frameNumber);
   1002         return;
   1003     }
   1004     r.result = reinterpret_cast<const camera_metadata_t*>(resultMetadata.data());
   1005 
   1006     // Read and validate physical camera metadata
   1007     size_t physResultCount = physicalCameraMetadatas.size();
   1008     std::vector<const char*> physCamIds(physResultCount);
   1009     std::vector<const camera_metadata_t *> phyCamMetadatas(physResultCount);
   1010     std::vector<hardware::camera::device::V3_2::CameraMetadata> physResultMetadata;
   1011     physResultMetadata.resize(physResultCount);
   1012     for (size_t i = 0; i < physicalCameraMetadatas.size(); i++) {
   1013         res = readOneCameraMetadataLocked(physicalCameraMetadatas[i].fmqMetadataSize,
   1014                 physResultMetadata[i], physicalCameraMetadatas[i].metadata);
   1015         if (res != OK) {
   1016             ALOGE("%s: Frame %d: Failed to read capture result metadata for camera %s",
   1017                     __FUNCTION__, result.frameNumber,
   1018                     physicalCameraMetadatas[i].physicalCameraId.c_str());
   1019             return;
   1020         }
   1021         physCamIds[i] = physicalCameraMetadatas[i].physicalCameraId.c_str();
   1022         phyCamMetadatas[i] = reinterpret_cast<const camera_metadata_t*>(
   1023                 physResultMetadata[i].data());
   1024     }
   1025     r.num_physcam_metadata = physResultCount;
   1026     r.physcam_ids = physCamIds.data();
   1027     r.physcam_metadata = phyCamMetadatas.data();
   1028 
   1029     std::vector<camera3_stream_buffer_t> outputBuffers(result.outputBuffers.size());
   1030     std::vector<buffer_handle_t> outputBufferHandles(result.outputBuffers.size());
   1031     for (size_t i = 0; i < result.outputBuffers.size(); i++) {
   1032         auto& bDst = outputBuffers[i];
   1033         const StreamBuffer &bSrc = result.outputBuffers[i];
   1034 
   1035         ssize_t idx = mOutputStreams.indexOfKey(bSrc.streamId);
   1036         if (idx == NAME_NOT_FOUND) {
   1037             ALOGE("%s: Frame %d: Buffer %zu: Invalid output stream id %d",
   1038                     __FUNCTION__, result.frameNumber, i, bSrc.streamId);
   1039             return;
   1040         }
   1041         bDst.stream = mOutputStreams.valueAt(idx)->asHalStream();
   1042 
   1043         buffer_handle_t *buffer;
   1044         res = mInterface->popInflightBuffer(result.frameNumber, bSrc.streamId, &buffer);
   1045         if (res != OK) {
   1046             ALOGE("%s: Frame %d: Buffer %zu: No in-flight buffer for stream %d",
   1047                     __FUNCTION__, result.frameNumber, i, bSrc.streamId);
   1048             return;
   1049         }
   1050         bDst.buffer = buffer;
   1051         bDst.status = mapHidlBufferStatus(bSrc.status);
   1052         bDst.acquire_fence = -1;
   1053         if (bSrc.releaseFence == nullptr) {
   1054             bDst.release_fence = -1;
   1055         } else if (bSrc.releaseFence->numFds == 1) {
   1056             bDst.release_fence = dup(bSrc.releaseFence->data[0]);
   1057         } else {
   1058             ALOGE("%s: Frame %d: Invalid release fence for buffer %zu, fd count is %d, not 1",
   1059                     __FUNCTION__, result.frameNumber, i, bSrc.releaseFence->numFds);
   1060             return;
   1061         }
   1062     }
   1063     r.num_output_buffers = outputBuffers.size();
   1064     r.output_buffers = outputBuffers.data();
   1065 
   1066     camera3_stream_buffer_t inputBuffer;
   1067     if (result.inputBuffer.streamId == -1) {
   1068         r.input_buffer = nullptr;
   1069     } else {
   1070         if (mInputStream->getId() != result.inputBuffer.streamId) {
   1071             ALOGE("%s: Frame %d: Invalid input stream id %d", __FUNCTION__,
   1072                     result.frameNumber, result.inputBuffer.streamId);
   1073             return;
   1074         }
   1075         inputBuffer.stream = mInputStream->asHalStream();
   1076         buffer_handle_t *buffer;
   1077         res = mInterface->popInflightBuffer(result.frameNumber, result.inputBuffer.streamId,
   1078                 &buffer);
   1079         if (res != OK) {
   1080             ALOGE("%s: Frame %d: Input buffer: No in-flight buffer for stream %d",
   1081                     __FUNCTION__, result.frameNumber, result.inputBuffer.streamId);
   1082             return;
   1083         }
   1084         inputBuffer.buffer = buffer;
   1085         inputBuffer.status = mapHidlBufferStatus(result.inputBuffer.status);
   1086         inputBuffer.acquire_fence = -1;
   1087         if (result.inputBuffer.releaseFence == nullptr) {
   1088             inputBuffer.release_fence = -1;
   1089         } else if (result.inputBuffer.releaseFence->numFds == 1) {
   1090             inputBuffer.release_fence = dup(result.inputBuffer.releaseFence->data[0]);
   1091         } else {
   1092             ALOGE("%s: Frame %d: Invalid release fence for input buffer, fd count is %d, not 1",
   1093                     __FUNCTION__, result.frameNumber, result.inputBuffer.releaseFence->numFds);
   1094             return;
   1095         }
   1096         r.input_buffer = &inputBuffer;
   1097     }
   1098 
   1099     r.partial_result = result.partialResult;
   1100 
   1101     processCaptureResult(&r);
   1102 }
   1103 
   1104 hardware::Return<void> Camera3Device::notify(
   1105         const hardware::hidl_vec<hardware::camera::device::V3_2::NotifyMsg>& msgs) {
   1106     // Ideally we should grab mLock, but that can lead to deadlock, and
   1107     // it's not super important to get up to date value of mStatus for this
   1108     // warning print, hence skipping the lock here
   1109     if (mStatus == STATUS_ERROR) {
   1110         // Per API contract, HAL should act as closed after device error
   1111         // But mStatus can be set to error by framework as well, so just log
   1112         // a warning here.
   1113         ALOGW("%s: received notify message in error state.", __FUNCTION__);
   1114     }
   1115 
   1116     for (const auto& msg : msgs) {
   1117         notify(msg);
   1118     }
   1119     return hardware::Void();
   1120 }
   1121 
   1122 void Camera3Device::notify(
   1123         const hardware::camera::device::V3_2::NotifyMsg& msg) {
   1124 
   1125     camera3_notify_msg m;
   1126     switch (msg.type) {
   1127         case MsgType::ERROR:
   1128             m.type = CAMERA3_MSG_ERROR;
   1129             m.message.error.frame_number = msg.msg.error.frameNumber;
   1130             if (msg.msg.error.errorStreamId >= 0) {
   1131                 ssize_t idx = mOutputStreams.indexOfKey(msg.msg.error.errorStreamId);
   1132                 if (idx == NAME_NOT_FOUND) {
   1133                     ALOGE("%s: Frame %d: Invalid error stream id %d",
   1134                             __FUNCTION__, m.message.error.frame_number, msg.msg.error.errorStreamId);
   1135                     return;
   1136                 }
   1137                 m.message.error.error_stream = mOutputStreams.valueAt(idx)->asHalStream();
   1138             } else {
   1139                 m.message.error.error_stream = nullptr;
   1140             }
   1141             switch (msg.msg.error.errorCode) {
   1142                 case ErrorCode::ERROR_DEVICE:
   1143                     m.message.error.error_code = CAMERA3_MSG_ERROR_DEVICE;
   1144                     break;
   1145                 case ErrorCode::ERROR_REQUEST:
   1146                     m.message.error.error_code = CAMERA3_MSG_ERROR_REQUEST;
   1147                     break;
   1148                 case ErrorCode::ERROR_RESULT:
   1149                     m.message.error.error_code = CAMERA3_MSG_ERROR_RESULT;
   1150                     break;
   1151                 case ErrorCode::ERROR_BUFFER:
   1152                     m.message.error.error_code = CAMERA3_MSG_ERROR_BUFFER;
   1153                     break;
   1154             }
   1155             break;
   1156         case MsgType::SHUTTER:
   1157             m.type = CAMERA3_MSG_SHUTTER;
   1158             m.message.shutter.frame_number = msg.msg.shutter.frameNumber;
   1159             m.message.shutter.timestamp = msg.msg.shutter.timestamp;
   1160             break;
   1161     }
   1162     notify(&m);
   1163 }
   1164 
   1165 status_t Camera3Device::captureList(const List<const PhysicalCameraSettingsList> &requestsList,
   1166                                     const std::list<const SurfaceMap> &surfaceMaps,
   1167                                     int64_t *lastFrameNumber) {
   1168     ATRACE_CALL();
   1169 
   1170     return submitRequestsHelper(requestsList, surfaceMaps, /*repeating*/false, lastFrameNumber);
   1171 }
   1172 
   1173 status_t Camera3Device::setStreamingRequest(const CameraMetadata &request,
   1174                                             int64_t* /*lastFrameNumber*/) {
   1175     ATRACE_CALL();
   1176 
   1177     List<const PhysicalCameraSettingsList> requestsList;
   1178     std::list<const SurfaceMap> surfaceMaps;
   1179     convertToRequestList(requestsList, surfaceMaps, request);
   1180 
   1181     return setStreamingRequestList(requestsList, /*surfaceMap*/surfaceMaps,
   1182                                    /*lastFrameNumber*/NULL);
   1183 }
   1184 
   1185 status_t Camera3Device::setStreamingRequestList(
   1186         const List<const PhysicalCameraSettingsList> &requestsList,
   1187         const std::list<const SurfaceMap> &surfaceMaps, int64_t *lastFrameNumber) {
   1188     ATRACE_CALL();
   1189 
   1190     return submitRequestsHelper(requestsList, surfaceMaps, /*repeating*/true, lastFrameNumber);
   1191 }
   1192 
   1193 sp<Camera3Device::CaptureRequest> Camera3Device::setUpRequestLocked(
   1194         const PhysicalCameraSettingsList &request, const SurfaceMap &surfaceMap) {
   1195     status_t res;
   1196 
   1197     if (mStatus == STATUS_UNCONFIGURED || mNeedConfig) {
   1198         // This point should only be reached via API1 (API2 must explicitly call configureStreams)
   1199         // so unilaterally select normal operating mode.
   1200         res = filterParamsAndConfigureLocked(request.begin()->metadata,
   1201                 CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE);
   1202         // Stream configuration failed. Client might try other configuraitons.
   1203         if (res != OK) {
   1204             CLOGE("Can't set up streams: %s (%d)", strerror(-res), res);
   1205             return NULL;
   1206         } else if (mStatus == STATUS_UNCONFIGURED) {
   1207             // Stream configuration successfully configure to empty stream configuration.
   1208             CLOGE("No streams configured");
   1209             return NULL;
   1210         }
   1211     }
   1212 
   1213     sp<CaptureRequest> newRequest = createCaptureRequest(request, surfaceMap);
   1214     return newRequest;
   1215 }
   1216 
   1217 status_t Camera3Device::clearStreamingRequest(int64_t *lastFrameNumber) {
   1218     ATRACE_CALL();
   1219     Mutex::Autolock il(mInterfaceLock);
   1220     Mutex::Autolock l(mLock);
   1221 
   1222     switch (mStatus) {
   1223         case STATUS_ERROR:
   1224             CLOGE("Device has encountered a serious error");
   1225             return INVALID_OPERATION;
   1226         case STATUS_UNINITIALIZED:
   1227             CLOGE("Device not initialized");
   1228             return INVALID_OPERATION;
   1229         case STATUS_UNCONFIGURED:
   1230         case STATUS_CONFIGURED:
   1231         case STATUS_ACTIVE:
   1232             // OK
   1233             break;
   1234         default:
   1235             SET_ERR_L("Unexpected status: %d", mStatus);
   1236             return INVALID_OPERATION;
   1237     }
   1238     ALOGV("Camera %s: Clearing repeating request", mId.string());
   1239 
   1240     return mRequestThread->clearRepeatingRequests(lastFrameNumber);
   1241 }
   1242 
   1243 status_t Camera3Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) {
   1244     ATRACE_CALL();
   1245     Mutex::Autolock il(mInterfaceLock);
   1246 
   1247     return mRequestThread->waitUntilRequestProcessed(requestId, timeout);
   1248 }
   1249 
   1250 status_t Camera3Device::createInputStream(
   1251         uint32_t width, uint32_t height, int format, int *id) {
   1252     ATRACE_CALL();
   1253     Mutex::Autolock il(mInterfaceLock);
   1254     nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
   1255     Mutex::Autolock l(mLock);
   1256     ALOGV("Camera %s: Creating new input stream %d: %d x %d, format %d",
   1257             mId.string(), mNextStreamId, width, height, format);
   1258 
   1259     status_t res;
   1260     bool wasActive = false;
   1261 
   1262     switch (mStatus) {
   1263         case STATUS_ERROR:
   1264             ALOGE("%s: Device has encountered a serious error", __FUNCTION__);
   1265             return INVALID_OPERATION;
   1266         case STATUS_UNINITIALIZED:
   1267             ALOGE("%s: Device not initialized", __FUNCTION__);
   1268             return INVALID_OPERATION;
   1269         case STATUS_UNCONFIGURED:
   1270         case STATUS_CONFIGURED:
   1271             // OK
   1272             break;
   1273         case STATUS_ACTIVE:
   1274             ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
   1275             res = internalPauseAndWaitLocked(maxExpectedDuration);
   1276             if (res != OK) {
   1277                 SET_ERR_L("Can't pause captures to reconfigure streams!");
   1278                 return res;
   1279             }
   1280             wasActive = true;
   1281             break;
   1282         default:
   1283             SET_ERR_L("%s: Unexpected status: %d", mStatus);
   1284             return INVALID_OPERATION;
   1285     }
   1286     assert(mStatus != STATUS_ACTIVE);
   1287 
   1288     if (mInputStream != 0) {
   1289         ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__);
   1290         return INVALID_OPERATION;
   1291     }
   1292 
   1293     sp<Camera3InputStream> newStream = new Camera3InputStream(mNextStreamId,
   1294                 width, height, format);
   1295     newStream->setStatusTracker(mStatusTracker);
   1296 
   1297     mInputStream = newStream;
   1298 
   1299     *id = mNextStreamId++;
   1300 
   1301     // Continue captures if active at start
   1302     if (wasActive) {
   1303         ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
   1304         // Reuse current operating mode and session parameters for new stream config
   1305         res = configureStreamsLocked(mOperatingMode, mSessionParams);
   1306         if (res != OK) {
   1307             ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)",
   1308                     __FUNCTION__, mNextStreamId, strerror(-res), res);
   1309             return res;
   1310         }
   1311         internalResumeLocked();
   1312     }
   1313 
   1314     ALOGV("Camera %s: Created input stream", mId.string());
   1315     return OK;
   1316 }
   1317 
   1318 status_t Camera3Device::createStream(sp<Surface> consumer,
   1319             uint32_t width, uint32_t height, int format,
   1320             android_dataspace dataSpace, camera3_stream_rotation_t rotation, int *id,
   1321             const String8& physicalCameraId,
   1322             std::vector<int> *surfaceIds, int streamSetId, bool isShared, uint64_t consumerUsage) {
   1323     ATRACE_CALL();
   1324 
   1325     if (consumer == nullptr) {
   1326         ALOGE("%s: consumer must not be null", __FUNCTION__);
   1327         return BAD_VALUE;
   1328     }
   1329 
   1330     std::vector<sp<Surface>> consumers;
   1331     consumers.push_back(consumer);
   1332 
   1333     return createStream(consumers, /*hasDeferredConsumer*/ false, width, height,
   1334             format, dataSpace, rotation, id, physicalCameraId, surfaceIds, streamSetId,
   1335             isShared, consumerUsage);
   1336 }
   1337 
   1338 status_t Camera3Device::createStream(const std::vector<sp<Surface>>& consumers,
   1339         bool hasDeferredConsumer, uint32_t width, uint32_t height, int format,
   1340         android_dataspace dataSpace, camera3_stream_rotation_t rotation, int *id,
   1341         const String8& physicalCameraId,
   1342         std::vector<int> *surfaceIds, int streamSetId, bool isShared, uint64_t consumerUsage) {
   1343     ATRACE_CALL();
   1344 
   1345     Mutex::Autolock il(mInterfaceLock);
   1346     nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
   1347     Mutex::Autolock l(mLock);
   1348     ALOGV("Camera %s: Creating new stream %d: %d x %d, format %d, dataspace %d rotation %d"
   1349             " consumer usage %" PRIu64 ", isShared %d, physicalCameraId %s", mId.string(),
   1350             mNextStreamId, width, height, format, dataSpace, rotation, consumerUsage, isShared,
   1351             physicalCameraId.string());
   1352 
   1353     status_t res;
   1354     bool wasActive = false;
   1355 
   1356     switch (mStatus) {
   1357         case STATUS_ERROR:
   1358             CLOGE("Device has encountered a serious error");
   1359             return INVALID_OPERATION;
   1360         case STATUS_UNINITIALIZED:
   1361             CLOGE("Device not initialized");
   1362             return INVALID_OPERATION;
   1363         case STATUS_UNCONFIGURED:
   1364         case STATUS_CONFIGURED:
   1365             // OK
   1366             break;
   1367         case STATUS_ACTIVE:
   1368             ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
   1369             res = internalPauseAndWaitLocked(maxExpectedDuration);
   1370             if (res != OK) {
   1371                 SET_ERR_L("Can't pause captures to reconfigure streams!");
   1372                 return res;
   1373             }
   1374             wasActive = true;
   1375             break;
   1376         default:
   1377             SET_ERR_L("Unexpected status: %d", mStatus);
   1378             return INVALID_OPERATION;
   1379     }
   1380     assert(mStatus != STATUS_ACTIVE);
   1381 
   1382     sp<Camera3OutputStream> newStream;
   1383 
   1384     if (consumers.size() == 0 && !hasDeferredConsumer) {
   1385         ALOGE("%s: Number of consumers cannot be smaller than 1", __FUNCTION__);
   1386         return BAD_VALUE;
   1387     }
   1388 
   1389     if (hasDeferredConsumer && format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
   1390         ALOGE("Deferred consumer stream creation only support IMPLEMENTATION_DEFINED format");
   1391         return BAD_VALUE;
   1392     }
   1393 
   1394     if (format == HAL_PIXEL_FORMAT_BLOB) {
   1395         ssize_t blobBufferSize;
   1396         if (dataSpace != HAL_DATASPACE_DEPTH) {
   1397             blobBufferSize = getJpegBufferSize(width, height);
   1398             if (blobBufferSize <= 0) {
   1399                 SET_ERR_L("Invalid jpeg buffer size %zd", blobBufferSize);
   1400                 return BAD_VALUE;
   1401             }
   1402         } else {
   1403             blobBufferSize = getPointCloudBufferSize();
   1404             if (blobBufferSize <= 0) {
   1405                 SET_ERR_L("Invalid point cloud buffer size %zd", blobBufferSize);
   1406                 return BAD_VALUE;
   1407             }
   1408         }
   1409         newStream = new Camera3OutputStream(mNextStreamId, consumers[0],
   1410                 width, height, blobBufferSize, format, dataSpace, rotation,
   1411                 mTimestampOffset, physicalCameraId, streamSetId);
   1412     } else if (format == HAL_PIXEL_FORMAT_RAW_OPAQUE) {
   1413         ssize_t rawOpaqueBufferSize = getRawOpaqueBufferSize(width, height);
   1414         if (rawOpaqueBufferSize <= 0) {
   1415             SET_ERR_L("Invalid RAW opaque buffer size %zd", rawOpaqueBufferSize);
   1416             return BAD_VALUE;
   1417         }
   1418         newStream = new Camera3OutputStream(mNextStreamId, consumers[0],
   1419                 width, height, rawOpaqueBufferSize, format, dataSpace, rotation,
   1420                 mTimestampOffset, physicalCameraId, streamSetId);
   1421     } else if (isShared) {
   1422         newStream = new Camera3SharedOutputStream(mNextStreamId, consumers,
   1423                 width, height, format, consumerUsage, dataSpace, rotation,
   1424                 mTimestampOffset, physicalCameraId, streamSetId);
   1425     } else if (consumers.size() == 0 && hasDeferredConsumer) {
   1426         newStream = new Camera3OutputStream(mNextStreamId,
   1427                 width, height, format, consumerUsage, dataSpace, rotation,
   1428                 mTimestampOffset, physicalCameraId, streamSetId);
   1429     } else {
   1430         newStream = new Camera3OutputStream(mNextStreamId, consumers[0],
   1431                 width, height, format, dataSpace, rotation,
   1432                 mTimestampOffset, physicalCameraId, streamSetId);
   1433     }
   1434 
   1435     size_t consumerCount = consumers.size();
   1436     for (size_t i = 0; i < consumerCount; i++) {
   1437         int id = newStream->getSurfaceId(consumers[i]);
   1438         if (id < 0) {
   1439             SET_ERR_L("Invalid surface id");
   1440             return BAD_VALUE;
   1441         }
   1442         if (surfaceIds != nullptr) {
   1443             surfaceIds->push_back(id);
   1444         }
   1445     }
   1446 
   1447     newStream->setStatusTracker(mStatusTracker);
   1448 
   1449     newStream->setBufferManager(mBufferManager);
   1450 
   1451     res = mOutputStreams.add(mNextStreamId, newStream);
   1452     if (res < 0) {
   1453         SET_ERR_L("Can't add new stream to set: %s (%d)", strerror(-res), res);
   1454         return res;
   1455     }
   1456 
   1457     *id = mNextStreamId++;
   1458     mNeedConfig = true;
   1459 
   1460     // Continue captures if active at start
   1461     if (wasActive) {
   1462         ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
   1463         // Reuse current operating mode and session parameters for new stream config
   1464         res = configureStreamsLocked(mOperatingMode, mSessionParams);
   1465         if (res != OK) {
   1466             CLOGE("Can't reconfigure device for new stream %d: %s (%d)",
   1467                     mNextStreamId, strerror(-res), res);
   1468             return res;
   1469         }
   1470         internalResumeLocked();
   1471     }
   1472     ALOGV("Camera %s: Created new stream", mId.string());
   1473     return OK;
   1474 }
   1475 
   1476 status_t Camera3Device::getStreamInfo(int id, StreamInfo *streamInfo) {
   1477     ATRACE_CALL();
   1478     if (nullptr == streamInfo) {
   1479         return BAD_VALUE;
   1480     }
   1481     Mutex::Autolock il(mInterfaceLock);
   1482     Mutex::Autolock l(mLock);
   1483 
   1484     switch (mStatus) {
   1485         case STATUS_ERROR:
   1486             CLOGE("Device has encountered a serious error");
   1487             return INVALID_OPERATION;
   1488         case STATUS_UNINITIALIZED:
   1489             CLOGE("Device not initialized!");
   1490             return INVALID_OPERATION;
   1491         case STATUS_UNCONFIGURED:
   1492         case STATUS_CONFIGURED:
   1493         case STATUS_ACTIVE:
   1494             // OK
   1495             break;
   1496         default:
   1497             SET_ERR_L("Unexpected status: %d", mStatus);
   1498             return INVALID_OPERATION;
   1499     }
   1500 
   1501     ssize_t idx = mOutputStreams.indexOfKey(id);
   1502     if (idx == NAME_NOT_FOUND) {
   1503         CLOGE("Stream %d is unknown", id);
   1504         return idx;
   1505     }
   1506 
   1507     streamInfo->width  = mOutputStreams[idx]->getWidth();
   1508     streamInfo->height = mOutputStreams[idx]->getHeight();
   1509     streamInfo->format = mOutputStreams[idx]->getFormat();
   1510     streamInfo->dataSpace = mOutputStreams[idx]->getDataSpace();
   1511     streamInfo->formatOverridden = mOutputStreams[idx]->isFormatOverridden();
   1512     streamInfo->originalFormat = mOutputStreams[idx]->getOriginalFormat();
   1513     streamInfo->dataSpaceOverridden = mOutputStreams[idx]->isDataSpaceOverridden();
   1514     streamInfo->originalDataSpace = mOutputStreams[idx]->getOriginalDataSpace();
   1515     return OK;
   1516 }
   1517 
   1518 status_t Camera3Device::setStreamTransform(int id,
   1519         int transform) {
   1520     ATRACE_CALL();
   1521     Mutex::Autolock il(mInterfaceLock);
   1522     Mutex::Autolock l(mLock);
   1523 
   1524     switch (mStatus) {
   1525         case STATUS_ERROR:
   1526             CLOGE("Device has encountered a serious error");
   1527             return INVALID_OPERATION;
   1528         case STATUS_UNINITIALIZED:
   1529             CLOGE("Device not initialized");
   1530             return INVALID_OPERATION;
   1531         case STATUS_UNCONFIGURED:
   1532         case STATUS_CONFIGURED:
   1533         case STATUS_ACTIVE:
   1534             // OK
   1535             break;
   1536         default:
   1537             SET_ERR_L("Unexpected status: %d", mStatus);
   1538             return INVALID_OPERATION;
   1539     }
   1540 
   1541     ssize_t idx = mOutputStreams.indexOfKey(id);
   1542     if (idx == NAME_NOT_FOUND) {
   1543         CLOGE("Stream %d does not exist",
   1544                 id);
   1545         return BAD_VALUE;
   1546     }
   1547 
   1548     return mOutputStreams.editValueAt(idx)->setTransform(transform);
   1549 }
   1550 
   1551 status_t Camera3Device::deleteStream(int id) {
   1552     ATRACE_CALL();
   1553     Mutex::Autolock il(mInterfaceLock);
   1554     Mutex::Autolock l(mLock);
   1555     status_t res;
   1556 
   1557     ALOGV("%s: Camera %s: Deleting stream %d", __FUNCTION__, mId.string(), id);
   1558 
   1559     // CameraDevice semantics require device to already be idle before
   1560     // deleteStream is called, unlike for createStream.
   1561     if (mStatus == STATUS_ACTIVE) {
   1562         ALOGW("%s: Camera %s: Device not idle", __FUNCTION__, mId.string());
   1563         return -EBUSY;
   1564     }
   1565 
   1566     if (mStatus == STATUS_ERROR) {
   1567         ALOGW("%s: Camera %s: deleteStream not allowed in ERROR state",
   1568                 __FUNCTION__, mId.string());
   1569         return -EBUSY;
   1570     }
   1571 
   1572     sp<Camera3StreamInterface> deletedStream;
   1573     ssize_t outputStreamIdx = mOutputStreams.indexOfKey(id);
   1574     if (mInputStream != NULL && id == mInputStream->getId()) {
   1575         deletedStream = mInputStream;
   1576         mInputStream.clear();
   1577     } else {
   1578         if (outputStreamIdx == NAME_NOT_FOUND) {
   1579             CLOGE("Stream %d does not exist", id);
   1580             return BAD_VALUE;
   1581         }
   1582     }
   1583 
   1584     // Delete output stream or the output part of a bi-directional stream.
   1585     if (outputStreamIdx != NAME_NOT_FOUND) {
   1586         deletedStream = mOutputStreams.editValueAt(outputStreamIdx);
   1587         mOutputStreams.removeItem(id);
   1588     }
   1589 
   1590     // Free up the stream endpoint so that it can be used by some other stream
   1591     res = deletedStream->disconnect();
   1592     if (res != OK) {
   1593         SET_ERR_L("Can't disconnect deleted stream %d", id);
   1594         // fall through since we want to still list the stream as deleted.
   1595     }
   1596     mDeletedStreams.add(deletedStream);
   1597     mNeedConfig = true;
   1598 
   1599     return res;
   1600 }
   1601 
   1602 status_t Camera3Device::configureStreams(const CameraMetadata& sessionParams, int operatingMode) {
   1603     ATRACE_CALL();
   1604     ALOGV("%s: E", __FUNCTION__);
   1605 
   1606     Mutex::Autolock il(mInterfaceLock);
   1607     Mutex::Autolock l(mLock);
   1608 
   1609     // In case the client doesn't include any session parameter, try a
   1610     // speculative configuration using the values from the last cached
   1611     // default request.
   1612     if (sessionParams.isEmpty() &&
   1613             ((mLastTemplateId > 0) && (mLastTemplateId < CAMERA3_TEMPLATE_COUNT)) &&
   1614             (!mRequestTemplateCache[mLastTemplateId].isEmpty())) {
   1615         ALOGV("%s: Speculative session param configuration with template id: %d", __func__,
   1616                 mLastTemplateId);
   1617         return filterParamsAndConfigureLocked(mRequestTemplateCache[mLastTemplateId],
   1618                 operatingMode);
   1619     }
   1620 
   1621     return filterParamsAndConfigureLocked(sessionParams, operatingMode);
   1622 }
   1623 
   1624 status_t Camera3Device::filterParamsAndConfigureLocked(const CameraMetadata& sessionParams,
   1625         int operatingMode) {
   1626     //Filter out any incoming session parameters
   1627     const CameraMetadata params(sessionParams);
   1628     camera_metadata_entry_t availableSessionKeys = mDeviceInfo.find(
   1629             ANDROID_REQUEST_AVAILABLE_SESSION_KEYS);
   1630     CameraMetadata filteredParams(availableSessionKeys.count);
   1631     camera_metadata_t *meta = const_cast<camera_metadata_t *>(
   1632             filteredParams.getAndLock());
   1633     set_camera_metadata_vendor_id(meta, mVendorTagId);
   1634     filteredParams.unlock(meta);
   1635     if (availableSessionKeys.count > 0) {
   1636         for (size_t i = 0; i < availableSessionKeys.count; i++) {
   1637             camera_metadata_ro_entry entry = params.find(
   1638                     availableSessionKeys.data.i32[i]);
   1639             if (entry.count > 0) {
   1640                 filteredParams.update(entry);
   1641             }
   1642         }
   1643     }
   1644 
   1645     return configureStreamsLocked(operatingMode, filteredParams);
   1646 }
   1647 
   1648 status_t Camera3Device::getInputBufferProducer(
   1649         sp<IGraphicBufferProducer> *producer) {
   1650     ATRACE_CALL();
   1651     Mutex::Autolock il(mInterfaceLock);
   1652     Mutex::Autolock l(mLock);
   1653 
   1654     if (producer == NULL) {
   1655         return BAD_VALUE;
   1656     } else if (mInputStream == NULL) {
   1657         return INVALID_OPERATION;
   1658     }
   1659 
   1660     return mInputStream->getInputBufferProducer(producer);
   1661 }
   1662 
   1663 status_t Camera3Device::createDefaultRequest(int templateId,
   1664         CameraMetadata *request) {
   1665     ATRACE_CALL();
   1666     ALOGV("%s: for template %d", __FUNCTION__, templateId);
   1667 
   1668     if (templateId <= 0 || templateId >= CAMERA3_TEMPLATE_COUNT) {
   1669         android_errorWriteWithInfoLog(CameraService::SN_EVENT_LOG_ID, "26866110",
   1670                 IPCThreadState::self()->getCallingUid(), nullptr, 0);
   1671         return BAD_VALUE;
   1672     }
   1673 
   1674     Mutex::Autolock il(mInterfaceLock);
   1675 
   1676     {
   1677         Mutex::Autolock l(mLock);
   1678         switch (mStatus) {
   1679             case STATUS_ERROR:
   1680                 CLOGE("Device has encountered a serious error");
   1681                 return INVALID_OPERATION;
   1682             case STATUS_UNINITIALIZED:
   1683                 CLOGE("Device is not initialized!");
   1684                 return INVALID_OPERATION;
   1685             case STATUS_UNCONFIGURED:
   1686             case STATUS_CONFIGURED:
   1687             case STATUS_ACTIVE:
   1688                 // OK
   1689                 break;
   1690             default:
   1691                 SET_ERR_L("Unexpected status: %d", mStatus);
   1692                 return INVALID_OPERATION;
   1693         }
   1694 
   1695         if (!mRequestTemplateCache[templateId].isEmpty()) {
   1696             *request = mRequestTemplateCache[templateId];
   1697             mLastTemplateId = templateId;
   1698             return OK;
   1699         }
   1700     }
   1701 
   1702     camera_metadata_t *rawRequest;
   1703     status_t res = mInterface->constructDefaultRequestSettings(
   1704             (camera3_request_template_t) templateId, &rawRequest);
   1705 
   1706     {
   1707         Mutex::Autolock l(mLock);
   1708         if (res == BAD_VALUE) {
   1709             ALOGI("%s: template %d is not supported on this camera device",
   1710                   __FUNCTION__, templateId);
   1711             return res;
   1712         } else if (res != OK) {
   1713             CLOGE("Unable to construct request template %d: %s (%d)",
   1714                     templateId, strerror(-res), res);
   1715             return res;
   1716         }
   1717 
   1718         set_camera_metadata_vendor_id(rawRequest, mVendorTagId);
   1719         mRequestTemplateCache[templateId].acquire(rawRequest);
   1720 
   1721         *request = mRequestTemplateCache[templateId];
   1722         mLastTemplateId = templateId;
   1723     }
   1724     return OK;
   1725 }
   1726 
   1727 status_t Camera3Device::waitUntilDrained() {
   1728     ATRACE_CALL();
   1729     Mutex::Autolock il(mInterfaceLock);
   1730     nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
   1731     Mutex::Autolock l(mLock);
   1732 
   1733     return waitUntilDrainedLocked(maxExpectedDuration);
   1734 }
   1735 
   1736 status_t Camera3Device::waitUntilDrainedLocked(nsecs_t maxExpectedDuration) {
   1737     switch (mStatus) {
   1738         case STATUS_UNINITIALIZED:
   1739         case STATUS_UNCONFIGURED:
   1740             ALOGV("%s: Already idle", __FUNCTION__);
   1741             return OK;
   1742         case STATUS_CONFIGURED:
   1743             // To avoid race conditions, check with tracker to be sure
   1744         case STATUS_ERROR:
   1745         case STATUS_ACTIVE:
   1746             // Need to verify shut down
   1747             break;
   1748         default:
   1749             SET_ERR_L("Unexpected status: %d",mStatus);
   1750             return INVALID_OPERATION;
   1751     }
   1752     ALOGV("%s: Camera %s: Waiting until idle (%" PRIi64 "ns)", __FUNCTION__, mId.string(),
   1753             maxExpectedDuration);
   1754     status_t res = waitUntilStateThenRelock(/*active*/ false, maxExpectedDuration);
   1755     if (res != OK) {
   1756         SET_ERR_L("Error waiting for HAL to drain: %s (%d)", strerror(-res),
   1757                 res);
   1758     }
   1759     return res;
   1760 }
   1761 
   1762 
   1763 void Camera3Device::internalUpdateStatusLocked(Status status) {
   1764     mStatus = status;
   1765     mRecentStatusUpdates.add(mStatus);
   1766     mStatusChanged.broadcast();
   1767 }
   1768 
   1769 void Camera3Device::pauseStateNotify(bool enable) {
   1770     Mutex::Autolock il(mInterfaceLock);
   1771     Mutex::Autolock l(mLock);
   1772 
   1773     mPauseStateNotify = enable;
   1774 }
   1775 
   1776 // Pause to reconfigure
   1777 status_t Camera3Device::internalPauseAndWaitLocked(nsecs_t maxExpectedDuration) {
   1778     mRequestThread->setPaused(true);
   1779 
   1780     ALOGV("%s: Camera %s: Internal wait until idle (% " PRIi64 " ns)", __FUNCTION__, mId.string(),
   1781           maxExpectedDuration);
   1782     status_t res = waitUntilStateThenRelock(/*active*/ false, maxExpectedDuration);
   1783     if (res != OK) {
   1784         SET_ERR_L("Can't idle device in %f seconds!",
   1785                 maxExpectedDuration/1e9);
   1786     }
   1787 
   1788     return res;
   1789 }
   1790 
   1791 // Resume after internalPauseAndWaitLocked
   1792 status_t Camera3Device::internalResumeLocked() {
   1793     status_t res;
   1794 
   1795     mRequestThread->setPaused(false);
   1796 
   1797     ALOGV("%s: Camera %s: Internal wait until active (% " PRIi64 " ns)", __FUNCTION__, mId.string(),
   1798             kActiveTimeout);
   1799     res = waitUntilStateThenRelock(/*active*/ true, kActiveTimeout);
   1800     if (res != OK) {
   1801         SET_ERR_L("Can't transition to active in %f seconds!",
   1802                 kActiveTimeout/1e9);
   1803     }
   1804     mPauseStateNotify = false;
   1805     return OK;
   1806 }
   1807 
   1808 status_t Camera3Device::waitUntilStateThenRelock(bool active, nsecs_t timeout) {
   1809     status_t res = OK;
   1810 
   1811     size_t startIndex = 0;
   1812     if (mStatusWaiters == 0) {
   1813         // Clear the list of recent statuses if there are no existing threads waiting on updates to
   1814         // this status list
   1815         mRecentStatusUpdates.clear();
   1816     } else {
   1817         // If other threads are waiting on updates to this status list, set the position of the
   1818         // first element that this list will check rather than clearing the list.
   1819         startIndex = mRecentStatusUpdates.size();
   1820     }
   1821 
   1822     mStatusWaiters++;
   1823 
   1824     bool stateSeen = false;
   1825     do {
   1826         if (active == (mStatus == STATUS_ACTIVE)) {
   1827             // Desired state is current
   1828             break;
   1829         }
   1830 
   1831         res = mStatusChanged.waitRelative(mLock, timeout);
   1832         if (res != OK) break;
   1833 
   1834         // This is impossible, but if not, could result in subtle deadlocks and invalid state
   1835         // transitions.
   1836         LOG_ALWAYS_FATAL_IF(startIndex > mRecentStatusUpdates.size(),
   1837                 "%s: Skipping status updates in Camera3Device, may result in deadlock.",
   1838                 __FUNCTION__);
   1839 
   1840         // Encountered desired state since we began waiting
   1841         for (size_t i = startIndex; i < mRecentStatusUpdates.size(); i++) {
   1842             if (active == (mRecentStatusUpdates[i] == STATUS_ACTIVE) ) {
   1843                 stateSeen = true;
   1844                 break;
   1845             }
   1846         }
   1847     } while (!stateSeen);
   1848 
   1849     mStatusWaiters--;
   1850 
   1851     return res;
   1852 }
   1853 
   1854 
   1855 status_t Camera3Device::setNotifyCallback(wp<NotificationListener> listener) {
   1856     ATRACE_CALL();
   1857     Mutex::Autolock l(mOutputLock);
   1858 
   1859     if (listener != NULL && mListener != NULL) {
   1860         ALOGW("%s: Replacing old callback listener", __FUNCTION__);
   1861     }
   1862     mListener = listener;
   1863     mRequestThread->setNotificationListener(listener);
   1864     mPreparerThread->setNotificationListener(listener);
   1865 
   1866     return OK;
   1867 }
   1868 
   1869 bool Camera3Device::willNotify3A() {
   1870     return false;
   1871 }
   1872 
   1873 status_t Camera3Device::waitForNextFrame(nsecs_t timeout) {
   1874     ATRACE_CALL();
   1875     status_t res;
   1876     Mutex::Autolock l(mOutputLock);
   1877 
   1878     while (mResultQueue.empty()) {
   1879         res = mResultSignal.waitRelative(mOutputLock, timeout);
   1880         if (res == TIMED_OUT) {
   1881             return res;
   1882         } else if (res != OK) {
   1883             ALOGW("%s: Camera %s: No frame in %" PRId64 " ns: %s (%d)",
   1884                     __FUNCTION__, mId.string(), timeout, strerror(-res), res);
   1885             return res;
   1886         }
   1887     }
   1888     return OK;
   1889 }
   1890 
   1891 status_t Camera3Device::getNextResult(CaptureResult *frame) {
   1892     ATRACE_CALL();
   1893     Mutex::Autolock l(mOutputLock);
   1894 
   1895     if (mResultQueue.empty()) {
   1896         return NOT_ENOUGH_DATA;
   1897     }
   1898 
   1899     if (frame == NULL) {
   1900         ALOGE("%s: argument cannot be NULL", __FUNCTION__);
   1901         return BAD_VALUE;
   1902     }
   1903 
   1904     CaptureResult &result = *(mResultQueue.begin());
   1905     frame->mResultExtras = result.mResultExtras;
   1906     frame->mMetadata.acquire(result.mMetadata);
   1907     frame->mPhysicalMetadatas = std::move(result.mPhysicalMetadatas);
   1908     mResultQueue.erase(mResultQueue.begin());
   1909 
   1910     return OK;
   1911 }
   1912 
   1913 status_t Camera3Device::triggerAutofocus(uint32_t id) {
   1914     ATRACE_CALL();
   1915     Mutex::Autolock il(mInterfaceLock);
   1916 
   1917     ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id);
   1918     // Mix-in this trigger into the next request and only the next request.
   1919     RequestTrigger trigger[] = {
   1920         {
   1921             ANDROID_CONTROL_AF_TRIGGER,
   1922             ANDROID_CONTROL_AF_TRIGGER_START
   1923         },
   1924         {
   1925             ANDROID_CONTROL_AF_TRIGGER_ID,
   1926             static_cast<int32_t>(id)
   1927         }
   1928     };
   1929 
   1930     return mRequestThread->queueTrigger(trigger,
   1931                                         sizeof(trigger)/sizeof(trigger[0]));
   1932 }
   1933 
   1934 status_t Camera3Device::triggerCancelAutofocus(uint32_t id) {
   1935     ATRACE_CALL();
   1936     Mutex::Autolock il(mInterfaceLock);
   1937 
   1938     ALOGV("%s: Triggering cancel autofocus, id %d", __FUNCTION__, id);
   1939     // Mix-in this trigger into the next request and only the next request.
   1940     RequestTrigger trigger[] = {
   1941         {
   1942             ANDROID_CONTROL_AF_TRIGGER,
   1943             ANDROID_CONTROL_AF_TRIGGER_CANCEL
   1944         },
   1945         {
   1946             ANDROID_CONTROL_AF_TRIGGER_ID,
   1947             static_cast<int32_t>(id)
   1948         }
   1949     };
   1950 
   1951     return mRequestThread->queueTrigger(trigger,
   1952                                         sizeof(trigger)/sizeof(trigger[0]));
   1953 }
   1954 
   1955 status_t Camera3Device::triggerPrecaptureMetering(uint32_t id) {
   1956     ATRACE_CALL();
   1957     Mutex::Autolock il(mInterfaceLock);
   1958 
   1959     ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id);
   1960     // Mix-in this trigger into the next request and only the next request.
   1961     RequestTrigger trigger[] = {
   1962         {
   1963             ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,
   1964             ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START
   1965         },
   1966         {
   1967             ANDROID_CONTROL_AE_PRECAPTURE_ID,
   1968             static_cast<int32_t>(id)
   1969         }
   1970     };
   1971 
   1972     return mRequestThread->queueTrigger(trigger,
   1973                                         sizeof(trigger)/sizeof(trigger[0]));
   1974 }
   1975 
   1976 status_t Camera3Device::flush(int64_t *frameNumber) {
   1977     ATRACE_CALL();
   1978     ALOGV("%s: Camera %s: Flushing all requests", __FUNCTION__, mId.string());
   1979     Mutex::Autolock il(mInterfaceLock);
   1980 
   1981     {
   1982         Mutex::Autolock l(mLock);
   1983         mRequestThread->clear(/*out*/frameNumber);
   1984     }
   1985 
   1986     return mRequestThread->flush();
   1987 }
   1988 
   1989 status_t Camera3Device::prepare(int streamId) {
   1990     return prepare(camera3::Camera3StreamInterface::ALLOCATE_PIPELINE_MAX, streamId);
   1991 }
   1992 
   1993 status_t Camera3Device::prepare(int maxCount, int streamId) {
   1994     ATRACE_CALL();
   1995     ALOGV("%s: Camera %s: Preparing stream %d", __FUNCTION__, mId.string(), streamId);
   1996     Mutex::Autolock il(mInterfaceLock);
   1997     Mutex::Autolock l(mLock);
   1998 
   1999     sp<Camera3StreamInterface> stream;
   2000     ssize_t outputStreamIdx = mOutputStreams.indexOfKey(streamId);
   2001     if (outputStreamIdx == NAME_NOT_FOUND) {
   2002         CLOGE("Stream %d does not exist", streamId);
   2003         return BAD_VALUE;
   2004     }
   2005 
   2006     stream = mOutputStreams.editValueAt(outputStreamIdx);
   2007 
   2008     if (stream->isUnpreparable() || stream->hasOutstandingBuffers() ) {
   2009         CLOGE("Stream %d has already been a request target", streamId);
   2010         return BAD_VALUE;
   2011     }
   2012 
   2013     if (mRequestThread->isStreamPending(stream)) {
   2014         CLOGE("Stream %d is already a target in a pending request", streamId);
   2015         return BAD_VALUE;
   2016     }
   2017 
   2018     return mPreparerThread->prepare(maxCount, stream);
   2019 }
   2020 
   2021 status_t Camera3Device::tearDown(int streamId) {
   2022     ATRACE_CALL();
   2023     ALOGV("%s: Camera %s: Tearing down stream %d", __FUNCTION__, mId.string(), streamId);
   2024     Mutex::Autolock il(mInterfaceLock);
   2025     Mutex::Autolock l(mLock);
   2026 
   2027     sp<Camera3StreamInterface> stream;
   2028     ssize_t outputStreamIdx = mOutputStreams.indexOfKey(streamId);
   2029     if (outputStreamIdx == NAME_NOT_FOUND) {
   2030         CLOGE("Stream %d does not exist", streamId);
   2031         return BAD_VALUE;
   2032     }
   2033 
   2034     stream = mOutputStreams.editValueAt(outputStreamIdx);
   2035 
   2036     if (stream->hasOutstandingBuffers() || mRequestThread->isStreamPending(stream)) {
   2037         CLOGE("Stream %d is a target of a in-progress request", streamId);
   2038         return BAD_VALUE;
   2039     }
   2040 
   2041     return stream->tearDown();
   2042 }
   2043 
   2044 status_t Camera3Device::addBufferListenerForStream(int streamId,
   2045         wp<Camera3StreamBufferListener> listener) {
   2046     ATRACE_CALL();
   2047     ALOGV("%s: Camera %s: Adding buffer listener for stream %d", __FUNCTION__, mId.string(), streamId);
   2048     Mutex::Autolock il(mInterfaceLock);
   2049     Mutex::Autolock l(mLock);
   2050 
   2051     sp<Camera3StreamInterface> stream;
   2052     ssize_t outputStreamIdx = mOutputStreams.indexOfKey(streamId);
   2053     if (outputStreamIdx == NAME_NOT_FOUND) {
   2054         CLOGE("Stream %d does not exist", streamId);
   2055         return BAD_VALUE;
   2056     }
   2057 
   2058     stream = mOutputStreams.editValueAt(outputStreamIdx);
   2059     stream->addBufferListener(listener);
   2060 
   2061     return OK;
   2062 }
   2063 
   2064 /**
   2065  * Methods called by subclasses
   2066  */
   2067 
   2068 void Camera3Device::notifyStatus(bool idle) {
   2069     ATRACE_CALL();
   2070     {
   2071         // Need mLock to safely update state and synchronize to current
   2072         // state of methods in flight.
   2073         Mutex::Autolock l(mLock);
   2074         // We can get various system-idle notices from the status tracker
   2075         // while starting up. Only care about them if we've actually sent
   2076         // in some requests recently.
   2077         if (mStatus != STATUS_ACTIVE && mStatus != STATUS_CONFIGURED) {
   2078             return;
   2079         }
   2080         ALOGV("%s: Camera %s: Now %s, pauseState: %s", __FUNCTION__, mId.string(),
   2081                 idle ? "idle" : "active", mPauseStateNotify ? "true" : "false");
   2082         internalUpdateStatusLocked(idle ? STATUS_CONFIGURED : STATUS_ACTIVE);
   2083 
   2084         // Skip notifying listener if we're doing some user-transparent
   2085         // state changes
   2086         if (mPauseStateNotify) return;
   2087     }
   2088 
   2089     sp<NotificationListener> listener;
   2090     {
   2091         Mutex::Autolock l(mOutputLock);
   2092         listener = mListener.promote();
   2093     }
   2094     if (idle && listener != NULL) {
   2095         listener->notifyIdle();
   2096     }
   2097 }
   2098 
   2099 status_t Camera3Device::setConsumerSurfaces(int streamId,
   2100         const std::vector<sp<Surface>>& consumers, std::vector<int> *surfaceIds) {
   2101     ATRACE_CALL();
   2102     ALOGV("%s: Camera %s: set consumer surface for stream %d",
   2103             __FUNCTION__, mId.string(), streamId);
   2104 
   2105     if (surfaceIds == nullptr) {
   2106         return BAD_VALUE;
   2107     }
   2108 
   2109     Mutex::Autolock il(mInterfaceLock);
   2110     Mutex::Autolock l(mLock);
   2111 
   2112     if (consumers.size() == 0) {
   2113         CLOGE("No consumer is passed!");
   2114         return BAD_VALUE;
   2115     }
   2116 
   2117     ssize_t idx = mOutputStreams.indexOfKey(streamId);
   2118     if (idx == NAME_NOT_FOUND) {
   2119         CLOGE("Stream %d is unknown", streamId);
   2120         return idx;
   2121     }
   2122     sp<Camera3OutputStreamInterface> stream = mOutputStreams[idx];
   2123     status_t res = stream->setConsumers(consumers);
   2124     if (res != OK) {
   2125         CLOGE("Stream %d set consumer failed (error %d %s) ", streamId, res, strerror(-res));
   2126         return res;
   2127     }
   2128 
   2129     for (auto &consumer : consumers) {
   2130         int id = stream->getSurfaceId(consumer);
   2131         if (id < 0) {
   2132             CLOGE("Invalid surface id!");
   2133             return BAD_VALUE;
   2134         }
   2135         surfaceIds->push_back(id);
   2136     }
   2137 
   2138     if (stream->isConsumerConfigurationDeferred()) {
   2139         if (!stream->isConfiguring()) {
   2140             CLOGE("Stream %d was already fully configured.", streamId);
   2141             return INVALID_OPERATION;
   2142         }
   2143 
   2144         res = stream->finishConfiguration();
   2145         if (res != OK) {
   2146             SET_ERR_L("Can't finish configuring output stream %d: %s (%d)",
   2147                    stream->getId(), strerror(-res), res);
   2148             return res;
   2149         }
   2150     }
   2151 
   2152     return OK;
   2153 }
   2154 
   2155 status_t Camera3Device::updateStream(int streamId, const std::vector<sp<Surface>> &newSurfaces,
   2156         const std::vector<OutputStreamInfo> &outputInfo,
   2157         const std::vector<size_t> &removedSurfaceIds, KeyedVector<sp<Surface>, size_t> *outputMap) {
   2158     Mutex::Autolock il(mInterfaceLock);
   2159     Mutex::Autolock l(mLock);
   2160 
   2161     ssize_t idx = mOutputStreams.indexOfKey(streamId);
   2162     if (idx == NAME_NOT_FOUND) {
   2163         CLOGE("Stream %d is unknown", streamId);
   2164         return idx;
   2165     }
   2166 
   2167     for (const auto &it : removedSurfaceIds) {
   2168         if (mRequestThread->isOutputSurfacePending(streamId, it)) {
   2169             CLOGE("Shared surface still part of a pending request!");
   2170             return -EBUSY;
   2171         }
   2172     }
   2173 
   2174     sp<Camera3OutputStreamInterface> stream = mOutputStreams[idx];
   2175     status_t res = stream->updateStream(newSurfaces, outputInfo, removedSurfaceIds, outputMap);
   2176     if (res != OK) {
   2177         CLOGE("Stream %d failed to update stream (error %d %s) ",
   2178               streamId, res, strerror(-res));
   2179         if (res == UNKNOWN_ERROR) {
   2180             SET_ERR_L("%s: Stream update failed to revert to previous output configuration!",
   2181                     __FUNCTION__);
   2182         }
   2183         return res;
   2184     }
   2185 
   2186     return res;
   2187 }
   2188 
   2189 status_t Camera3Device::dropStreamBuffers(bool dropping, int streamId) {
   2190     Mutex::Autolock il(mInterfaceLock);
   2191     Mutex::Autolock l(mLock);
   2192 
   2193     int idx = mOutputStreams.indexOfKey(streamId);
   2194     if (idx == NAME_NOT_FOUND) {
   2195         ALOGE("%s: Stream %d is not found.", __FUNCTION__, streamId);
   2196         return BAD_VALUE;
   2197     }
   2198 
   2199     sp<Camera3OutputStreamInterface> stream = mOutputStreams.editValueAt(idx);
   2200     return stream->dropBuffers(dropping);
   2201 }
   2202 
   2203 /**
   2204  * Camera3Device private methods
   2205  */
   2206 
   2207 sp<Camera3Device::CaptureRequest> Camera3Device::createCaptureRequest(
   2208         const PhysicalCameraSettingsList &request, const SurfaceMap &surfaceMap) {
   2209     ATRACE_CALL();
   2210     status_t res;
   2211 
   2212     sp<CaptureRequest> newRequest = new CaptureRequest;
   2213     newRequest->mSettingsList = request;
   2214 
   2215     camera_metadata_entry_t inputStreams =
   2216             newRequest->mSettingsList.begin()->metadata.find(ANDROID_REQUEST_INPUT_STREAMS);
   2217     if (inputStreams.count > 0) {
   2218         if (mInputStream == NULL ||
   2219                 mInputStream->getId() != inputStreams.data.i32[0]) {
   2220             CLOGE("Request references unknown input stream %d",
   2221                     inputStreams.data.u8[0]);
   2222             return NULL;
   2223         }
   2224         // Lazy completion of stream configuration (allocation/registration)
   2225         // on first use
   2226         if (mInputStream->isConfiguring()) {
   2227             res = mInputStream->finishConfiguration();
   2228             if (res != OK) {
   2229                 SET_ERR_L("Unable to finish configuring input stream %d:"
   2230                         " %s (%d)",
   2231                         mInputStream->getId(), strerror(-res), res);
   2232                 return NULL;
   2233             }
   2234         }
   2235         // Check if stream is being prepared
   2236         if (mInputStream->isPreparing()) {
   2237             CLOGE("Request references an input stream that's being prepared!");
   2238             return NULL;
   2239         }
   2240 
   2241         newRequest->mInputStream = mInputStream;
   2242         newRequest->mSettingsList.begin()->metadata.erase(ANDROID_REQUEST_INPUT_STREAMS);
   2243     }
   2244 
   2245     camera_metadata_entry_t streams =
   2246             newRequest->mSettingsList.begin()->metadata.find(ANDROID_REQUEST_OUTPUT_STREAMS);
   2247     if (streams.count == 0) {
   2248         CLOGE("Zero output streams specified!");
   2249         return NULL;
   2250     }
   2251 
   2252     for (size_t i = 0; i < streams.count; i++) {
   2253         int idx = mOutputStreams.indexOfKey(streams.data.i32[i]);
   2254         if (idx == NAME_NOT_FOUND) {
   2255             CLOGE("Request references unknown stream %d",
   2256                     streams.data.u8[i]);
   2257             return NULL;
   2258         }
   2259         sp<Camera3OutputStreamInterface> stream =
   2260                 mOutputStreams.editValueAt(idx);
   2261 
   2262         // It is illegal to include a deferred consumer output stream into a request
   2263         auto iter = surfaceMap.find(streams.data.i32[i]);
   2264         if (iter != surfaceMap.end()) {
   2265             const std::vector<size_t>& surfaces = iter->second;
   2266             for (const auto& surface : surfaces) {
   2267                 if (stream->isConsumerConfigurationDeferred(surface)) {
   2268                     CLOGE("Stream %d surface %zu hasn't finished configuration yet "
   2269                           "due to deferred consumer", stream->getId(), surface);
   2270                     return NULL;
   2271                 }
   2272             }
   2273             newRequest->mOutputSurfaces[i] = surfaces;
   2274         }
   2275 
   2276         // Lazy completion of stream configuration (allocation/registration)
   2277         // on first use
   2278         if (stream->isConfiguring()) {
   2279             res = stream->finishConfiguration();
   2280             if (res != OK) {
   2281                 SET_ERR_L("Unable to finish configuring stream %d: %s (%d)",
   2282                         stream->getId(), strerror(-res), res);
   2283                 return NULL;
   2284             }
   2285         }
   2286         // Check if stream is being prepared
   2287         if (stream->isPreparing()) {
   2288             CLOGE("Request references an output stream that's being prepared!");
   2289             return NULL;
   2290         }
   2291 
   2292         newRequest->mOutputStreams.push(stream);
   2293     }
   2294     newRequest->mSettingsList.begin()->metadata.erase(ANDROID_REQUEST_OUTPUT_STREAMS);
   2295     newRequest->mBatchSize = 1;
   2296 
   2297     return newRequest;
   2298 }
   2299 
   2300 bool Camera3Device::isOpaqueInputSizeSupported(uint32_t width, uint32_t height) {
   2301     for (uint32_t i = 0; i < mSupportedOpaqueInputSizes.size(); i++) {
   2302         Size size = mSupportedOpaqueInputSizes[i];
   2303         if (size.width == width && size.height == height) {
   2304             return true;
   2305         }
   2306     }
   2307 
   2308     return false;
   2309 }
   2310 
   2311 void Camera3Device::cancelStreamsConfigurationLocked() {
   2312     int res = OK;
   2313     if (mInputStream != NULL && mInputStream->isConfiguring()) {
   2314         res = mInputStream->cancelConfiguration();
   2315         if (res != OK) {
   2316             CLOGE("Can't cancel configuring input stream %d: %s (%d)",
   2317                     mInputStream->getId(), strerror(-res), res);
   2318         }
   2319     }
   2320 
   2321     for (size_t i = 0; i < mOutputStreams.size(); i++) {
   2322         sp<Camera3OutputStreamInterface> outputStream = mOutputStreams.editValueAt(i);
   2323         if (outputStream->isConfiguring()) {
   2324             res = outputStream->cancelConfiguration();
   2325             if (res != OK) {
   2326                 CLOGE("Can't cancel configuring output stream %d: %s (%d)",
   2327                         outputStream->getId(), strerror(-res), res);
   2328             }
   2329         }
   2330     }
   2331 
   2332     // Return state to that at start of call, so that future configures
   2333     // properly clean things up
   2334     internalUpdateStatusLocked(STATUS_UNCONFIGURED);
   2335     mNeedConfig = true;
   2336 
   2337     res = mPreparerThread->resume();
   2338     if (res != OK) {
   2339         ALOGE("%s: Camera %s: Preparer thread failed to resume!", __FUNCTION__, mId.string());
   2340     }
   2341 }
   2342 
   2343 bool Camera3Device::reconfigureCamera(const CameraMetadata& sessionParams) {
   2344     ATRACE_CALL();
   2345     bool ret = false;
   2346 
   2347     Mutex::Autolock il(mInterfaceLock);
   2348     nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
   2349 
   2350     Mutex::Autolock l(mLock);
   2351     auto rc = internalPauseAndWaitLocked(maxExpectedDuration);
   2352     if (rc == NO_ERROR) {
   2353         mNeedConfig = true;
   2354         rc = configureStreamsLocked(mOperatingMode, sessionParams, /*notifyRequestThread*/ false);
   2355         if (rc == NO_ERROR) {
   2356             ret = true;
   2357             mPauseStateNotify = false;
   2358             //Moving to active state while holding 'mLock' is important.
   2359             //There could be pending calls to 'create-/deleteStream' which
   2360             //will trigger another stream configuration while the already
   2361             //present streams end up with outstanding buffers that will
   2362             //not get drained.
   2363             internalUpdateStatusLocked(STATUS_ACTIVE);
   2364         } else {
   2365             setErrorStateLocked("%s: Failed to re-configure camera: %d",
   2366                     __FUNCTION__, rc);
   2367         }
   2368     } else {
   2369         ALOGE("%s: Failed to pause streaming: %d", __FUNCTION__, rc);
   2370     }
   2371 
   2372     return ret;
   2373 }
   2374 
   2375 status_t Camera3Device::configureStreamsLocked(int operatingMode,
   2376         const CameraMetadata& sessionParams, bool notifyRequestThread) {
   2377     ATRACE_CALL();
   2378     status_t res;
   2379 
   2380     if (mStatus != STATUS_UNCONFIGURED && mStatus != STATUS_CONFIGURED) {
   2381         CLOGE("Not idle");
   2382         return INVALID_OPERATION;
   2383     }
   2384 
   2385     if (operatingMode < 0) {
   2386         CLOGE("Invalid operating mode: %d", operatingMode);
   2387         return BAD_VALUE;
   2388     }
   2389 
   2390     bool isConstrainedHighSpeed =
   2391             static_cast<int>(StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE) ==
   2392             operatingMode;
   2393 
   2394     if (mOperatingMode != operatingMode) {
   2395         mNeedConfig = true;
   2396         mIsConstrainedHighSpeedConfiguration = isConstrainedHighSpeed;
   2397         mOperatingMode = operatingMode;
   2398     }
   2399 
   2400     if (!mNeedConfig) {
   2401         ALOGV("%s: Skipping config, no stream changes", __FUNCTION__);
   2402         return OK;
   2403     }
   2404 
   2405     // Workaround for device HALv3.2 or older spec bug - zero streams requires
   2406     // adding a dummy stream instead.
   2407     // TODO: Bug: 17321404 for fixing the HAL spec and removing this workaround.
   2408     if (mOutputStreams.size() == 0) {
   2409         addDummyStreamLocked();
   2410     } else {
   2411         tryRemoveDummyStreamLocked();
   2412     }
   2413 
   2414     // Start configuring the streams
   2415     ALOGV("%s: Camera %s: Starting stream configuration", __FUNCTION__, mId.string());
   2416 
   2417     mPreparerThread->pause();
   2418 
   2419     camera3_stream_configuration config;
   2420     config.operation_mode = mOperatingMode;
   2421     config.num_streams = (mInputStream != NULL) + mOutputStreams.size();
   2422 
   2423     Vector<camera3_stream_t*> streams;
   2424     streams.setCapacity(config.num_streams);
   2425     std::vector<uint32_t> bufferSizes(config.num_streams, 0);
   2426 
   2427 
   2428     if (mInputStream != NULL) {
   2429         camera3_stream_t *inputStream;
   2430         inputStream = mInputStream->startConfiguration();
   2431         if (inputStream == NULL) {
   2432             CLOGE("Can't start input stream configuration");
   2433             cancelStreamsConfigurationLocked();
   2434             return INVALID_OPERATION;
   2435         }
   2436         streams.add(inputStream);
   2437     }
   2438 
   2439     for (size_t i = 0; i < mOutputStreams.size(); i++) {
   2440 
   2441         // Don't configure bidi streams twice, nor add them twice to the list
   2442         if (mOutputStreams[i].get() ==
   2443             static_cast<Camera3StreamInterface*>(mInputStream.get())) {
   2444 
   2445             config.num_streams--;
   2446             continue;
   2447         }
   2448 
   2449         camera3_stream_t *outputStream;
   2450         outputStream = mOutputStreams.editValueAt(i)->startConfiguration();
   2451         if (outputStream == NULL) {
   2452             CLOGE("Can't start output stream configuration");
   2453             cancelStreamsConfigurationLocked();
   2454             return INVALID_OPERATION;
   2455         }
   2456         streams.add(outputStream);
   2457 
   2458         if (outputStream->format == HAL_PIXEL_FORMAT_BLOB &&
   2459                 outputStream->data_space == HAL_DATASPACE_V0_JFIF) {
   2460             size_t k = i + ((mInputStream != nullptr) ? 1 : 0); // Input stream if present should
   2461                                                                 // always occupy the initial entry.
   2462             bufferSizes[k] = static_cast<uint32_t>(
   2463                     getJpegBufferSize(outputStream->width, outputStream->height));
   2464         }
   2465     }
   2466 
   2467     config.streams = streams.editArray();
   2468 
   2469     // Do the HAL configuration; will potentially touch stream
   2470     // max_buffers, usage, priv fields.
   2471 
   2472     const camera_metadata_t *sessionBuffer = sessionParams.getAndLock();
   2473     res = mInterface->configureStreams(sessionBuffer, &config, bufferSizes);
   2474     sessionParams.unlock(sessionBuffer);
   2475 
   2476     if (res == BAD_VALUE) {
   2477         // HAL rejected this set of streams as unsupported, clean up config
   2478         // attempt and return to unconfigured state
   2479         CLOGE("Set of requested inputs/outputs not supported by HAL");
   2480         cancelStreamsConfigurationLocked();
   2481         return BAD_VALUE;
   2482     } else if (res != OK) {
   2483         // Some other kind of error from configure_streams - this is not
   2484         // expected
   2485         SET_ERR_L("Unable to configure streams with HAL: %s (%d)",
   2486                 strerror(-res), res);
   2487         return res;
   2488     }
   2489 
   2490     // Finish all stream configuration immediately.
   2491     // TODO: Try to relax this later back to lazy completion, which should be
   2492     // faster
   2493 
   2494     if (mInputStream != NULL && mInputStream->isConfiguring()) {
   2495         res = mInputStream->finishConfiguration();
   2496         if (res != OK) {
   2497             CLOGE("Can't finish configuring input stream %d: %s (%d)",
   2498                     mInputStream->getId(), strerror(-res), res);
   2499             cancelStreamsConfigurationLocked();
   2500             return BAD_VALUE;
   2501         }
   2502     }
   2503 
   2504     for (size_t i = 0; i < mOutputStreams.size(); i++) {
   2505         sp<Camera3OutputStreamInterface> outputStream =
   2506             mOutputStreams.editValueAt(i);
   2507         if (outputStream->isConfiguring() && !outputStream->isConsumerConfigurationDeferred()) {
   2508             res = outputStream->finishConfiguration();
   2509             if (res != OK) {
   2510                 CLOGE("Can't finish configuring output stream %d: %s (%d)",
   2511                         outputStream->getId(), strerror(-res), res);
   2512                 cancelStreamsConfigurationLocked();
   2513                 return BAD_VALUE;
   2514             }
   2515         }
   2516     }
   2517 
   2518     // Request thread needs to know to avoid using repeat-last-settings protocol
   2519     // across configure_streams() calls
   2520     if (notifyRequestThread) {
   2521         mRequestThread->configurationComplete(mIsConstrainedHighSpeedConfiguration, sessionParams);
   2522     }
   2523 
   2524     char value[PROPERTY_VALUE_MAX];
   2525     property_get("camera.fifo.disable", value, "0");
   2526     int32_t disableFifo = atoi(value);
   2527     if (disableFifo != 1) {
   2528         // Boost priority of request thread to SCHED_FIFO.
   2529         pid_t requestThreadTid = mRequestThread->getTid();
   2530         res = requestPriority(getpid(), requestThreadTid,
   2531                 kRequestThreadPriority, /*isForApp*/ false, /*asynchronous*/ false);
   2532         if (res != OK) {
   2533             ALOGW("Can't set realtime priority for request processing thread: %s (%d)",
   2534                     strerror(-res), res);
   2535         } else {
   2536             ALOGD("Set real time priority for request queue thread (tid %d)", requestThreadTid);
   2537         }
   2538     }
   2539 
   2540     // Update device state
   2541     const camera_metadata_t *newSessionParams = sessionParams.getAndLock();
   2542     const camera_metadata_t *currentSessionParams = mSessionParams.getAndLock();
   2543     bool updateSessionParams = (newSessionParams != currentSessionParams) ? true : false;
   2544     sessionParams.unlock(newSessionParams);
   2545     mSessionParams.unlock(currentSessionParams);
   2546     if (updateSessionParams)  {
   2547         mSessionParams = sessionParams;
   2548     }
   2549 
   2550     mNeedConfig = false;
   2551 
   2552     internalUpdateStatusLocked((mDummyStreamId == NO_STREAM) ?
   2553             STATUS_CONFIGURED : STATUS_UNCONFIGURED);
   2554 
   2555     ALOGV("%s: Camera %s: Stream configuration complete", __FUNCTION__, mId.string());
   2556 
   2557     // tear down the deleted streams after configure streams.
   2558     mDeletedStreams.clear();
   2559 
   2560     auto rc = mPreparerThread->resume();
   2561     if (rc != OK) {
   2562         SET_ERR_L("%s: Camera %s: Preparer thread failed to resume!", __FUNCTION__, mId.string());
   2563         return rc;
   2564     }
   2565 
   2566     return OK;
   2567 }
   2568 
   2569 status_t Camera3Device::addDummyStreamLocked() {
   2570     ATRACE_CALL();
   2571     status_t res;
   2572 
   2573     if (mDummyStreamId != NO_STREAM) {
   2574         // Should never be adding a second dummy stream when one is already
   2575         // active
   2576         SET_ERR_L("%s: Camera %s: A dummy stream already exists!",
   2577                 __FUNCTION__, mId.string());
   2578         return INVALID_OPERATION;
   2579     }
   2580 
   2581     ALOGV("%s: Camera %s: Adding a dummy stream", __FUNCTION__, mId.string());
   2582 
   2583     sp<Camera3OutputStreamInterface> dummyStream =
   2584             new Camera3DummyStream(mNextStreamId);
   2585 
   2586     res = mOutputStreams.add(mNextStreamId, dummyStream);
   2587     if (res < 0) {
   2588         SET_ERR_L("Can't add dummy stream to set: %s (%d)", strerror(-res), res);
   2589         return res;
   2590     }
   2591 
   2592     mDummyStreamId = mNextStreamId;
   2593     mNextStreamId++;
   2594 
   2595     return OK;
   2596 }
   2597 
   2598 status_t Camera3Device::tryRemoveDummyStreamLocked() {
   2599     ATRACE_CALL();
   2600     status_t res;
   2601 
   2602     if (mDummyStreamId == NO_STREAM) return OK;
   2603     if (mOutputStreams.size() == 1) return OK;
   2604 
   2605     ALOGV("%s: Camera %s: Removing the dummy stream", __FUNCTION__, mId.string());
   2606 
   2607     // Ok, have a dummy stream and there's at least one other output stream,
   2608     // so remove the dummy
   2609 
   2610     sp<Camera3StreamInterface> deletedStream;
   2611     ssize_t outputStreamIdx = mOutputStreams.indexOfKey(mDummyStreamId);
   2612     if (outputStreamIdx == NAME_NOT_FOUND) {
   2613         SET_ERR_L("Dummy stream %d does not appear to exist", mDummyStreamId);
   2614         return INVALID_OPERATION;
   2615     }
   2616 
   2617     deletedStream = mOutputStreams.editValueAt(outputStreamIdx);
   2618     mOutputStreams.removeItemsAt(outputStreamIdx);
   2619 
   2620     // Free up the stream endpoint so that it can be used by some other stream
   2621     res = deletedStream->disconnect();
   2622     if (res != OK) {
   2623         SET_ERR_L("Can't disconnect deleted dummy stream %d", mDummyStreamId);
   2624         // fall through since we want to still list the stream as deleted.
   2625     }
   2626     mDeletedStreams.add(deletedStream);
   2627     mDummyStreamId = NO_STREAM;
   2628 
   2629     return res;
   2630 }
   2631 
   2632 void Camera3Device::setErrorState(const char *fmt, ...) {
   2633     ATRACE_CALL();
   2634     Mutex::Autolock l(mLock);
   2635     va_list args;
   2636     va_start(args, fmt);
   2637 
   2638     setErrorStateLockedV(fmt, args);
   2639 
   2640     va_end(args);
   2641 }
   2642 
   2643 void Camera3Device::setErrorStateV(const char *fmt, va_list args) {
   2644     ATRACE_CALL();
   2645     Mutex::Autolock l(mLock);
   2646     setErrorStateLockedV(fmt, args);
   2647 }
   2648 
   2649 void Camera3Device::setErrorStateLocked(const char *fmt, ...) {
   2650     va_list args;
   2651     va_start(args, fmt);
   2652 
   2653     setErrorStateLockedV(fmt, args);
   2654 
   2655     va_end(args);
   2656 }
   2657 
   2658 void Camera3Device::setErrorStateLockedV(const char *fmt, va_list args) {
   2659     // Print out all error messages to log
   2660     String8 errorCause = String8::formatV(fmt, args);
   2661     ALOGE("Camera %s: %s", mId.string(), errorCause.string());
   2662 
   2663     // But only do error state transition steps for the first error
   2664     if (mStatus == STATUS_ERROR || mStatus == STATUS_UNINITIALIZED) return;
   2665 
   2666     mErrorCause = errorCause;
   2667 
   2668     if (mRequestThread != nullptr) {
   2669         mRequestThread->setPaused(true);
   2670     }
   2671     internalUpdateStatusLocked(STATUS_ERROR);
   2672 
   2673     // Notify upstream about a device error
   2674     sp<NotificationListener> listener = mListener.promote();
   2675     if (listener != NULL) {
   2676         listener->notifyError(hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE,
   2677                 CaptureResultExtras());
   2678     }
   2679 
   2680     // Save stack trace. View by dumping it later.
   2681     CameraTraces::saveTrace();
   2682     // TODO: consider adding errorCause and client pid/procname
   2683 }
   2684 
   2685 /**
   2686  * In-flight request management
   2687  */
   2688 
   2689 status_t Camera3Device::registerInFlight(uint32_t frameNumber,
   2690         int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput,
   2691         bool hasAppCallback, nsecs_t maxExpectedDuration,
   2692         std::set<String8>& physicalCameraIds) {
   2693     ATRACE_CALL();
   2694     Mutex::Autolock l(mInFlightLock);
   2695 
   2696     ssize_t res;
   2697     res = mInFlightMap.add(frameNumber, InFlightRequest(numBuffers, resultExtras, hasInput,
   2698             hasAppCallback, maxExpectedDuration, physicalCameraIds));
   2699     if (res < 0) return res;
   2700 
   2701     if (mInFlightMap.size() == 1) {
   2702         // hold mLock to prevent race with disconnect
   2703         Mutex::Autolock l(mLock);
   2704         if (mStatusTracker != nullptr) {
   2705             mStatusTracker->markComponentActive(mInFlightStatusId);
   2706         }
   2707     }
   2708 
   2709     mExpectedInflightDuration += maxExpectedDuration;
   2710     return OK;
   2711 }
   2712 
   2713 void Camera3Device::returnOutputBuffers(
   2714         const camera3_stream_buffer_t *outputBuffers, size_t numBuffers,
   2715         nsecs_t timestamp) {
   2716     for (size_t i = 0; i < numBuffers; i++)
   2717     {
   2718         Camera3Stream *stream = Camera3Stream::cast(outputBuffers[i].stream);
   2719         status_t res = stream->returnBuffer(outputBuffers[i], timestamp);
   2720         // Note: stream may be deallocated at this point, if this buffer was
   2721         // the last reference to it.
   2722         if (res != OK) {
   2723             ALOGE("Can't return buffer to its stream: %s (%d)",
   2724                 strerror(-res), res);
   2725         }
   2726     }
   2727 }
   2728 
   2729 void Camera3Device::removeInFlightMapEntryLocked(int idx) {
   2730     ATRACE_CALL();
   2731     nsecs_t duration = mInFlightMap.valueAt(idx).maxExpectedDuration;
   2732     mInFlightMap.removeItemsAt(idx, 1);
   2733 
   2734     // Indicate idle inFlightMap to the status tracker
   2735     if (mInFlightMap.size() == 0) {
   2736         // hold mLock to prevent race with disconnect
   2737         Mutex::Autolock l(mLock);
   2738         if (mStatusTracker != nullptr) {
   2739             mStatusTracker->markComponentIdle(mInFlightStatusId, Fence::NO_FENCE);
   2740         }
   2741     }
   2742     mExpectedInflightDuration -= duration;
   2743 }
   2744 
   2745 void Camera3Device::removeInFlightRequestIfReadyLocked(int idx) {
   2746 
   2747     const InFlightRequest &request = mInFlightMap.valueAt(idx);
   2748     const uint32_t frameNumber = mInFlightMap.keyAt(idx);
   2749 
   2750     nsecs_t sensorTimestamp = request.sensorTimestamp;
   2751     nsecs_t shutterTimestamp = request.shutterTimestamp;
   2752 
   2753     // Check if it's okay to remove the request from InFlightMap:
   2754     // In the case of a successful request:
   2755     //      all input and output buffers, all result metadata, shutter callback
   2756     //      arrived.
   2757     // In the case of a unsuccessful request:
   2758     //      all input and output buffers arrived.
   2759     if (request.numBuffersLeft == 0 &&
   2760             (request.skipResultMetadata ||
   2761             (request.haveResultMetadata && shutterTimestamp != 0))) {
   2762         ATRACE_ASYNC_END("frame capture", frameNumber);
   2763 
   2764         // Sanity check - if sensor timestamp matches shutter timestamp in the
   2765         // case of request having callback.
   2766         if (request.hasCallback && request.requestStatus == OK &&
   2767                 sensorTimestamp != shutterTimestamp) {
   2768             SET_ERR("sensor timestamp (%" PRId64
   2769                 ") for frame %d doesn't match shutter timestamp (%" PRId64 ")",
   2770                 sensorTimestamp, frameNumber, shutterTimestamp);
   2771         }
   2772 
   2773         // for an unsuccessful request, it may have pending output buffers to
   2774         // return.
   2775         assert(request.requestStatus != OK ||
   2776                request.pendingOutputBuffers.size() == 0);
   2777         returnOutputBuffers(request.pendingOutputBuffers.array(),
   2778             request.pendingOutputBuffers.size(), 0);
   2779 
   2780         removeInFlightMapEntryLocked(idx);
   2781         ALOGVV("%s: removed frame %d from InFlightMap", __FUNCTION__, frameNumber);
   2782      }
   2783 
   2784     // Sanity check - if we have too many in-flight frames, something has
   2785     // likely gone wrong
   2786     if (!mIsConstrainedHighSpeedConfiguration && mInFlightMap.size() > kInFlightWarnLimit) {
   2787         CLOGE("In-flight list too large: %zu", mInFlightMap.size());
   2788     } else if (mIsConstrainedHighSpeedConfiguration && mInFlightMap.size() >
   2789             kInFlightWarnLimitHighSpeed) {
   2790         CLOGE("In-flight list too large for high speed configuration: %zu",
   2791                 mInFlightMap.size());
   2792     }
   2793 }
   2794 
   2795 void Camera3Device::flushInflightRequests() {
   2796     ATRACE_CALL();
   2797     { // First return buffers cached in mInFlightMap
   2798         Mutex::Autolock l(mInFlightLock);
   2799         for (size_t idx = 0; idx < mInFlightMap.size(); idx++) {
   2800             const InFlightRequest &request = mInFlightMap.valueAt(idx);
   2801             returnOutputBuffers(request.pendingOutputBuffers.array(),
   2802                 request.pendingOutputBuffers.size(), 0);
   2803         }
   2804         mInFlightMap.clear();
   2805         mExpectedInflightDuration = 0;
   2806     }
   2807 
   2808     // Then return all inflight buffers not returned by HAL
   2809     std::vector<std::pair<int32_t, int32_t>> inflightKeys;
   2810     mInterface->getInflightBufferKeys(&inflightKeys);
   2811 
   2812     int32_t inputStreamId = (mInputStream != nullptr) ? mInputStream->getId() : -1;
   2813     for (auto& pair : inflightKeys) {
   2814         int32_t frameNumber = pair.first;
   2815         int32_t streamId = pair.second;
   2816         buffer_handle_t* buffer;
   2817         status_t res = mInterface->popInflightBuffer(frameNumber, streamId, &buffer);
   2818         if (res != OK) {
   2819             ALOGE("%s: Frame %d: No in-flight buffer for stream %d",
   2820                     __FUNCTION__, frameNumber, streamId);
   2821             continue;
   2822         }
   2823 
   2824         camera3_stream_buffer_t streamBuffer;
   2825         streamBuffer.buffer = buffer;
   2826         streamBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
   2827         streamBuffer.acquire_fence = -1;
   2828         streamBuffer.release_fence = -1;
   2829 
   2830         // First check if the buffer belongs to deleted stream
   2831         bool streamDeleted = false;
   2832         for (auto& stream : mDeletedStreams) {
   2833             if (streamId == stream->getId()) {
   2834                 streamDeleted = true;
   2835                 // Return buffer to deleted stream
   2836                 camera3_stream* halStream = stream->asHalStream();
   2837                 streamBuffer.stream = halStream;
   2838                 switch (halStream->stream_type) {
   2839                     case CAMERA3_STREAM_OUTPUT:
   2840                         res = stream->returnBuffer(streamBuffer, /*timestamp*/ 0);
   2841                         if (res != OK) {
   2842                             ALOGE("%s: Can't return output buffer for frame %d to"
   2843                                   " stream %d: %s (%d)",  __FUNCTION__,
   2844                                   frameNumber, streamId, strerror(-res), res);
   2845                         }
   2846                         break;
   2847                     case CAMERA3_STREAM_INPUT:
   2848                         res = stream->returnInputBuffer(streamBuffer);
   2849                         if (res != OK) {
   2850                             ALOGE("%s: Can't return input buffer for frame %d to"
   2851                                   " stream %d: %s (%d)",  __FUNCTION__,
   2852                                   frameNumber, streamId, strerror(-res), res);
   2853                         }
   2854                         break;
   2855                     default: // Bi-direcitonal stream is deprecated
   2856                         ALOGE("%s: stream %d has unknown stream type %d",
   2857                                 __FUNCTION__, streamId, halStream->stream_type);
   2858                         break;
   2859                 }
   2860                 break;
   2861             }
   2862         }
   2863         if (streamDeleted) {
   2864             continue;
   2865         }
   2866 
   2867         // Then check against configured streams
   2868         if (streamId == inputStreamId) {
   2869             streamBuffer.stream = mInputStream->asHalStream();
   2870             res = mInputStream->returnInputBuffer(streamBuffer);
   2871             if (res != OK) {
   2872                 ALOGE("%s: Can't return input buffer for frame %d to"
   2873                       " stream %d: %s (%d)",  __FUNCTION__,
   2874                       frameNumber, streamId, strerror(-res), res);
   2875             }
   2876         } else {
   2877             ssize_t idx = mOutputStreams.indexOfKey(streamId);
   2878             if (idx == NAME_NOT_FOUND) {
   2879                 ALOGE("%s: Output stream id %d not found!", __FUNCTION__, streamId);
   2880                 continue;
   2881             }
   2882             streamBuffer.stream = mOutputStreams.valueAt(idx)->asHalStream();
   2883             returnOutputBuffers(&streamBuffer, /*size*/1, /*timestamp*/ 0);
   2884         }
   2885     }
   2886 }
   2887 
   2888 void Camera3Device::insertResultLocked(CaptureResult *result,
   2889         uint32_t frameNumber) {
   2890     if (result == nullptr) return;
   2891 
   2892     camera_metadata_t *meta = const_cast<camera_metadata_t *>(
   2893             result->mMetadata.getAndLock());
   2894     set_camera_metadata_vendor_id(meta, mVendorTagId);
   2895     result->mMetadata.unlock(meta);
   2896 
   2897     if (result->mMetadata.update(ANDROID_REQUEST_FRAME_COUNT,
   2898             (int32_t*)&frameNumber, 1) != OK) {
   2899         SET_ERR("Failed to set frame number %d in metadata", frameNumber);
   2900         return;
   2901     }
   2902 
   2903     if (result->mMetadata.update(ANDROID_REQUEST_ID, &result->mResultExtras.requestId, 1) != OK) {
   2904         SET_ERR("Failed to set request ID in metadata for frame %d", frameNumber);
   2905         return;
   2906     }
   2907 
   2908     // Valid result, insert into queue
   2909     List<CaptureResult>::iterator queuedResult =
   2910             mResultQueue.insert(mResultQueue.end(), CaptureResult(*result));
   2911     ALOGVV("%s: result requestId = %" PRId32 ", frameNumber = %" PRId64
   2912            ", burstId = %" PRId32, __FUNCTION__,
   2913            queuedResult->mResultExtras.requestId,
   2914            queuedResult->mResultExtras.frameNumber,
   2915            queuedResult->mResultExtras.burstId);
   2916 
   2917     mResultSignal.signal();
   2918 }
   2919 
   2920 
   2921 void Camera3Device::sendPartialCaptureResult(const camera_metadata_t * partialResult,
   2922         const CaptureResultExtras &resultExtras, uint32_t frameNumber) {
   2923     ATRACE_CALL();
   2924     Mutex::Autolock l(mOutputLock);
   2925 
   2926     CaptureResult captureResult;
   2927     captureResult.mResultExtras = resultExtras;
   2928     captureResult.mMetadata = partialResult;
   2929 
   2930     insertResultLocked(&captureResult, frameNumber);
   2931 }
   2932 
   2933 
   2934 void Camera3Device::sendCaptureResult(CameraMetadata &pendingMetadata,
   2935         CaptureResultExtras &resultExtras,
   2936         CameraMetadata &collectedPartialResult,
   2937         uint32_t frameNumber,
   2938         bool reprocess,
   2939         const std::vector<PhysicalCaptureResultInfo>& physicalMetadatas) {
   2940     ATRACE_CALL();
   2941     if (pendingMetadata.isEmpty())
   2942         return;
   2943 
   2944     Mutex::Autolock l(mOutputLock);
   2945 
   2946     // TODO: need to track errors for tighter bounds on expected frame number
   2947     if (reprocess) {
   2948         if (frameNumber < mNextReprocessResultFrameNumber) {
   2949             SET_ERR("Out-of-order reprocess capture result metadata submitted! "
   2950                 "(got frame number %d, expecting %d)",
   2951                 frameNumber, mNextReprocessResultFrameNumber);
   2952             return;
   2953         }
   2954         mNextReprocessResultFrameNumber = frameNumber + 1;
   2955     } else {
   2956         if (frameNumber < mNextResultFrameNumber) {
   2957             SET_ERR("Out-of-order capture result metadata submitted! "
   2958                     "(got frame number %d, expecting %d)",
   2959                     frameNumber, mNextResultFrameNumber);
   2960             return;
   2961         }
   2962         mNextResultFrameNumber = frameNumber + 1;
   2963     }
   2964 
   2965     CaptureResult captureResult;
   2966     captureResult.mResultExtras = resultExtras;
   2967     captureResult.mMetadata = pendingMetadata;
   2968     captureResult.mPhysicalMetadatas = physicalMetadatas;
   2969 
   2970     // Append any previous partials to form a complete result
   2971     if (mUsePartialResult && !collectedPartialResult.isEmpty()) {
   2972         captureResult.mMetadata.append(collectedPartialResult);
   2973     }
   2974 
   2975     captureResult.mMetadata.sort();
   2976 
   2977     // Check that there's a timestamp in the result metadata
   2978     camera_metadata_entry timestamp = captureResult.mMetadata.find(ANDROID_SENSOR_TIMESTAMP);
   2979     if (timestamp.count == 0) {
   2980         SET_ERR("No timestamp provided by HAL for frame %d!",
   2981                 frameNumber);
   2982         return;
   2983     }
   2984     for (auto& physicalMetadata : captureResult.mPhysicalMetadatas) {
   2985         camera_metadata_entry timestamp =
   2986                 physicalMetadata.mPhysicalCameraMetadata.find(ANDROID_SENSOR_TIMESTAMP);
   2987         if (timestamp.count == 0) {
   2988             SET_ERR("No timestamp provided by HAL for physical camera %s frame %d!",
   2989                     String8(physicalMetadata.mPhysicalCameraId).c_str(), frameNumber);
   2990             return;
   2991         }
   2992     }
   2993 
   2994     // Fix up some result metadata to account for HAL-level distortion correction
   2995     status_t res = mDistortionMapper.correctCaptureResult(&captureResult.mMetadata);
   2996     if (res != OK) {
   2997         SET_ERR("Unable to correct capture result metadata for frame %d: %s (%d)",
   2998                 frameNumber, strerror(res), res);
   2999         return;
   3000     }
   3001 
   3002     mTagMonitor.monitorMetadata(TagMonitor::RESULT,
   3003             frameNumber, timestamp.data.i64[0], captureResult.mMetadata);
   3004 
   3005     insertResultLocked(&captureResult, frameNumber);
   3006 }
   3007 
   3008 /**
   3009  * Camera HAL device callback methods
   3010  */
   3011 
   3012 void Camera3Device::processCaptureResult(const camera3_capture_result *result) {
   3013     ATRACE_CALL();
   3014 
   3015     status_t res;
   3016 
   3017     uint32_t frameNumber = result->frame_number;
   3018     if (result->result == NULL && result->num_output_buffers == 0 &&
   3019             result->input_buffer == NULL) {
   3020         SET_ERR("No result data provided by HAL for frame %d",
   3021                 frameNumber);
   3022         return;
   3023     }
   3024 
   3025     if (!mUsePartialResult &&
   3026             result->result != NULL &&
   3027             result->partial_result != 1) {
   3028         SET_ERR("Result is malformed for frame %d: partial_result %u must be 1"
   3029                 " if partial result is not supported",
   3030                 frameNumber, result->partial_result);
   3031         return;
   3032     }
   3033 
   3034     bool isPartialResult = false;
   3035     CameraMetadata collectedPartialResult;
   3036     bool hasInputBufferInRequest = false;
   3037 
   3038     // Get shutter timestamp and resultExtras from list of in-flight requests,
   3039     // where it was added by the shutter notification for this frame. If the
   3040     // shutter timestamp isn't received yet, append the output buffers to the
   3041     // in-flight request and they will be returned when the shutter timestamp
   3042     // arrives. Update the in-flight status and remove the in-flight entry if
   3043     // all result data and shutter timestamp have been received.
   3044     nsecs_t shutterTimestamp = 0;
   3045 
   3046     {
   3047         Mutex::Autolock l(mInFlightLock);
   3048         ssize_t idx = mInFlightMap.indexOfKey(frameNumber);
   3049         if (idx == NAME_NOT_FOUND) {
   3050             SET_ERR("Unknown frame number for capture result: %d",
   3051                     frameNumber);
   3052             return;
   3053         }
   3054         InFlightRequest &request = mInFlightMap.editValueAt(idx);
   3055         ALOGVV("%s: got InFlightRequest requestId = %" PRId32
   3056                 ", frameNumber = %" PRId64 ", burstId = %" PRId32
   3057                 ", partialResultCount = %d, hasCallback = %d",
   3058                 __FUNCTION__, request.resultExtras.requestId,
   3059                 request.resultExtras.frameNumber, request.resultExtras.burstId,
   3060                 result->partial_result, request.hasCallback);
   3061         // Always update the partial count to the latest one if it's not 0
   3062         // (buffers only). When framework aggregates adjacent partial results
   3063         // into one, the latest partial count will be used.
   3064         if (result->partial_result != 0)
   3065             request.resultExtras.partialResultCount = result->partial_result;
   3066 
   3067         // Check if this result carries only partial metadata
   3068         if (mUsePartialResult && result->result != NULL) {
   3069             if (result->partial_result > mNumPartialResults || result->partial_result < 1) {
   3070                 SET_ERR("Result is malformed for frame %d: partial_result %u must be  in"
   3071                         " the range of [1, %d] when metadata is included in the result",
   3072                         frameNumber, result->partial_result, mNumPartialResults);
   3073                 return;
   3074             }
   3075             isPartialResult = (result->partial_result < mNumPartialResults);
   3076             if (isPartialResult && result->num_physcam_metadata) {
   3077                 SET_ERR("Result is malformed for frame %d: partial_result not allowed for"
   3078                         " physical camera result", frameNumber);
   3079                 return;
   3080             }
   3081             if (isPartialResult) {
   3082                 request.collectedPartialResult.append(result->result);
   3083             }
   3084 
   3085             if (isPartialResult && request.hasCallback) {
   3086                 // Send partial capture result
   3087                 sendPartialCaptureResult(result->result, request.resultExtras,
   3088                         frameNumber);
   3089             }
   3090         }
   3091 
   3092         shutterTimestamp = request.shutterTimestamp;
   3093         hasInputBufferInRequest = request.hasInputBuffer;
   3094 
   3095         // Did we get the (final) result metadata for this capture?
   3096         if (result->result != NULL && !isPartialResult) {
   3097             if (request.physicalCameraIds.size() != result->num_physcam_metadata) {
   3098                 SET_ERR("Requested physical Camera Ids %d not equal to number of metadata %d",
   3099                         request.physicalCameraIds.size(), result->num_physcam_metadata);
   3100                 return;
   3101             }
   3102             if (request.haveResultMetadata) {
   3103                 SET_ERR("Called multiple times with metadata for frame %d",
   3104                         frameNumber);
   3105                 return;
   3106             }
   3107             for (uint32_t i = 0; i < result->num_physcam_metadata; i++) {
   3108                 String8 physicalId(result->physcam_ids[i]);
   3109                 std::set<String8>::iterator cameraIdIter =
   3110                         request.physicalCameraIds.find(physicalId);
   3111                 if (cameraIdIter != request.physicalCameraIds.end()) {
   3112                     request.physicalCameraIds.erase(cameraIdIter);
   3113                 } else {
   3114                     SET_ERR("Total result for frame %d has already returned for camera %s",
   3115                             frameNumber, physicalId.c_str());
   3116                     return;
   3117                 }
   3118             }
   3119             if (mUsePartialResult &&
   3120                     !request.collectedPartialResult.isEmpty()) {
   3121                 collectedPartialResult.acquire(
   3122                     request.collectedPartialResult);
   3123             }
   3124             request.haveResultMetadata = true;
   3125         }
   3126 
   3127         uint32_t numBuffersReturned = result->num_output_buffers;
   3128         if (result->input_buffer != NULL) {
   3129             if (hasInputBufferInRequest) {
   3130                 numBuffersReturned += 1;
   3131             } else {
   3132                 ALOGW("%s: Input buffer should be NULL if there is no input"
   3133                         " buffer sent in the request",
   3134                         __FUNCTION__);
   3135             }
   3136         }
   3137         request.numBuffersLeft -= numBuffersReturned;
   3138         if (request.numBuffersLeft < 0) {
   3139             SET_ERR("Too many buffers returned for frame %d",
   3140                     frameNumber);
   3141             return;
   3142         }
   3143 
   3144         camera_metadata_ro_entry_t entry;
   3145         res = find_camera_metadata_ro_entry(result->result,
   3146                 ANDROID_SENSOR_TIMESTAMP, &entry);
   3147         if (res == OK && entry.count == 1) {
   3148             request.sensorTimestamp = entry.data.i64[0];
   3149         }
   3150 
   3151         // If shutter event isn't received yet, append the output buffers to
   3152         // the in-flight request. Otherwise, return the output buffers to
   3153         // streams.
   3154         if (shutterTimestamp == 0) {
   3155             request.pendingOutputBuffers.appendArray(result->output_buffers,
   3156                 result->num_output_buffers);
   3157         } else {
   3158             returnOutputBuffers(result->output_buffers,
   3159                 result->num_output_buffers, shutterTimestamp);
   3160         }
   3161 
   3162         if (result->result != NULL && !isPartialResult) {
   3163             for (uint32_t i = 0; i < result->num_physcam_metadata; i++) {
   3164                 CameraMetadata physicalMetadata;
   3165                 physicalMetadata.append(result->physcam_metadata[i]);
   3166                 request.physicalMetadatas.push_back({String16(result->physcam_ids[i]),
   3167                         physicalMetadata});
   3168             }
   3169             if (shutterTimestamp == 0) {
   3170                 request.pendingMetadata = result->result;
   3171                 request.collectedPartialResult = collectedPartialResult;
   3172            } else if (request.hasCallback) {
   3173                 CameraMetadata metadata;
   3174                 metadata = result->result;
   3175                 sendCaptureResult(metadata, request.resultExtras,
   3176                     collectedPartialResult, frameNumber,
   3177                     hasInputBufferInRequest, request.physicalMetadatas);
   3178             }
   3179         }
   3180 
   3181         removeInFlightRequestIfReadyLocked(idx);
   3182     } // scope for mInFlightLock
   3183 
   3184     if (result->input_buffer != NULL) {
   3185         if (hasInputBufferInRequest) {
   3186             Camera3Stream *stream =
   3187                 Camera3Stream::cast(result->input_buffer->stream);
   3188             res = stream->returnInputBuffer(*(result->input_buffer));
   3189             // Note: stream may be deallocated at this point, if this buffer was the
   3190             // last reference to it.
   3191             if (res != OK) {
   3192                 ALOGE("%s: RequestThread: Can't return input buffer for frame %d to"
   3193                       "  its stream:%s (%d)",  __FUNCTION__,
   3194                       frameNumber, strerror(-res), res);
   3195             }
   3196         } else {
   3197             ALOGW("%s: Input buffer should be NULL if there is no input"
   3198                     " buffer sent in the request, skipping input buffer return.",
   3199                     __FUNCTION__);
   3200         }
   3201     }
   3202 }
   3203 
   3204 void Camera3Device::notify(const camera3_notify_msg *msg) {
   3205     ATRACE_CALL();
   3206     sp<NotificationListener> listener;
   3207     {
   3208         Mutex::Autolock l(mOutputLock);
   3209         listener = mListener.promote();
   3210     }
   3211 
   3212     if (msg == NULL) {
   3213         SET_ERR("HAL sent NULL notify message!");
   3214         return;
   3215     }
   3216 
   3217     switch (msg->type) {
   3218         case CAMERA3_MSG_ERROR: {
   3219             notifyError(msg->message.error, listener);
   3220             break;
   3221         }
   3222         case CAMERA3_MSG_SHUTTER: {
   3223             notifyShutter(msg->message.shutter, listener);
   3224             break;
   3225         }
   3226         default:
   3227             SET_ERR("Unknown notify message from HAL: %d",
   3228                     msg->type);
   3229     }
   3230 }
   3231 
   3232 void Camera3Device::notifyError(const camera3_error_msg_t &msg,
   3233         sp<NotificationListener> listener) {
   3234     ATRACE_CALL();
   3235     // Map camera HAL error codes to ICameraDeviceCallback error codes
   3236     // Index into this with the HAL error code
   3237     static const int32_t halErrorMap[CAMERA3_MSG_NUM_ERRORS] = {
   3238         // 0 = Unused error code
   3239         hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_INVALID_ERROR,
   3240         // 1 = CAMERA3_MSG_ERROR_DEVICE
   3241         hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE,
   3242         // 2 = CAMERA3_MSG_ERROR_REQUEST
   3243         hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST,
   3244         // 3 = CAMERA3_MSG_ERROR_RESULT
   3245         hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT,
   3246         // 4 = CAMERA3_MSG_ERROR_BUFFER
   3247         hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER
   3248     };
   3249 
   3250     int32_t errorCode =
   3251             ((msg.error_code >= 0) &&
   3252                     (msg.error_code < CAMERA3_MSG_NUM_ERRORS)) ?
   3253             halErrorMap[msg.error_code] :
   3254             hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_INVALID_ERROR;
   3255 
   3256     int streamId = 0;
   3257     if (msg.error_stream != NULL) {
   3258         Camera3Stream *stream =
   3259                 Camera3Stream::cast(msg.error_stream);
   3260         streamId = stream->getId();
   3261     }
   3262     ALOGV("Camera %s: %s: HAL error, frame %d, stream %d: %d",
   3263             mId.string(), __FUNCTION__, msg.frame_number,
   3264             streamId, msg.error_code);
   3265 
   3266     CaptureResultExtras resultExtras;
   3267     switch (errorCode) {
   3268         case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE:
   3269             // SET_ERR calls notifyError
   3270             SET_ERR("Camera HAL reported serious device error");
   3271             break;
   3272         case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST:
   3273         case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT:
   3274         case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER:
   3275             {
   3276                 Mutex::Autolock l(mInFlightLock);
   3277                 ssize_t idx = mInFlightMap.indexOfKey(msg.frame_number);
   3278                 if (idx >= 0) {
   3279                     InFlightRequest &r = mInFlightMap.editValueAt(idx);
   3280                     r.requestStatus = msg.error_code;
   3281                     resultExtras = r.resultExtras;
   3282                     if (hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT == errorCode
   3283                             ||  hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST ==
   3284                             errorCode) {
   3285                         r.skipResultMetadata = true;
   3286                     }
   3287                     if (hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT ==
   3288                             errorCode) {
   3289                         // In case of missing result check whether the buffers
   3290                         // returned. If they returned, then remove inflight
   3291                         // request.
   3292                         removeInFlightRequestIfReadyLocked(idx);
   3293                     }
   3294                 } else {
   3295                     resultExtras.frameNumber = msg.frame_number;
   3296                     ALOGE("Camera %s: %s: cannot find in-flight request on "
   3297                             "frame %" PRId64 " error", mId.string(), __FUNCTION__,
   3298                             resultExtras.frameNumber);
   3299                 }
   3300             }
   3301             resultExtras.errorStreamId = streamId;
   3302             if (listener != NULL) {
   3303                 listener->notifyError(errorCode, resultExtras);
   3304             } else {
   3305                 ALOGE("Camera %s: %s: no listener available", mId.string(), __FUNCTION__);
   3306             }
   3307             break;
   3308         default:
   3309             // SET_ERR calls notifyError
   3310             SET_ERR("Unknown error message from HAL: %d", msg.error_code);
   3311             break;
   3312     }
   3313 }
   3314 
   3315 void Camera3Device::notifyShutter(const camera3_shutter_msg_t &msg,
   3316         sp<NotificationListener> listener) {
   3317     ATRACE_CALL();
   3318     ssize_t idx;
   3319 
   3320     // Set timestamp for the request in the in-flight tracking
   3321     // and get the request ID to send upstream
   3322     {
   3323         Mutex::Autolock l(mInFlightLock);
   3324         idx = mInFlightMap.indexOfKey(msg.frame_number);
   3325         if (idx >= 0) {
   3326             InFlightRequest &r = mInFlightMap.editValueAt(idx);
   3327 
   3328             // Verify ordering of shutter notifications
   3329             {
   3330                 Mutex::Autolock l(mOutputLock);
   3331                 // TODO: need to track errors for tighter bounds on expected frame number.
   3332                 if (r.hasInputBuffer) {
   3333                     if (msg.frame_number < mNextReprocessShutterFrameNumber) {
   3334                         SET_ERR("Shutter notification out-of-order. Expected "
   3335                                 "notification for frame %d, got frame %d",
   3336                                 mNextReprocessShutterFrameNumber, msg.frame_number);
   3337                         return;
   3338                     }
   3339                     mNextReprocessShutterFrameNumber = msg.frame_number + 1;
   3340                 } else {
   3341                     if (msg.frame_number < mNextShutterFrameNumber) {
   3342                         SET_ERR("Shutter notification out-of-order. Expected "
   3343                                 "notification for frame %d, got frame %d",
   3344                                 mNextShutterFrameNumber, msg.frame_number);
   3345                         return;
   3346                     }
   3347                     mNextShutterFrameNumber = msg.frame_number + 1;
   3348                 }
   3349             }
   3350 
   3351             r.shutterTimestamp = msg.timestamp;
   3352             if (r.hasCallback) {
   3353                 ALOGVV("Camera %s: %s: Shutter fired for frame %d (id %d) at %" PRId64,
   3354                     mId.string(), __FUNCTION__,
   3355                     msg.frame_number, r.resultExtras.requestId, msg.timestamp);
   3356                 // Call listener, if any
   3357                 if (listener != NULL) {
   3358                     listener->notifyShutter(r.resultExtras, msg.timestamp);
   3359                 }
   3360                 // send pending result and buffers
   3361                 sendCaptureResult(r.pendingMetadata, r.resultExtras,
   3362                     r.collectedPartialResult, msg.frame_number,
   3363                     r.hasInputBuffer, r.physicalMetadatas);
   3364             }
   3365             returnOutputBuffers(r.pendingOutputBuffers.array(),
   3366                 r.pendingOutputBuffers.size(), r.shutterTimestamp);
   3367             r.pendingOutputBuffers.clear();
   3368 
   3369             removeInFlightRequestIfReadyLocked(idx);
   3370         }
   3371     }
   3372     if (idx < 0) {
   3373         SET_ERR("Shutter notification for non-existent frame number %d",
   3374                 msg.frame_number);
   3375     }
   3376 }
   3377 
   3378 CameraMetadata Camera3Device::getLatestRequestLocked() {
   3379     ALOGV("%s", __FUNCTION__);
   3380 
   3381     CameraMetadata retVal;
   3382 
   3383     if (mRequestThread != NULL) {
   3384         retVal = mRequestThread->getLatestRequest();
   3385     }
   3386 
   3387     return retVal;
   3388 }
   3389 
   3390 
   3391 void Camera3Device::monitorMetadata(TagMonitor::eventSource source,
   3392         int64_t frameNumber, nsecs_t timestamp, const CameraMetadata& metadata) {
   3393     mTagMonitor.monitorMetadata(source, frameNumber, timestamp, metadata);
   3394 }
   3395 
   3396 /**
   3397  * HalInterface inner class methods
   3398  */
   3399 
   3400 Camera3Device::HalInterface::HalInterface(
   3401             sp<ICameraDeviceSession> &session,
   3402             std::shared_ptr<RequestMetadataQueue> queue) :
   3403         mHidlSession(session),
   3404         mRequestMetadataQueue(queue) {
   3405     // Check with hardware service manager if we can downcast these interfaces
   3406     // Somewhat expensive, so cache the results at startup
   3407     auto castResult_3_4 = device::V3_4::ICameraDeviceSession::castFrom(mHidlSession);
   3408     if (castResult_3_4.isOk()) {
   3409         mHidlSession_3_4 = castResult_3_4;
   3410     }
   3411     auto castResult_3_3 = device::V3_3::ICameraDeviceSession::castFrom(mHidlSession);
   3412     if (castResult_3_3.isOk()) {
   3413         mHidlSession_3_3 = castResult_3_3;
   3414     }
   3415 }
   3416 
   3417 Camera3Device::HalInterface::HalInterface() {}
   3418 
   3419 Camera3Device::HalInterface::HalInterface(const HalInterface& other) :
   3420         mHidlSession(other.mHidlSession),
   3421         mRequestMetadataQueue(other.mRequestMetadataQueue) {}
   3422 
   3423 bool Camera3Device::HalInterface::valid() {
   3424     return (mHidlSession != nullptr);
   3425 }
   3426 
   3427 void Camera3Device::HalInterface::clear() {
   3428     mHidlSession_3_4.clear();
   3429     mHidlSession_3_3.clear();
   3430     mHidlSession.clear();
   3431 }
   3432 
   3433 bool Camera3Device::HalInterface::supportBatchRequest() {
   3434     return mHidlSession != nullptr;
   3435 }
   3436 
   3437 status_t Camera3Device::HalInterface::constructDefaultRequestSettings(
   3438         camera3_request_template_t templateId,
   3439         /*out*/ camera_metadata_t **requestTemplate) {
   3440     ATRACE_NAME("CameraHal::constructDefaultRequestSettings");
   3441     if (!valid()) return INVALID_OPERATION;
   3442     status_t res = OK;
   3443 
   3444     common::V1_0::Status status;
   3445 
   3446     auto requestCallback = [&status, &requestTemplate]
   3447             (common::V1_0::Status s, const device::V3_2::CameraMetadata& request) {
   3448             status = s;
   3449             if (status == common::V1_0::Status::OK) {
   3450                 const camera_metadata *r =
   3451                         reinterpret_cast<const camera_metadata_t*>(request.data());
   3452                 size_t expectedSize = request.size();
   3453                 int ret = validate_camera_metadata_structure(r, &expectedSize);
   3454                 if (ret == OK || ret == CAMERA_METADATA_VALIDATION_SHIFTED) {
   3455                     *requestTemplate = clone_camera_metadata(r);
   3456                     if (*requestTemplate == nullptr) {
   3457                         ALOGE("%s: Unable to clone camera metadata received from HAL",
   3458                                 __FUNCTION__);
   3459                         status = common::V1_0::Status::INTERNAL_ERROR;
   3460                     }
   3461                 } else {
   3462                     ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__);
   3463                     status = common::V1_0::Status::INTERNAL_ERROR;
   3464                 }
   3465             }
   3466         };
   3467     hardware::Return<void> err;
   3468     RequestTemplate id;
   3469     switch (templateId) {
   3470         case CAMERA3_TEMPLATE_PREVIEW:
   3471             id = RequestTemplate::PREVIEW;
   3472             break;
   3473         case CAMERA3_TEMPLATE_STILL_CAPTURE:
   3474             id = RequestTemplate::STILL_CAPTURE;
   3475             break;
   3476         case CAMERA3_TEMPLATE_VIDEO_RECORD:
   3477             id = RequestTemplate::VIDEO_RECORD;
   3478             break;
   3479         case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
   3480             id = RequestTemplate::VIDEO_SNAPSHOT;
   3481             break;
   3482         case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
   3483             id = RequestTemplate::ZERO_SHUTTER_LAG;
   3484             break;
   3485         case CAMERA3_TEMPLATE_MANUAL:
   3486             id = RequestTemplate::MANUAL;
   3487             break;
   3488         default:
   3489             // Unknown template ID, or this HAL is too old to support it
   3490             return BAD_VALUE;
   3491     }
   3492     err = mHidlSession->constructDefaultRequestSettings(id, requestCallback);
   3493 
   3494     if (!err.isOk()) {
   3495         ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
   3496         res = DEAD_OBJECT;
   3497     } else {
   3498         res = CameraProviderManager::mapToStatusT(status);
   3499     }
   3500 
   3501     return res;
   3502 }
   3503 
   3504 status_t Camera3Device::HalInterface::configureStreams(const camera_metadata_t *sessionParams,
   3505         camera3_stream_configuration *config, const std::vector<uint32_t>& bufferSizes) {
   3506     ATRACE_NAME("CameraHal::configureStreams");
   3507     if (!valid()) return INVALID_OPERATION;
   3508     status_t res = OK;
   3509 
   3510     // Convert stream config to HIDL
   3511     std::set<int> activeStreams;
   3512     device::V3_2::StreamConfiguration requestedConfiguration3_2;
   3513     device::V3_4::StreamConfiguration requestedConfiguration3_4;
   3514     requestedConfiguration3_2.streams.resize(config->num_streams);
   3515     requestedConfiguration3_4.streams.resize(config->num_streams);
   3516     for (size_t i = 0; i < config->num_streams; i++) {
   3517         device::V3_2::Stream &dst3_2 = requestedConfiguration3_2.streams[i];
   3518         device::V3_4::Stream &dst3_4 = requestedConfiguration3_4.streams[i];
   3519         camera3_stream_t *src = config->streams[i];
   3520 
   3521         Camera3Stream* cam3stream = Camera3Stream::cast(src);
   3522         cam3stream->setBufferFreedListener(this);
   3523         int streamId = cam3stream->getId();
   3524         StreamType streamType;
   3525         switch (src->stream_type) {
   3526             case CAMERA3_STREAM_OUTPUT:
   3527                 streamType = StreamType::OUTPUT;
   3528                 break;
   3529             case CAMERA3_STREAM_INPUT:
   3530                 streamType = StreamType::INPUT;
   3531                 break;
   3532             default:
   3533                 ALOGE("%s: Stream %d: Unsupported stream type %d",
   3534                         __FUNCTION__, streamId, config->streams[i]->stream_type);
   3535                 return BAD_VALUE;
   3536         }
   3537         dst3_2.id = streamId;
   3538         dst3_2.streamType = streamType;
   3539         dst3_2.width = src->width;
   3540         dst3_2.height = src->height;
   3541         dst3_2.format = mapToPixelFormat(src->format);
   3542         dst3_2.usage = mapToConsumerUsage(cam3stream->getUsage());
   3543         dst3_2.dataSpace = mapToHidlDataspace(src->data_space);
   3544         dst3_2.rotation = mapToStreamRotation((camera3_stream_rotation_t) src->rotation);
   3545         dst3_4.v3_2 = dst3_2;
   3546         dst3_4.bufferSize = bufferSizes[i];
   3547         if (src->physical_camera_id != nullptr) {
   3548             dst3_4.physicalCameraId = src->physical_camera_id;
   3549         }
   3550 
   3551         activeStreams.insert(streamId);
   3552         // Create Buffer ID map if necessary
   3553         if (mBufferIdMaps.count(streamId) == 0) {
   3554             mBufferIdMaps.emplace(streamId, BufferIdMap{});
   3555         }
   3556     }
   3557     // remove BufferIdMap for deleted streams
   3558     for(auto it = mBufferIdMaps.begin(); it != mBufferIdMaps.end();) {
   3559         int streamId = it->first;
   3560         bool active = activeStreams.count(streamId) > 0;
   3561         if (!active) {
   3562             it = mBufferIdMaps.erase(it);
   3563         } else {
   3564             ++it;
   3565         }
   3566     }
   3567 
   3568     StreamConfigurationMode operationMode;
   3569     res = mapToStreamConfigurationMode(
   3570             (camera3_stream_configuration_mode_t) config->operation_mode,
   3571             /*out*/ &operationMode);
   3572     if (res != OK) {
   3573         return res;
   3574     }
   3575     requestedConfiguration3_2.operationMode = operationMode;
   3576     requestedConfiguration3_4.operationMode = operationMode;
   3577     requestedConfiguration3_4.sessionParams.setToExternal(
   3578             reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(sessionParams)),
   3579             get_camera_metadata_size(sessionParams));
   3580 
   3581     // Invoke configureStreams
   3582     device::V3_3::HalStreamConfiguration finalConfiguration;
   3583     common::V1_0::Status status;
   3584 
   3585     // See if we have v3.4 or v3.3 HAL
   3586     if (mHidlSession_3_4 != nullptr) {
   3587         // We do; use v3.4 for the call
   3588         ALOGV("%s: v3.4 device found", __FUNCTION__);
   3589         device::V3_4::HalStreamConfiguration finalConfiguration3_4;
   3590         auto err = mHidlSession_3_4->configureStreams_3_4(requestedConfiguration3_4,
   3591             [&status, &finalConfiguration3_4]
   3592             (common::V1_0::Status s, const device::V3_4::HalStreamConfiguration& halConfiguration) {
   3593                 finalConfiguration3_4 = halConfiguration;
   3594                 status = s;
   3595             });
   3596         if (!err.isOk()) {
   3597             ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
   3598             return DEAD_OBJECT;
   3599         }
   3600         finalConfiguration.streams.resize(finalConfiguration3_4.streams.size());
   3601         for (size_t i = 0; i < finalConfiguration3_4.streams.size(); i++) {
   3602             finalConfiguration.streams[i] = finalConfiguration3_4.streams[i].v3_3;
   3603         }
   3604     } else if (mHidlSession_3_3 != nullptr) {
   3605         // We do; use v3.3 for the call
   3606         ALOGV("%s: v3.3 device found", __FUNCTION__);
   3607         auto err = mHidlSession_3_3->configureStreams_3_3(requestedConfiguration3_2,
   3608             [&status, &finalConfiguration]
   3609             (common::V1_0::Status s, const device::V3_3::HalStreamConfiguration& halConfiguration) {
   3610                 finalConfiguration = halConfiguration;
   3611                 status = s;
   3612             });
   3613         if (!err.isOk()) {
   3614             ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
   3615             return DEAD_OBJECT;
   3616         }
   3617     } else {
   3618         // We don't; use v3.2 call and construct a v3.3 HalStreamConfiguration
   3619         ALOGV("%s: v3.2 device found", __FUNCTION__);
   3620         HalStreamConfiguration finalConfiguration_3_2;
   3621         auto err = mHidlSession->configureStreams(requestedConfiguration3_2,
   3622                 [&status, &finalConfiguration_3_2]
   3623                 (common::V1_0::Status s, const HalStreamConfiguration& halConfiguration) {
   3624                     finalConfiguration_3_2 = halConfiguration;
   3625                     status = s;
   3626                 });
   3627         if (!err.isOk()) {
   3628             ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
   3629             return DEAD_OBJECT;
   3630         }
   3631         finalConfiguration.streams.resize(finalConfiguration_3_2.streams.size());
   3632         for (size_t i = 0; i < finalConfiguration_3_2.streams.size(); i++) {
   3633             finalConfiguration.streams[i].v3_2 = finalConfiguration_3_2.streams[i];
   3634             finalConfiguration.streams[i].overrideDataSpace =
   3635                     requestedConfiguration3_2.streams[i].dataSpace;
   3636         }
   3637     }
   3638 
   3639     if (status != common::V1_0::Status::OK ) {
   3640         return CameraProviderManager::mapToStatusT(status);
   3641     }
   3642 
   3643     // And convert output stream configuration from HIDL
   3644 
   3645     for (size_t i = 0; i < config->num_streams; i++) {
   3646         camera3_stream_t *dst = config->streams[i];
   3647         int streamId = Camera3Stream::cast(dst)->getId();
   3648 
   3649         // Start scan at i, with the assumption that the stream order matches
   3650         size_t realIdx = i;
   3651         bool found = false;
   3652         for (size_t idx = 0; idx < finalConfiguration.streams.size(); idx++) {
   3653             if (finalConfiguration.streams[realIdx].v3_2.id == streamId) {
   3654                 found = true;
   3655                 break;
   3656             }
   3657             realIdx = (realIdx >= finalConfiguration.streams.size()) ? 0 : realIdx + 1;
   3658         }
   3659         if (!found) {
   3660             ALOGE("%s: Stream %d not found in stream configuration response from HAL",
   3661                     __FUNCTION__, streamId);
   3662             return INVALID_OPERATION;
   3663         }
   3664         device::V3_3::HalStream &src = finalConfiguration.streams[realIdx];
   3665 
   3666         Camera3Stream* dstStream = Camera3Stream::cast(dst);
   3667         dstStream->setFormatOverride(false);
   3668         dstStream->setDataSpaceOverride(false);
   3669         int overrideFormat = mapToFrameworkFormat(src.v3_2.overrideFormat);
   3670         android_dataspace overrideDataSpace = mapToFrameworkDataspace(src.overrideDataSpace);
   3671 
   3672         if (dst->format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
   3673             if (dst->format != overrideFormat) {
   3674                 ALOGE("%s: Stream %d: Format override not allowed for format 0x%x", __FUNCTION__,
   3675                         streamId, dst->format);
   3676             }
   3677             if (dst->data_space != overrideDataSpace) {
   3678                 ALOGE("%s: Stream %d: DataSpace override not allowed for format 0x%x", __FUNCTION__,
   3679                         streamId, dst->format);
   3680             }
   3681         } else {
   3682             dstStream->setFormatOverride((dst->format != overrideFormat) ? true : false);
   3683             dstStream->setDataSpaceOverride((dst->data_space != overrideDataSpace) ? true : false);
   3684 
   3685             // Override allowed with IMPLEMENTATION_DEFINED
   3686             dst->format = overrideFormat;
   3687             dst->data_space = overrideDataSpace;
   3688         }
   3689 
   3690         if (dst->stream_type == CAMERA3_STREAM_INPUT) {
   3691             if (src.v3_2.producerUsage != 0) {
   3692                 ALOGE("%s: Stream %d: INPUT streams must have 0 for producer usage",
   3693                         __FUNCTION__, streamId);
   3694                 return INVALID_OPERATION;
   3695             }
   3696             dstStream->setUsage(
   3697                     mapConsumerToFrameworkUsage(src.v3_2.consumerUsage));
   3698         } else {
   3699             // OUTPUT
   3700             if (src.v3_2.consumerUsage != 0) {
   3701                 ALOGE("%s: Stream %d: OUTPUT streams must have 0 for consumer usage",
   3702                         __FUNCTION__, streamId);
   3703                 return INVALID_OPERATION;
   3704             }
   3705             dstStream->setUsage(
   3706                     mapProducerToFrameworkUsage(src.v3_2.producerUsage));
   3707         }
   3708         dst->max_buffers = src.v3_2.maxBuffers;
   3709     }
   3710 
   3711     return res;
   3712 }
   3713 
   3714 void Camera3Device::HalInterface::wrapAsHidlRequest(camera3_capture_request_t* request,
   3715         /*out*/device::V3_2::CaptureRequest* captureRequest,
   3716         /*out*/std::vector<native_handle_t*>* handlesCreated) {
   3717     ATRACE_CALL();
   3718     if (captureRequest == nullptr || handlesCreated == nullptr) {
   3719         ALOGE("%s: captureRequest (%p) and handlesCreated (%p) must not be null",
   3720                 __FUNCTION__, captureRequest, handlesCreated);
   3721         return;
   3722     }
   3723 
   3724     captureRequest->frameNumber = request->frame_number;
   3725 
   3726     captureRequest->fmqSettingsSize = 0;
   3727 
   3728     {
   3729         std::lock_guard<std::mutex> lock(mInflightLock);
   3730         if (request->input_buffer != nullptr) {
   3731             int32_t streamId = Camera3Stream::cast(request->input_buffer->stream)->getId();
   3732             buffer_handle_t buf = *(request->input_buffer->buffer);
   3733             auto pair = getBufferId(buf, streamId);
   3734             bool isNewBuffer = pair.first;
   3735             uint64_t bufferId = pair.second;
   3736             captureRequest->inputBuffer.streamId = streamId;
   3737             captureRequest->inputBuffer.bufferId = bufferId;
   3738             captureRequest->inputBuffer.buffer = (isNewBuffer) ? buf : nullptr;
   3739             captureRequest->inputBuffer.status = BufferStatus::OK;
   3740             native_handle_t *acquireFence = nullptr;
   3741             if (request->input_buffer->acquire_fence != -1) {
   3742                 acquireFence = native_handle_create(1,0);
   3743                 acquireFence->data[0] = request->input_buffer->acquire_fence;
   3744                 handlesCreated->push_back(acquireFence);
   3745             }
   3746             captureRequest->inputBuffer.acquireFence = acquireFence;
   3747             captureRequest->inputBuffer.releaseFence = nullptr;
   3748 
   3749             pushInflightBufferLocked(captureRequest->frameNumber, streamId,
   3750                     request->input_buffer->buffer,
   3751                     request->input_buffer->acquire_fence);
   3752         } else {
   3753             captureRequest->inputBuffer.streamId = -1;
   3754             captureRequest->inputBuffer.bufferId = BUFFER_ID_NO_BUFFER;
   3755         }
   3756 
   3757         captureRequest->outputBuffers.resize(request->num_output_buffers);
   3758         for (size_t i = 0; i < request->num_output_buffers; i++) {
   3759             const camera3_stream_buffer_t *src = request->output_buffers + i;
   3760             StreamBuffer &dst = captureRequest->outputBuffers[i];
   3761             int32_t streamId = Camera3Stream::cast(src->stream)->getId();
   3762             buffer_handle_t buf = *(src->buffer);
   3763             auto pair = getBufferId(buf, streamId);
   3764             bool isNewBuffer = pair.first;
   3765             dst.streamId = streamId;
   3766             dst.bufferId = pair.second;
   3767             dst.buffer = isNewBuffer ? buf : nullptr;
   3768             dst.status = BufferStatus::OK;
   3769             native_handle_t *acquireFence = nullptr;
   3770             if (src->acquire_fence != -1) {
   3771                 acquireFence = native_handle_create(1,0);
   3772                 acquireFence->data[0] = src->acquire_fence;
   3773                 handlesCreated->push_back(acquireFence);
   3774             }
   3775             dst.acquireFence = acquireFence;
   3776             dst.releaseFence = nullptr;
   3777 
   3778             pushInflightBufferLocked(captureRequest->frameNumber, streamId,
   3779                     src->buffer, src->acquire_fence);
   3780         }
   3781     }
   3782 }
   3783 
   3784 status_t Camera3Device::HalInterface::processBatchCaptureRequests(
   3785         std::vector<camera3_capture_request_t*>& requests,/*out*/uint32_t* numRequestProcessed) {
   3786     ATRACE_NAME("CameraHal::processBatchCaptureRequests");
   3787     if (!valid()) return INVALID_OPERATION;
   3788 
   3789     sp<device::V3_4::ICameraDeviceSession> hidlSession_3_4;
   3790     auto castResult_3_4 = device::V3_4::ICameraDeviceSession::castFrom(mHidlSession);
   3791     if (castResult_3_4.isOk()) {
   3792         hidlSession_3_4 = castResult_3_4;
   3793     }
   3794 
   3795     hardware::hidl_vec<device::V3_2::CaptureRequest> captureRequests;
   3796     hardware::hidl_vec<device::V3_4::CaptureRequest> captureRequests_3_4;
   3797     size_t batchSize = requests.size();
   3798     if (hidlSession_3_4 != nullptr) {
   3799         captureRequests_3_4.resize(batchSize);
   3800     } else {
   3801         captureRequests.resize(batchSize);
   3802     }
   3803     std::vector<native_handle_t*> handlesCreated;
   3804 
   3805     for (size_t i = 0; i < batchSize; i++) {
   3806         if (hidlSession_3_4 != nullptr) {
   3807             wrapAsHidlRequest(requests[i], /*out*/&captureRequests_3_4[i].v3_2,
   3808                     /*out*/&handlesCreated);
   3809         } else {
   3810             wrapAsHidlRequest(requests[i], /*out*/&captureRequests[i], /*out*/&handlesCreated);
   3811         }
   3812     }
   3813 
   3814     std::vector<device::V3_2::BufferCache> cachesToRemove;
   3815     {
   3816         std::lock_guard<std::mutex> lock(mBufferIdMapLock);
   3817         for (auto& pair : mFreedBuffers) {
   3818             // The stream might have been removed since onBufferFreed
   3819             if (mBufferIdMaps.find(pair.first) != mBufferIdMaps.end()) {
   3820                 cachesToRemove.push_back({pair.first, pair.second});
   3821             }
   3822         }
   3823         mFreedBuffers.clear();
   3824     }
   3825 
   3826     common::V1_0::Status status = common::V1_0::Status::INTERNAL_ERROR;
   3827     *numRequestProcessed = 0;
   3828 
   3829     // Write metadata to FMQ.
   3830     for (size_t i = 0; i < batchSize; i++) {
   3831         camera3_capture_request_t* request = requests[i];
   3832         device::V3_2::CaptureRequest* captureRequest;
   3833         if (hidlSession_3_4 != nullptr) {
   3834             captureRequest = &captureRequests_3_4[i].v3_2;
   3835         } else {
   3836             captureRequest = &captureRequests[i];
   3837         }
   3838 
   3839         if (request->settings != nullptr) {
   3840             size_t settingsSize = get_camera_metadata_size(request->settings);
   3841             if (mRequestMetadataQueue != nullptr && mRequestMetadataQueue->write(
   3842                     reinterpret_cast<const uint8_t*>(request->settings), settingsSize)) {
   3843                 captureRequest->settings.resize(0);
   3844                 captureRequest->fmqSettingsSize = settingsSize;
   3845             } else {
   3846                 if (mRequestMetadataQueue != nullptr) {
   3847                     ALOGW("%s: couldn't utilize fmq, fallback to hwbinder", __FUNCTION__);
   3848                 }
   3849                 captureRequest->settings.setToExternal(
   3850                         reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(request->settings)),
   3851                         get_camera_metadata_size(request->settings));
   3852                 captureRequest->fmqSettingsSize = 0u;
   3853             }
   3854         } else {
   3855             // A null request settings maps to a size-0 CameraMetadata
   3856             captureRequest->settings.resize(0);
   3857             captureRequest->fmqSettingsSize = 0u;
   3858         }
   3859 
   3860         if (hidlSession_3_4 != nullptr) {
   3861             captureRequests_3_4[i].physicalCameraSettings.resize(request->num_physcam_settings);
   3862             for (size_t j = 0; j < request->num_physcam_settings; j++) {
   3863                 if (request->physcam_settings != nullptr) {
   3864                     size_t settingsSize = get_camera_metadata_size(request->physcam_settings[j]);
   3865                     if (mRequestMetadataQueue != nullptr && mRequestMetadataQueue->write(
   3866                                 reinterpret_cast<const uint8_t*>(request->physcam_settings[j]),
   3867                                 settingsSize)) {
   3868                         captureRequests_3_4[i].physicalCameraSettings[j].settings.resize(0);
   3869                         captureRequests_3_4[i].physicalCameraSettings[j].fmqSettingsSize =
   3870                             settingsSize;
   3871                     } else {
   3872                         if (mRequestMetadataQueue != nullptr) {
   3873                             ALOGW("%s: couldn't utilize fmq, fallback to hwbinder", __FUNCTION__);
   3874                         }
   3875                         captureRequests_3_4[i].physicalCameraSettings[j].settings.setToExternal(
   3876                                 reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(
   3877                                         request->physcam_settings[j])),
   3878                                 get_camera_metadata_size(request->physcam_settings[j]));
   3879                         captureRequests_3_4[i].physicalCameraSettings[j].fmqSettingsSize = 0u;
   3880                     }
   3881                 } else {
   3882                     captureRequests_3_4[i].physicalCameraSettings[j].fmqSettingsSize = 0u;
   3883                     captureRequests_3_4[i].physicalCameraSettings[j].settings.resize(0);
   3884                 }
   3885                 captureRequests_3_4[i].physicalCameraSettings[j].physicalCameraId =
   3886                     request->physcam_id[j];
   3887             }
   3888         }
   3889     }
   3890 
   3891     hardware::details::return_status err;
   3892     if (hidlSession_3_4 != nullptr) {
   3893         err = hidlSession_3_4->processCaptureRequest_3_4(captureRequests_3_4, cachesToRemove,
   3894             [&status, &numRequestProcessed] (auto s, uint32_t n) {
   3895                 status = s;
   3896                 *numRequestProcessed = n;
   3897             });
   3898     } else {
   3899         err = mHidlSession->processCaptureRequest(captureRequests, cachesToRemove,
   3900             [&status, &numRequestProcessed] (auto s, uint32_t n) {
   3901                 status = s;
   3902                 *numRequestProcessed = n;
   3903             });
   3904     }
   3905     if (!err.isOk()) {
   3906         ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
   3907         return DEAD_OBJECT;
   3908     }
   3909     if (status == common::V1_0::Status::OK && *numRequestProcessed != batchSize) {
   3910         ALOGE("%s: processCaptureRequest returns OK but processed %d/%zu requests",
   3911                 __FUNCTION__, *numRequestProcessed, batchSize);
   3912         status = common::V1_0::Status::INTERNAL_ERROR;
   3913     }
   3914 
   3915     for (auto& handle : handlesCreated) {
   3916         native_handle_delete(handle);
   3917     }
   3918     return CameraProviderManager::mapToStatusT(status);
   3919 }
   3920 
   3921 status_t Camera3Device::HalInterface::processCaptureRequest(
   3922         camera3_capture_request_t *request) {
   3923     ATRACE_NAME("CameraHal::processCaptureRequest");
   3924     if (!valid()) return INVALID_OPERATION;
   3925     status_t res = OK;
   3926 
   3927     uint32_t numRequestProcessed = 0;
   3928     std::vector<camera3_capture_request_t*> requests(1);
   3929     requests[0] = request;
   3930     res = processBatchCaptureRequests(requests, &numRequestProcessed);
   3931 
   3932     return res;
   3933 }
   3934 
   3935 status_t Camera3Device::HalInterface::flush() {
   3936     ATRACE_NAME("CameraHal::flush");
   3937     if (!valid()) return INVALID_OPERATION;
   3938     status_t res = OK;
   3939 
   3940     auto err = mHidlSession->flush();
   3941     if (!err.isOk()) {
   3942         ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
   3943         res = DEAD_OBJECT;
   3944     } else {
   3945         res = CameraProviderManager::mapToStatusT(err);
   3946     }
   3947 
   3948     return res;
   3949 }
   3950 
   3951 status_t Camera3Device::HalInterface::dump(int /*fd*/) {
   3952     ATRACE_NAME("CameraHal::dump");
   3953     if (!valid()) return INVALID_OPERATION;
   3954 
   3955     // Handled by CameraProviderManager::dump
   3956 
   3957     return OK;
   3958 }
   3959 
   3960 status_t Camera3Device::HalInterface::close() {
   3961     ATRACE_NAME("CameraHal::close()");
   3962     if (!valid()) return INVALID_OPERATION;
   3963     status_t res = OK;
   3964 
   3965     auto err = mHidlSession->close();
   3966     // Interface will be dead shortly anyway, so don't log errors
   3967     if (!err.isOk()) {
   3968         res = DEAD_OBJECT;
   3969     }
   3970 
   3971     return res;
   3972 }
   3973 
   3974 void Camera3Device::HalInterface::getInflightBufferKeys(
   3975         std::vector<std::pair<int32_t, int32_t>>* out) {
   3976     std::lock_guard<std::mutex> lock(mInflightLock);
   3977     out->clear();
   3978     out->reserve(mInflightBufferMap.size());
   3979     for (auto& pair : mInflightBufferMap) {
   3980         uint64_t key = pair.first;
   3981         int32_t streamId = key & 0xFFFFFFFF;
   3982         int32_t frameNumber = (key >> 32) & 0xFFFFFFFF;
   3983         out->push_back(std::make_pair(frameNumber, streamId));
   3984     }
   3985     return;
   3986 }
   3987 
   3988 status_t Camera3Device::HalInterface::pushInflightBufferLocked(
   3989         int32_t frameNumber, int32_t streamId, buffer_handle_t *buffer, int acquireFence) {
   3990     uint64_t key = static_cast<uint64_t>(frameNumber) << 32 | static_cast<uint64_t>(streamId);
   3991     auto pair = std::make_pair(buffer, acquireFence);
   3992     mInflightBufferMap[key] = pair;
   3993     return OK;
   3994 }
   3995 
   3996 status_t Camera3Device::HalInterface::popInflightBuffer(
   3997         int32_t frameNumber, int32_t streamId,
   3998         /*out*/ buffer_handle_t **buffer) {
   3999     std::lock_guard<std::mutex> lock(mInflightLock);
   4000 
   4001     uint64_t key = static_cast<uint64_t>(frameNumber) << 32 | static_cast<uint64_t>(streamId);
   4002     auto it = mInflightBufferMap.find(key);
   4003     if (it == mInflightBufferMap.end()) return NAME_NOT_FOUND;
   4004     auto pair = it->second;
   4005     *buffer = pair.first;
   4006     int acquireFence = pair.second;
   4007     if (acquireFence > 0) {
   4008         ::close(acquireFence);
   4009     }
   4010     mInflightBufferMap.erase(it);
   4011     return OK;
   4012 }
   4013 
   4014 std::pair<bool, uint64_t> Camera3Device::HalInterface::getBufferId(
   4015         const buffer_handle_t& buf, int streamId) {
   4016     std::lock_guard<std::mutex> lock(mBufferIdMapLock);
   4017 
   4018     BufferIdMap& bIdMap = mBufferIdMaps.at(streamId);
   4019     auto it = bIdMap.find(buf);
   4020     if (it == bIdMap.end()) {
   4021         bIdMap[buf] = mNextBufferId++;
   4022         ALOGV("stream %d now have %zu buffer caches, buf %p",
   4023                 streamId, bIdMap.size(), buf);
   4024         return std::make_pair(true, mNextBufferId - 1);
   4025     } else {
   4026         return std::make_pair(false, it->second);
   4027     }
   4028 }
   4029 
   4030 void Camera3Device::HalInterface::onBufferFreed(
   4031         int streamId, const native_handle_t* handle) {
   4032     std::lock_guard<std::mutex> lock(mBufferIdMapLock);
   4033     uint64_t bufferId = BUFFER_ID_NO_BUFFER;
   4034     auto mapIt = mBufferIdMaps.find(streamId);
   4035     if (mapIt == mBufferIdMaps.end()) {
   4036         // streamId might be from a deleted stream here
   4037         ALOGI("%s: stream %d has been removed",
   4038                 __FUNCTION__, streamId);
   4039         return;
   4040     }
   4041     BufferIdMap& bIdMap = mapIt->second;
   4042     auto it = bIdMap.find(handle);
   4043     if (it == bIdMap.end()) {
   4044         ALOGW("%s: cannot find buffer %p in stream %d",
   4045                 __FUNCTION__, handle, streamId);
   4046         return;
   4047     } else {
   4048         bufferId =  it->second;
   4049         bIdMap.erase(it);
   4050         ALOGV("%s: stream %d now have %zu buffer caches after removing buf %p",
   4051                 __FUNCTION__, streamId, bIdMap.size(), handle);
   4052     }
   4053     mFreedBuffers.push_back(std::make_pair(streamId, bufferId));
   4054 }
   4055 
   4056 /**
   4057  * RequestThread inner class methods
   4058  */
   4059 
   4060 Camera3Device::RequestThread::RequestThread(wp<Camera3Device> parent,
   4061         sp<StatusTracker> statusTracker,
   4062         sp<HalInterface> interface, const Vector<int32_t>& sessionParamKeys) :
   4063         Thread(/*canCallJava*/false),
   4064         mParent(parent),
   4065         mStatusTracker(statusTracker),
   4066         mInterface(interface),
   4067         mListener(nullptr),
   4068         mId(getId(parent)),
   4069         mReconfigured(false),
   4070         mDoPause(false),
   4071         mPaused(true),
   4072         mFrameNumber(0),
   4073         mLatestRequestId(NAME_NOT_FOUND),
   4074         mCurrentAfTriggerId(0),
   4075         mCurrentPreCaptureTriggerId(0),
   4076         mRepeatingLastFrameNumber(
   4077             hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES),
   4078         mPrepareVideoStream(false),
   4079         mConstrainedMode(false),
   4080         mRequestLatency(kRequestLatencyBinSize),
   4081         mSessionParamKeys(sessionParamKeys),
   4082         mLatestSessionParams(sessionParamKeys.size()) {
   4083     mStatusId = statusTracker->addComponent();
   4084 }
   4085 
   4086 Camera3Device::RequestThread::~RequestThread() {}
   4087 
   4088 void Camera3Device::RequestThread::setNotificationListener(
   4089         wp<NotificationListener> listener) {
   4090     ATRACE_CALL();
   4091     Mutex::Autolock l(mRequestLock);
   4092     mListener = listener;
   4093 }
   4094 
   4095 void Camera3Device::RequestThread::configurationComplete(bool isConstrainedHighSpeed,
   4096         const CameraMetadata& sessionParams) {
   4097     ATRACE_CALL();
   4098     Mutex::Autolock l(mRequestLock);
   4099     mReconfigured = true;
   4100     mLatestSessionParams = sessionParams;
   4101     // Prepare video stream for high speed recording.
   4102     mPrepareVideoStream = isConstrainedHighSpeed;
   4103     mConstrainedMode = isConstrainedHighSpeed;
   4104 }
   4105 
   4106 status_t Camera3Device::RequestThread::queueRequestList(
   4107         List<sp<CaptureRequest> > &requests,
   4108         /*out*/
   4109         int64_t *lastFrameNumber) {
   4110     ATRACE_CALL();
   4111     Mutex::Autolock l(mRequestLock);
   4112     for (List<sp<CaptureRequest> >::iterator it = requests.begin(); it != requests.end();
   4113             ++it) {
   4114         mRequestQueue.push_back(*it);
   4115     }
   4116 
   4117     if (lastFrameNumber != NULL) {
   4118         *lastFrameNumber = mFrameNumber + mRequestQueue.size() - 1;
   4119         ALOGV("%s: requestId %d, mFrameNumber %" PRId32 ", lastFrameNumber %" PRId64 ".",
   4120               __FUNCTION__, (*(requests.begin()))->mResultExtras.requestId, mFrameNumber,
   4121               *lastFrameNumber);
   4122     }
   4123 
   4124     unpauseForNewRequests();
   4125 
   4126     return OK;
   4127 }
   4128 
   4129 
   4130 status_t Camera3Device::RequestThread::queueTrigger(
   4131         RequestTrigger trigger[],
   4132         size_t count) {
   4133     ATRACE_CALL();
   4134     Mutex::Autolock l(mTriggerMutex);
   4135     status_t ret;
   4136 
   4137     for (size_t i = 0; i < count; ++i) {
   4138         ret = queueTriggerLocked(trigger[i]);
   4139 
   4140         if (ret != OK) {
   4141             return ret;
   4142         }
   4143     }
   4144 
   4145     return OK;
   4146 }
   4147 
   4148 const String8& Camera3Device::RequestThread::getId(const wp<Camera3Device> &device) {
   4149     static String8 deadId("<DeadDevice>");
   4150     sp<Camera3Device> d = device.promote();
   4151     if (d != nullptr) return d->mId;
   4152     return deadId;
   4153 }
   4154 
   4155 status_t Camera3Device::RequestThread::queueTriggerLocked(
   4156         RequestTrigger trigger) {
   4157 
   4158     uint32_t tag = trigger.metadataTag;
   4159     ssize_t index = mTriggerMap.indexOfKey(tag);
   4160 
   4161     switch (trigger.getTagType()) {
   4162         case TYPE_BYTE:
   4163         // fall-through
   4164         case TYPE_INT32:
   4165             break;
   4166         default:
   4167             ALOGE("%s: Type not supported: 0x%x", __FUNCTION__,
   4168                     trigger.getTagType());
   4169             return INVALID_OPERATION;
   4170     }
   4171 
   4172     /**
   4173      * Collect only the latest trigger, since we only have 1 field
   4174      * in the request settings per trigger tag, and can't send more than 1
   4175      * trigger per request.
   4176      */
   4177     if (index != NAME_NOT_FOUND) {
   4178         mTriggerMap.editValueAt(index) = trigger;
   4179     } else {
   4180         mTriggerMap.add(tag, trigger);
   4181     }
   4182 
   4183     return OK;
   4184 }
   4185 
   4186 status_t Camera3Device::RequestThread::setRepeatingRequests(
   4187         const RequestList &requests,
   4188         /*out*/
   4189         int64_t *lastFrameNumber) {
   4190     ATRACE_CALL();
   4191     Mutex::Autolock l(mRequestLock);
   4192     if (lastFrameNumber != NULL) {
   4193         *lastFrameNumber = mRepeatingLastFrameNumber;
   4194     }
   4195     mRepeatingRequests.clear();
   4196     mRepeatingRequests.insert(mRepeatingRequests.begin(),
   4197             requests.begin(), requests.end());
   4198 
   4199     unpauseForNewRequests();
   4200 
   4201     mRepeatingLastFrameNumber = hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES;
   4202     return OK;
   4203 }
   4204 
   4205 bool Camera3Device::RequestThread::isRepeatingRequestLocked(const sp<CaptureRequest>& requestIn) {
   4206     if (mRepeatingRequests.empty()) {
   4207         return false;
   4208     }
   4209     int32_t requestId = requestIn->mResultExtras.requestId;
   4210     const RequestList &repeatRequests = mRepeatingRequests;
   4211     // All repeating requests are guaranteed to have same id so only check first quest
   4212     const sp<CaptureRequest> firstRequest = *repeatRequests.begin();
   4213     return (firstRequest->mResultExtras.requestId == requestId);
   4214 }
   4215 
   4216 status_t Camera3Device::RequestThread::clearRepeatingRequests(/*out*/int64_t *lastFrameNumber) {
   4217     ATRACE_CALL();
   4218     Mutex::Autolock l(mRequestLock);
   4219     return clearRepeatingRequestsLocked(lastFrameNumber);
   4220 
   4221 }
   4222 
   4223 status_t Camera3Device::RequestThread::clearRepeatingRequestsLocked(/*out*/int64_t *lastFrameNumber) {
   4224     mRepeatingRequests.clear();
   4225     if (lastFrameNumber != NULL) {
   4226         *lastFrameNumber = mRepeatingLastFrameNumber;
   4227     }
   4228     mRepeatingLastFrameNumber = hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES;
   4229     return OK;
   4230 }
   4231 
   4232 status_t Camera3Device::RequestThread::clear(
   4233         /*out*/int64_t *lastFrameNumber) {
   4234     ATRACE_CALL();
   4235     Mutex::Autolock l(mRequestLock);
   4236     ALOGV("RequestThread::%s:", __FUNCTION__);
   4237 
   4238     mRepeatingRequests.clear();
   4239 
   4240     // Send errors for all requests pending in the request queue, including
   4241     // pending repeating requests
   4242     sp<NotificationListener> listener = mListener.promote();
   4243     if (listener != NULL) {
   4244         for (RequestList::iterator it = mRequestQueue.begin();
   4245                  it != mRequestQueue.end(); ++it) {
   4246             // Abort the input buffers for reprocess requests.
   4247             if ((*it)->mInputStream != NULL) {
   4248                 camera3_stream_buffer_t inputBuffer;
   4249                 status_t res = (*it)->mInputStream->getInputBuffer(&inputBuffer,
   4250                         /*respectHalLimit*/ false);
   4251                 if (res != OK) {
   4252                     ALOGW("%s: %d: couldn't get input buffer while clearing the request "
   4253                             "list: %s (%d)", __FUNCTION__, __LINE__, strerror(-res), res);
   4254                 } else {
   4255                     res = (*it)->mInputStream->returnInputBuffer(inputBuffer);
   4256                     if (res != OK) {
   4257                         ALOGE("%s: %d: couldn't return input buffer while clearing the request "
   4258                                 "list: %s (%d)", __FUNCTION__, __LINE__, strerror(-res), res);
   4259                     }
   4260                 }
   4261             }
   4262             // Set the frame number this request would have had, if it
   4263             // had been submitted; this frame number will not be reused.
   4264             // The requestId and burstId fields were set when the request was
   4265             // submitted originally (in convertMetadataListToRequestListLocked)
   4266             (*it)->mResultExtras.frameNumber = mFrameNumber++;
   4267             listener->notifyError(hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST,
   4268                     (*it)->mResultExtras);
   4269         }
   4270     }
   4271     mRequestQueue.clear();
   4272 
   4273     Mutex::Autolock al(mTriggerMutex);
   4274     mTriggerMap.clear();
   4275     if (lastFrameNumber != NULL) {
   4276         *lastFrameNumber = mRepeatingLastFrameNumber;
   4277     }
   4278     mRepeatingLastFrameNumber = hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES;
   4279     return OK;
   4280 }
   4281 
   4282 status_t Camera3Device::RequestThread::flush() {
   4283     ATRACE_CALL();
   4284     Mutex::Autolock l(mFlushLock);
   4285 
   4286     return mInterface->flush();
   4287 }
   4288 
   4289 void Camera3Device::RequestThread::setPaused(bool paused) {
   4290     ATRACE_CALL();
   4291     Mutex::Autolock l(mPauseLock);
   4292     mDoPause = paused;
   4293     mDoPauseSignal.signal();
   4294 }
   4295 
   4296 status_t Camera3Device::RequestThread::waitUntilRequestProcessed(
   4297         int32_t requestId, nsecs_t timeout) {
   4298     ATRACE_CALL();
   4299     Mutex::Autolock l(mLatestRequestMutex);
   4300     status_t res;
   4301     while (mLatestRequestId != requestId) {
   4302         nsecs_t startTime = systemTime();
   4303 
   4304         res = mLatestRequestSignal.waitRelative(mLatestRequestMutex, timeout);
   4305         if (res != OK) return res;
   4306 
   4307         timeout -= (systemTime() - startTime);
   4308     }
   4309 
   4310     return OK;
   4311 }
   4312 
   4313 void Camera3Device::RequestThread::requestExit() {
   4314     // Call parent to set up shutdown
   4315     Thread::requestExit();
   4316     // The exit from any possible waits
   4317     mDoPauseSignal.signal();
   4318     mRequestSignal.signal();
   4319 
   4320     mRequestLatency.log("ProcessCaptureRequest latency histogram");
   4321     mRequestLatency.reset();
   4322 }
   4323 
   4324 void Camera3Device::RequestThread::checkAndStopRepeatingRequest() {
   4325     ATRACE_CALL();
   4326     bool surfaceAbandoned = false;
   4327     int64_t lastFrameNumber = 0;
   4328     sp<NotificationListener> listener;
   4329     {
   4330         Mutex::Autolock l(mRequestLock);
   4331         // Check all streams needed by repeating requests are still valid. Otherwise, stop
   4332         // repeating requests.
   4333         for (const auto& request : mRepeatingRequests) {
   4334             for (const auto& s : request->mOutputStreams) {
   4335                 if (s->isAbandoned()) {
   4336                     surfaceAbandoned = true;
   4337                     clearRepeatingRequestsLocked(&lastFrameNumber);
   4338                     break;
   4339                 }
   4340             }
   4341             if (surfaceAbandoned) {
   4342                 break;
   4343             }
   4344         }
   4345         listener = mListener.promote();
   4346     }
   4347 
   4348     if (listener != NULL && surfaceAbandoned) {
   4349         listener->notifyRepeatingRequestError(lastFrameNumber);
   4350     }
   4351 }
   4352 
   4353 bool Camera3Device::RequestThread::sendRequestsBatch() {
   4354     ATRACE_CALL();
   4355     status_t res;
   4356     size_t batchSize = mNextRequests.size();
   4357     std::vector<camera3_capture_request_t*> requests(batchSize);
   4358     uint32_t numRequestProcessed = 0;
   4359     for (size_t i = 0; i < batchSize; i++) {
   4360         requests[i] = &mNextRequests.editItemAt(i).halRequest;
   4361         ATRACE_ASYNC_BEGIN("frame capture", mNextRequests[i].halRequest.frame_number);
   4362     }
   4363 
   4364     res = mInterface->processBatchCaptureRequests(requests, &numRequestProcessed);
   4365 
   4366     bool triggerRemoveFailed = false;
   4367     NextRequest& triggerFailedRequest = mNextRequests.editItemAt(0);
   4368     for (size_t i = 0; i < numRequestProcessed; i++) {
   4369         NextRequest& nextRequest = mNextRequests.editItemAt(i);
   4370         nextRequest.submitted = true;
   4371 
   4372 
   4373         // Update the latest request sent to HAL
   4374         if (nextRequest.halRequest.settings != NULL) { // Don't update if they were unchanged
   4375             Mutex::Autolock al(mLatestRequestMutex);
   4376 
   4377             camera_metadata_t* cloned = clone_camera_metadata(nextRequest.halRequest.settings);
   4378             mLatestRequest.acquire(cloned);
   4379 
   4380             sp<Camera3Device> parent = mParent.promote();
   4381             if (parent != NULL) {
   4382                 parent->monitorMetadata(TagMonitor::REQUEST,
   4383                         nextRequest.halRequest.frame_number,
   4384                         0, mLatestRequest);
   4385             }
   4386         }
   4387 
   4388         if (nextRequest.halRequest.settings != NULL) {
   4389             nextRequest.captureRequest->mSettingsList.begin()->metadata.unlock(
   4390                     nextRequest.halRequest.settings);
   4391         }
   4392 
   4393         cleanupPhysicalSettings(nextRequest.captureRequest, &nextRequest.halRequest);
   4394 
   4395         if (!triggerRemoveFailed) {
   4396             // Remove any previously queued triggers (after unlock)
   4397             status_t removeTriggerRes = removeTriggers(mPrevRequest);
   4398             if (removeTriggerRes != OK) {
   4399                 triggerRemoveFailed = true;
   4400                 triggerFailedRequest = nextRequest;
   4401             }
   4402         }
   4403     }
   4404 
   4405     if (triggerRemoveFailed) {
   4406         SET_ERR("RequestThread: Unable to remove triggers "
   4407               "(capture request %d, HAL device: %s (%d)",
   4408               triggerFailedRequest.halRequest.frame_number, strerror(-res), res);
   4409         cleanUpFailedRequests(/*sendRequestError*/ false);
   4410         return false;
   4411     }
   4412 
   4413     if (res != OK) {
   4414         // Should only get a failure here for malformed requests or device-level
   4415         // errors, so consider all errors fatal.  Bad metadata failures should
   4416         // come through notify.
   4417         SET_ERR("RequestThread: Unable to submit capture request %d to HAL device: %s (%d)",
   4418                 mNextRequests[numRequestProcessed].halRequest.frame_number,
   4419                 strerror(-res), res);
   4420         cleanUpFailedRequests(/*sendRequestError*/ false);
   4421         return false;
   4422     }
   4423     return true;
   4424 }
   4425 
   4426 bool Camera3Device::RequestThread::sendRequestsOneByOne() {
   4427     status_t res;
   4428 
   4429     for (auto& nextRequest : mNextRequests) {
   4430         // Submit request and block until ready for next one
   4431         ATRACE_ASYNC_BEGIN("frame capture", nextRequest.halRequest.frame_number);
   4432         res = mInterface->processCaptureRequest(&nextRequest.halRequest);
   4433 
   4434         if (res != OK) {
   4435             // Should only get a failure here for malformed requests or device-level
   4436             // errors, so consider all errors fatal.  Bad metadata failures should
   4437             // come through notify.
   4438             SET_ERR("RequestThread: Unable to submit capture request %d to HAL"
   4439                     " device: %s (%d)", nextRequest.halRequest.frame_number, strerror(-res),
   4440                     res);
   4441             cleanUpFailedRequests(/*sendRequestError*/ false);
   4442             return false;
   4443         }
   4444 
   4445         // Mark that the request has be submitted successfully.
   4446         nextRequest.submitted = true;
   4447 
   4448         // Update the latest request sent to HAL
   4449         if (nextRequest.halRequest.settings != NULL) { // Don't update if they were unchanged
   4450             Mutex::Autolock al(mLatestRequestMutex);
   4451 
   4452             camera_metadata_t* cloned = clone_camera_metadata(nextRequest.halRequest.settings);
   4453             mLatestRequest.acquire(cloned);
   4454 
   4455             sp<Camera3Device> parent = mParent.promote();
   4456             if (parent != NULL) {
   4457                 parent->monitorMetadata(TagMonitor::REQUEST, nextRequest.halRequest.frame_number,
   4458                         0, mLatestRequest);
   4459             }
   4460         }
   4461 
   4462         if (nextRequest.halRequest.settings != NULL) {
   4463             nextRequest.captureRequest->mSettingsList.begin()->metadata.unlock(
   4464                     nextRequest.halRequest.settings);
   4465         }
   4466 
   4467         cleanupPhysicalSettings(nextRequest.captureRequest, &nextRequest.halRequest);
   4468 
   4469         // Remove any previously queued triggers (after unlock)
   4470         res = removeTriggers(mPrevRequest);
   4471         if (res != OK) {
   4472             SET_ERR("RequestThread: Unable to remove triggers "
   4473                   "(capture request %d, HAL device: %s (%d)",
   4474                   nextRequest.halRequest.frame_number, strerror(-res), res);
   4475             cleanUpFailedRequests(/*sendRequestError*/ false);
   4476             return false;
   4477         }
   4478     }
   4479     return true;
   4480 }
   4481 
   4482 nsecs_t Camera3Device::RequestThread::calculateMaxExpectedDuration(const camera_metadata_t *request) {
   4483     nsecs_t maxExpectedDuration = kDefaultExpectedDuration;
   4484     camera_metadata_ro_entry_t e = camera_metadata_ro_entry_t();
   4485     find_camera_metadata_ro_entry(request,
   4486             ANDROID_CONTROL_AE_MODE,
   4487             &e);
   4488     if (e.count == 0) return maxExpectedDuration;
   4489 
   4490     switch (e.data.u8[0]) {
   4491         case ANDROID_CONTROL_AE_MODE_OFF:
   4492             find_camera_metadata_ro_entry(request,
   4493                     ANDROID_SENSOR_EXPOSURE_TIME,
   4494                     &e);
   4495             if (e.count > 0) {
   4496                 maxExpectedDuration = e.data.i64[0];
   4497             }
   4498             find_camera_metadata_ro_entry(request,
   4499                     ANDROID_SENSOR_FRAME_DURATION,
   4500                     &e);
   4501             if (e.count > 0) {
   4502                 maxExpectedDuration = std::max(e.data.i64[0], maxExpectedDuration);
   4503             }
   4504             break;
   4505         default:
   4506             find_camera_metadata_ro_entry(request,
   4507                     ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
   4508                     &e);
   4509             if (e.count > 1) {
   4510                 maxExpectedDuration = 1e9 / e.data.u8[0];
   4511             }
   4512             break;
   4513     }
   4514 
   4515     return maxExpectedDuration;
   4516 }
   4517 
   4518 bool Camera3Device::RequestThread::skipHFRTargetFPSUpdate(int32_t tag,
   4519         const camera_metadata_ro_entry_t& newEntry, const camera_metadata_entry_t& currentEntry) {
   4520     if (mConstrainedMode && (ANDROID_CONTROL_AE_TARGET_FPS_RANGE == tag) &&
   4521             (newEntry.count == currentEntry.count) && (currentEntry.count == 2) &&
   4522             (currentEntry.data.i32[1] == newEntry.data.i32[1])) {
   4523         return true;
   4524     }
   4525 
   4526     return false;
   4527 }
   4528 
   4529 bool Camera3Device::RequestThread::updateSessionParameters(const CameraMetadata& settings) {
   4530     ATRACE_CALL();
   4531     bool updatesDetected = false;
   4532 
   4533     for (auto tag : mSessionParamKeys) {
   4534         camera_metadata_ro_entry entry = settings.find(tag);
   4535         camera_metadata_entry lastEntry = mLatestSessionParams.find(tag);
   4536 
   4537         if (entry.count > 0) {
   4538             bool isDifferent = false;
   4539             if (lastEntry.count > 0) {
   4540                 // Have a last value, compare to see if changed
   4541                 if (lastEntry.type == entry.type &&
   4542                         lastEntry.count == entry.count) {
   4543                     // Same type and count, compare values
   4544                     size_t bytesPerValue = camera_metadata_type_size[lastEntry.type];
   4545                     size_t entryBytes = bytesPerValue * lastEntry.count;
   4546                     int cmp = memcmp(entry.data.u8, lastEntry.data.u8, entryBytes);
   4547                     if (cmp != 0) {
   4548                         isDifferent = true;
   4549                     }
   4550                 } else {
   4551                     // Count or type has changed
   4552                     isDifferent = true;
   4553                 }
   4554             } else {
   4555                 // No last entry, so always consider to be different
   4556                 isDifferent = true;
   4557             }
   4558 
   4559             if (isDifferent) {
   4560                 ALOGV("%s: Session parameter tag id %d changed", __FUNCTION__, tag);
   4561                 if (!skipHFRTargetFPSUpdate(tag, entry, lastEntry)) {
   4562                     updatesDetected = true;
   4563                 }
   4564                 mLatestSessionParams.update(entry);
   4565             }
   4566         } else if (lastEntry.count > 0) {
   4567             // Value has been removed
   4568             ALOGV("%s: Session parameter tag id %d removed", __FUNCTION__, tag);
   4569             mLatestSessionParams.erase(tag);
   4570             updatesDetected = true;
   4571         }
   4572     }
   4573 
   4574     return updatesDetected;
   4575 }
   4576 
   4577 bool Camera3Device::RequestThread::threadLoop() {
   4578     ATRACE_CALL();
   4579     status_t res;
   4580 
   4581     // Handle paused state.
   4582     if (waitIfPaused()) {
   4583         return true;
   4584     }
   4585 
   4586     // Wait for the next batch of requests.
   4587     waitForNextRequestBatch();
   4588     if (mNextRequests.size() == 0) {
   4589         return true;
   4590     }
   4591 
   4592     // Get the latest request ID, if any
   4593     int latestRequestId;
   4594     camera_metadata_entry_t requestIdEntry = mNextRequests[mNextRequests.size() - 1].
   4595             captureRequest->mSettingsList.begin()->metadata.find(ANDROID_REQUEST_ID);
   4596     if (requestIdEntry.count > 0) {
   4597         latestRequestId = requestIdEntry.data.i32[0];
   4598     } else {
   4599         ALOGW("%s: Did not have android.request.id set in the request.", __FUNCTION__);
   4600         latestRequestId = NAME_NOT_FOUND;
   4601     }
   4602 
   4603     // 'mNextRequests' will at this point contain either a set of HFR batched requests
   4604     //  or a single request from streaming or burst. In either case the first element
   4605     //  should contain the latest camera settings that we need to check for any session
   4606     //  parameter updates.
   4607     if (updateSessionParameters(mNextRequests[0].captureRequest->mSettingsList.begin()->metadata)) {
   4608         res = OK;
   4609 
   4610         //Input stream buffers are already acquired at this point so an input stream
   4611         //will not be able to move to idle state unless we force it.
   4612         if (mNextRequests[0].captureRequest->mInputStream != nullptr) {
   4613             res = mNextRequests[0].captureRequest->mInputStream->forceToIdle();
   4614             if (res != OK) {
   4615                 ALOGE("%s: Failed to force idle input stream: %d", __FUNCTION__, res);
   4616                 cleanUpFailedRequests(/*sendRequestError*/ false);
   4617                 return false;
   4618             }
   4619         }
   4620 
   4621         if (res == OK) {
   4622             sp<StatusTracker> statusTracker = mStatusTracker.promote();
   4623             if (statusTracker != 0) {
   4624                 sp<Camera3Device> parent = mParent.promote();
   4625                 if (parent != nullptr) {
   4626                     parent->pauseStateNotify(true);
   4627                 }
   4628 
   4629                 statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE);
   4630 
   4631                 if (parent != nullptr) {
   4632                     mReconfigured |= parent->reconfigureCamera(mLatestSessionParams);
   4633                 }
   4634 
   4635                 statusTracker->markComponentActive(mStatusId);
   4636                 setPaused(false);
   4637             }
   4638 
   4639             if (mNextRequests[0].captureRequest->mInputStream != nullptr) {
   4640                 mNextRequests[0].captureRequest->mInputStream->restoreConfiguredState();
   4641                 if (res != OK) {
   4642                     ALOGE("%s: Failed to restore configured input stream: %d", __FUNCTION__, res);
   4643                     cleanUpFailedRequests(/*sendRequestError*/ false);
   4644                     return false;
   4645                 }
   4646             }
   4647         }
   4648     }
   4649 
   4650     // Prepare a batch of HAL requests and output buffers.
   4651     res = prepareHalRequests();
   4652     if (res == TIMED_OUT) {
   4653         // Not a fatal error if getting output buffers time out.
   4654         cleanUpFailedRequests(/*sendRequestError*/ true);
   4655         // Check if any stream is abandoned.
   4656         checkAndStopRepeatingRequest();
   4657         return true;
   4658     } else if (res != OK) {
   4659         cleanUpFailedRequests(/*sendRequestError*/ false);
   4660         return false;
   4661     }
   4662 
   4663     // Inform waitUntilRequestProcessed thread of a new request ID
   4664     {
   4665         Mutex::Autolock al(mLatestRequestMutex);
   4666 
   4667         mLatestRequestId = latestRequestId;
   4668         mLatestRequestSignal.signal();
   4669     }
   4670 
   4671     // Submit a batch of requests to HAL.
   4672     // Use flush lock only when submitting multilple requests in a batch.
   4673     // TODO: The problem with flush lock is flush() will be blocked by process_capture_request()
   4674     // which may take a long time to finish so synchronizing flush() and
   4675     // process_capture_request() defeats the purpose of cancelling requests ASAP with flush().
   4676     // For now, only synchronize for high speed recording and we should figure something out for
   4677     // removing the synchronization.
   4678     bool useFlushLock = mNextRequests.size() > 1;
   4679 
   4680     if (useFlushLock) {
   4681         mFlushLock.lock();
   4682     }
   4683 
   4684     ALOGVV("%s: %d: submitting %zu requests in a batch.", __FUNCTION__, __LINE__,
   4685             mNextRequests.size());
   4686 
   4687     bool submitRequestSuccess = false;
   4688     nsecs_t tRequestStart = systemTime(SYSTEM_TIME_MONOTONIC);
   4689     if (mInterface->supportBatchRequest()) {
   4690         submitRequestSuccess = sendRequestsBatch();
   4691     } else {
   4692         submitRequestSuccess = sendRequestsOneByOne();
   4693     }
   4694     nsecs_t tRequestEnd = systemTime(SYSTEM_TIME_MONOTONIC);
   4695     mRequestLatency.add(tRequestStart, tRequestEnd);
   4696 
   4697     if (useFlushLock) {
   4698         mFlushLock.unlock();
   4699     }
   4700 
   4701     // Unset as current request
   4702     {
   4703         Mutex::Autolock l(mRequestLock);
   4704         mNextRequests.clear();
   4705     }
   4706 
   4707     return submitRequestSuccess;
   4708 }
   4709 
   4710 status_t Camera3Device::RequestThread::prepareHalRequests() {
   4711     ATRACE_CALL();
   4712 
   4713     for (size_t i = 0; i < mNextRequests.size(); i++) {
   4714         auto& nextRequest = mNextRequests.editItemAt(i);
   4715         sp<CaptureRequest> captureRequest = nextRequest.captureRequest;
   4716         camera3_capture_request_t* halRequest = &nextRequest.halRequest;
   4717         Vector<camera3_stream_buffer_t>* outputBuffers = &nextRequest.outputBuffers;
   4718 
   4719         // Prepare a request to HAL
   4720         halRequest->frame_number = captureRequest->mResultExtras.frameNumber;
   4721 
   4722         // Insert any queued triggers (before metadata is locked)
   4723         status_t res = insertTriggers(captureRequest);
   4724         if (res < 0) {
   4725             SET_ERR("RequestThread: Unable to insert triggers "
   4726                     "(capture request %d, HAL device: %s (%d)",
   4727                     halRequest->frame_number, strerror(-res), res);
   4728             return INVALID_OPERATION;
   4729         }
   4730 
   4731         int triggerCount = res;
   4732         bool triggersMixedIn = (triggerCount > 0 || mPrevTriggers > 0);
   4733         mPrevTriggers = triggerCount;
   4734 
   4735         // If the request is the same as last, or we had triggers last time
   4736         bool newRequest = mPrevRequest != captureRequest || triggersMixedIn;
   4737         if (newRequest) {
   4738             /**
   4739              * HAL workaround:
   4740              * Insert a dummy trigger ID if a trigger is set but no trigger ID is
   4741              */
   4742             res = addDummyTriggerIds(captureRequest);
   4743             if (res != OK) {
   4744                 SET_ERR("RequestThread: Unable to insert dummy trigger IDs "
   4745                         "(capture request %d, HAL device: %s (%d)",
   4746                         halRequest->frame_number, strerror(-res), res);
   4747                 return INVALID_OPERATION;
   4748             }
   4749 
   4750             {
   4751                 // Correct metadata regions for distortion correction if enabled
   4752                 sp<Camera3Device> parent = mParent.promote();
   4753                 if (parent != nullptr) {
   4754                     res = parent->mDistortionMapper.correctCaptureRequest(
   4755                         &(captureRequest->mSettingsList.begin()->metadata));
   4756                     if (res != OK) {
   4757                         SET_ERR("RequestThread: Unable to correct capture requests "
   4758                                 "for lens distortion for request %d: %s (%d)",
   4759                                 halRequest->frame_number, strerror(-res), res);
   4760                         return INVALID_OPERATION;
   4761                     }
   4762                 }
   4763             }
   4764 
   4765             /**
   4766              * The request should be presorted so accesses in HAL
   4767              *   are O(logn). Sidenote, sorting a sorted metadata is nop.
   4768              */
   4769             captureRequest->mSettingsList.begin()->metadata.sort();
   4770             halRequest->settings = captureRequest->mSettingsList.begin()->metadata.getAndLock();
   4771             mPrevRequest = captureRequest;
   4772             ALOGVV("%s: Request settings are NEW", __FUNCTION__);
   4773 
   4774             IF_ALOGV() {
   4775                 camera_metadata_ro_entry_t e = camera_metadata_ro_entry_t();
   4776                 find_camera_metadata_ro_entry(
   4777                         halRequest->settings,
   4778                         ANDROID_CONTROL_AF_TRIGGER,
   4779                         &e
   4780                 );
   4781                 if (e.count > 0) {
   4782                     ALOGV("%s: Request (frame num %d) had AF trigger 0x%x",
   4783                           __FUNCTION__,
   4784                           halRequest->frame_number,
   4785                           e.data.u8[0]);
   4786                 }
   4787             }
   4788         } else {
   4789             // leave request.settings NULL to indicate 'reuse latest given'
   4790             ALOGVV("%s: Request settings are REUSED",
   4791                    __FUNCTION__);
   4792         }
   4793 
   4794         if (captureRequest->mSettingsList.size() > 1) {
   4795             halRequest->num_physcam_settings = captureRequest->mSettingsList.size() - 1;
   4796             halRequest->physcam_id = new const char* [halRequest->num_physcam_settings];
   4797             if (newRequest) {
   4798                 halRequest->physcam_settings =
   4799                     new const camera_metadata* [halRequest->num_physcam_settings];
   4800             } else {
   4801                 halRequest->physcam_settings = nullptr;
   4802             }
   4803             auto it = ++captureRequest->mSettingsList.begin();
   4804             size_t i = 0;
   4805             for (; it != captureRequest->mSettingsList.end(); it++, i++) {
   4806                 halRequest->physcam_id[i] = it->cameraId.c_str();
   4807                 if (newRequest) {
   4808                     it->metadata.sort();
   4809                     halRequest->physcam_settings[i] = it->metadata.getAndLock();
   4810                 }
   4811             }
   4812         }
   4813 
   4814         uint32_t totalNumBuffers = 0;
   4815 
   4816         // Fill in buffers
   4817         if (captureRequest->mInputStream != NULL) {
   4818             halRequest->input_buffer = &captureRequest->mInputBuffer;
   4819             totalNumBuffers += 1;
   4820         } else {
   4821             halRequest->input_buffer = NULL;
   4822         }
   4823 
   4824         outputBuffers->insertAt(camera3_stream_buffer_t(), 0,
   4825                 captureRequest->mOutputStreams.size());
   4826         halRequest->output_buffers = outputBuffers->array();
   4827         std::set<String8> requestedPhysicalCameras;
   4828         for (size_t j = 0; j < captureRequest->mOutputStreams.size(); j++) {
   4829             sp<Camera3OutputStreamInterface> outputStream = captureRequest->mOutputStreams.editItemAt(j);
   4830 
   4831             // Prepare video buffers for high speed recording on the first video request.
   4832             if (mPrepareVideoStream && outputStream->isVideoStream()) {
   4833                 // Only try to prepare video stream on the first video request.
   4834                 mPrepareVideoStream = false;
   4835 
   4836                 res = outputStream->startPrepare(Camera3StreamInterface::ALLOCATE_PIPELINE_MAX);
   4837                 while (res == NOT_ENOUGH_DATA) {
   4838                     res = outputStream->prepareNextBuffer();
   4839                 }
   4840                 if (res != OK) {
   4841                     ALOGW("%s: Preparing video buffers for high speed failed: %s (%d)",
   4842                         __FUNCTION__, strerror(-res), res);
   4843                     outputStream->cancelPrepare();
   4844                 }
   4845             }
   4846 
   4847             res = outputStream->getBuffer(&outputBuffers->editItemAt(j),
   4848                     captureRequest->mOutputSurfaces[j]);
   4849             if (res != OK) {
   4850                 // Can't get output buffer from gralloc queue - this could be due to
   4851                 // abandoned queue or other consumer misbehavior, so not a fatal
   4852                 // error
   4853                 ALOGE("RequestThread: Can't get output buffer, skipping request:"
   4854                         " %s (%d)", strerror(-res), res);
   4855 
   4856                 return TIMED_OUT;
   4857             }
   4858 
   4859             String8 physicalCameraId = outputStream->getPhysicalCameraId();
   4860 
   4861             if (!physicalCameraId.isEmpty()) {
   4862                 // Physical stream isn't supported for input request.
   4863                 if (halRequest->input_buffer) {
   4864                     CLOGE("Physical stream is not supported for input request");
   4865                     return INVALID_OPERATION;
   4866                 }
   4867                 requestedPhysicalCameras.insert(physicalCameraId);
   4868             }
   4869             halRequest->num_output_buffers++;
   4870         }
   4871         totalNumBuffers += halRequest->num_output_buffers;
   4872 
   4873         // Log request in the in-flight queue
   4874         sp<Camera3Device> parent = mParent.promote();
   4875         if (parent == NULL) {
   4876             // Should not happen, and nowhere to send errors to, so just log it
   4877             CLOGE("RequestThread: Parent is gone");
   4878             return INVALID_OPERATION;
   4879         }
   4880 
   4881         // If this request list is for constrained high speed recording (not
   4882         // preview), and the current request is not the last one in the batch,
   4883         // do not send callback to the app.
   4884         bool hasCallback = true;
   4885         if (mNextRequests[0].captureRequest->mBatchSize > 1 && i != mNextRequests.size()-1) {
   4886             hasCallback = false;
   4887         }
   4888         res = parent->registerInFlight(halRequest->frame_number,
   4889                 totalNumBuffers, captureRequest->mResultExtras,
   4890                 /*hasInput*/halRequest->input_buffer != NULL,
   4891                 hasCallback,
   4892                 calculateMaxExpectedDuration(halRequest->settings),
   4893                 requestedPhysicalCameras);
   4894         ALOGVV("%s: registered in flight requestId = %" PRId32 ", frameNumber = %" PRId64
   4895                ", burstId = %" PRId32 ".",
   4896                 __FUNCTION__,
   4897                 captureRequest->mResultExtras.requestId, captureRequest->mResultExtras.frameNumber,
   4898                 captureRequest->mResultExtras.burstId);
   4899         if (res != OK) {
   4900             SET_ERR("RequestThread: Unable to register new in-flight request:"
   4901                     " %s (%d)", strerror(-res), res);
   4902             return INVALID_OPERATION;
   4903         }
   4904     }
   4905 
   4906     return OK;
   4907 }
   4908 
   4909 CameraMetadata Camera3Device::RequestThread::getLatestRequest() const {
   4910     ATRACE_CALL();
   4911     Mutex::Autolock al(mLatestRequestMutex);
   4912 
   4913     ALOGV("RequestThread::%s", __FUNCTION__);
   4914 
   4915     return mLatestRequest;
   4916 }
   4917 
   4918 bool Camera3Device::RequestThread::isStreamPending(
   4919         sp<Camera3StreamInterface>& stream) {
   4920     ATRACE_CALL();
   4921     Mutex::Autolock l(mRequestLock);
   4922 
   4923     for (const auto& nextRequest : mNextRequests) {
   4924         if (!nextRequest.submitted) {
   4925             for (const auto& s : nextRequest.captureRequest->mOutputStreams) {
   4926                 if (stream == s) return true;
   4927             }
   4928             if (stream == nextRequest.captureRequest->mInputStream) return true;
   4929         }
   4930     }
   4931 
   4932     for (const auto& request : mRequestQueue) {
   4933         for (const auto& s : request->mOutputStreams) {
   4934             if (stream == s) return true;
   4935         }
   4936         if (stream == request->mInputStream) return true;
   4937     }
   4938 
   4939     for (const auto& request : mRepeatingRequests) {
   4940         for (const auto& s : request->mOutputStreams) {
   4941             if (stream == s) return true;
   4942         }
   4943         if (stream == request->mInputStream) return true;
   4944     }
   4945 
   4946     return false;
   4947 }
   4948 
   4949 bool Camera3Device::RequestThread::isOutputSurfacePending(int streamId, size_t surfaceId) {
   4950     ATRACE_CALL();
   4951     Mutex::Autolock l(mRequestLock);
   4952 
   4953     for (const auto& nextRequest : mNextRequests) {
   4954         for (const auto& s : nextRequest.captureRequest->mOutputSurfaces) {
   4955             if (s.first == streamId) {
   4956                 const auto &it = std::find(s.second.begin(), s.second.end(), surfaceId);
   4957                 if (it != s.second.end()) {
   4958                     return true;
   4959                 }
   4960             }
   4961         }
   4962     }
   4963 
   4964     for (const auto& request : mRequestQueue) {
   4965         for (const auto& s : request->mOutputSurfaces) {
   4966             if (s.first == streamId) {
   4967                 const auto &it = std::find(s.second.begin(), s.second.end(), surfaceId);
   4968                 if (it != s.second.end()) {
   4969                   return true;
   4970                 }
   4971             }
   4972         }
   4973     }
   4974 
   4975     for (const auto& request : mRepeatingRequests) {
   4976         for (const auto& s : request->mOutputSurfaces) {
   4977             if (s.first == streamId) {
   4978                 const auto &it = std::find(s.second.begin(), s.second.end(), surfaceId);
   4979                 if (it != s.second.end()) {
   4980                   return true;
   4981                 }
   4982             }
   4983         }
   4984     }
   4985 
   4986     return false;
   4987 }
   4988 
   4989 nsecs_t Camera3Device::getExpectedInFlightDuration() {
   4990     ATRACE_CALL();
   4991     Mutex::Autolock al(mInFlightLock);
   4992     return mExpectedInflightDuration > kMinInflightDuration ?
   4993             mExpectedInflightDuration : kMinInflightDuration;
   4994 }
   4995 
   4996 void Camera3Device::RequestThread::cleanupPhysicalSettings(sp<CaptureRequest> request,
   4997         camera3_capture_request_t *halRequest) {
   4998     if ((request == nullptr) || (halRequest == nullptr)) {
   4999         ALOGE("%s: Invalid request!", __FUNCTION__);
   5000         return;
   5001     }
   5002 
   5003     if (halRequest->num_physcam_settings > 0) {
   5004         if (halRequest->physcam_id != nullptr) {
   5005             delete [] halRequest->physcam_id;
   5006             halRequest->physcam_id = nullptr;
   5007         }
   5008         if (halRequest->physcam_settings != nullptr) {
   5009             auto it = ++(request->mSettingsList.begin());
   5010             size_t i = 0;
   5011             for (; it != request->mSettingsList.end(); it++, i++) {
   5012                 it->metadata.unlock(halRequest->physcam_settings[i]);
   5013             }
   5014             delete [] halRequest->physcam_settings;
   5015             halRequest->physcam_settings = nullptr;
   5016         }
   5017     }
   5018 }
   5019 
   5020 void Camera3Device::RequestThread::cleanUpFailedRequests(bool sendRequestError) {
   5021     if (mNextRequests.empty()) {
   5022         return;
   5023     }
   5024 
   5025     for (auto& nextRequest : mNextRequests) {
   5026         // Skip the ones that have been submitted successfully.
   5027         if (nextRequest.submitted) {
   5028             continue;
   5029         }
   5030 
   5031         sp<CaptureRequest> captureRequest = nextRequest.captureRequest;
   5032         camera3_capture_request_t* halRequest = &nextRequest.halRequest;
   5033         Vector<camera3_stream_buffer_t>* outputBuffers = &nextRequest.outputBuffers;
   5034 
   5035         if (halRequest->settings != NULL) {
   5036             captureRequest->mSettingsList.begin()->metadata.unlock(halRequest->settings);
   5037         }
   5038 
   5039         cleanupPhysicalSettings(captureRequest, halRequest);
   5040 
   5041         if (captureRequest->mInputStream != NULL) {
   5042             captureRequest->mInputBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
   5043             captureRequest->mInputStream->returnInputBuffer(captureRequest->mInputBuffer);
   5044         }
   5045 
   5046         for (size_t i = 0; i < halRequest->num_output_buffers; i++) {
   5047             //Buffers that failed processing could still have
   5048             //valid acquire fence.
   5049             int acquireFence = (*outputBuffers)[i].acquire_fence;
   5050             if (0 <= acquireFence) {
   5051                 close(acquireFence);
   5052                 outputBuffers->editItemAt(i).acquire_fence = -1;
   5053             }
   5054             outputBuffers->editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR;
   5055             captureRequest->mOutputStreams.editItemAt(i)->returnBuffer((*outputBuffers)[i], 0);
   5056         }
   5057 
   5058         if (sendRequestError) {
   5059             Mutex::Autolock l(mRequestLock);
   5060             sp<NotificationListener> listener = mListener.promote();
   5061             if (listener != NULL) {
   5062                 listener->notifyError(
   5063                         hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST,
   5064                         captureRequest->mResultExtras);
   5065             }
   5066         }
   5067 
   5068         // Remove yet-to-be submitted inflight request from inflightMap
   5069         {
   5070           sp<Camera3Device> parent = mParent.promote();
   5071           if (parent != NULL) {
   5072               Mutex::Autolock l(parent->mInFlightLock);
   5073               ssize_t idx = parent->mInFlightMap.indexOfKey(captureRequest->mResultExtras.frameNumber);
   5074               if (idx >= 0) {
   5075                   ALOGV("%s: Remove inflight request from queue: frameNumber %" PRId64,
   5076                         __FUNCTION__, captureRequest->mResultExtras.frameNumber);
   5077                   parent->removeInFlightMapEntryLocked(idx);
   5078               }
   5079           }
   5080         }
   5081     }
   5082 
   5083     Mutex::Autolock l(mRequestLock);
   5084     mNextRequests.clear();
   5085 }
   5086 
   5087 void Camera3Device::RequestThread::waitForNextRequestBatch() {
   5088     ATRACE_CALL();
   5089     // Optimized a bit for the simple steady-state case (single repeating
   5090     // request), to avoid putting that request in the queue temporarily.
   5091     Mutex::Autolock l(mRequestLock);
   5092 
   5093     assert(mNextRequests.empty());
   5094 
   5095     NextRequest nextRequest;
   5096     nextRequest.captureRequest = waitForNextRequestLocked();
   5097     if (nextRequest.captureRequest == nullptr) {
   5098         return;
   5099     }
   5100 
   5101     nextRequest.halRequest = camera3_capture_request_t();
   5102     nextRequest.submitted = false;
   5103     mNextRequests.add(nextRequest);
   5104 
   5105     // Wait for additional requests
   5106     const size_t batchSize = nextRequest.captureRequest->mBatchSize;
   5107 
   5108     for (size_t i = 1; i < batchSize; i++) {
   5109         NextRequest additionalRequest;
   5110         additionalRequest.captureRequest = waitForNextRequestLocked();
   5111         if (additionalRequest.captureRequest == nullptr) {
   5112             break;
   5113         }
   5114 
   5115         additionalRequest.halRequest = camera3_capture_request_t();
   5116         additionalRequest.submitted = false;
   5117         mNextRequests.add(additionalRequest);
   5118     }
   5119 
   5120     if (mNextRequests.size() < batchSize) {
   5121         ALOGE("RequestThread: only get %zu out of %zu requests. Skipping requests.",
   5122                 mNextRequests.size(), batchSize);
   5123         cleanUpFailedRequests(/*sendRequestError*/true);
   5124     }
   5125 
   5126     return;
   5127 }
   5128 
   5129 sp<Camera3Device::CaptureRequest>
   5130         Camera3Device::RequestThread::waitForNextRequestLocked() {
   5131     status_t res;
   5132     sp<CaptureRequest> nextRequest;
   5133 
   5134     while (mRequestQueue.empty()) {
   5135         if (!mRepeatingRequests.empty()) {
   5136             // Always atomically enqueue all requests in a repeating request
   5137             // list. Guarantees a complete in-sequence set of captures to
   5138             // application.
   5139             const RequestList &requests = mRepeatingRequests;
   5140             RequestList::const_iterator firstRequest =
   5141                     requests.begin();
   5142             nextRequest = *firstRequest;
   5143             mRequestQueue.insert(mRequestQueue.end(),
   5144                     ++firstRequest,
   5145                     requests.end());
   5146             // No need to wait any longer
   5147 
   5148             mRepeatingLastFrameNumber = mFrameNumber + requests.size() - 1;
   5149 
   5150             break;
   5151         }
   5152 
   5153         res = mRequestSignal.waitRelative(mRequestLock, kRequestTimeout);
   5154 
   5155         if ((mRequestQueue.empty() && mRepeatingRequests.empty()) ||
   5156                 exitPending()) {
   5157             Mutex::Autolock pl(mPauseLock);
   5158             if (mPaused == false) {
   5159                 ALOGV("%s: RequestThread: Going idle", __FUNCTION__);
   5160                 mPaused = true;
   5161                 // Let the tracker know
   5162                 sp<StatusTracker> statusTracker = mStatusTracker.promote();
   5163                 if (statusTracker != 0) {
   5164                     statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE);
   5165                 }
   5166             }
   5167             // Stop waiting for now and let thread management happen
   5168             return NULL;
   5169         }
   5170     }
   5171 
   5172     if (nextRequest == NULL) {
   5173         // Don't have a repeating request already in hand, so queue
   5174         // must have an entry now.
   5175         RequestList::iterator firstRequest =
   5176                 mRequestQueue.begin();
   5177         nextRequest = *firstRequest;
   5178         mRequestQueue.erase(firstRequest);
   5179         if (mRequestQueue.empty() && !nextRequest->mRepeating) {
   5180             sp<NotificationListener> listener = mListener.promote();
   5181             if (listener != NULL) {
   5182                 listener->notifyRequestQueueEmpty();
   5183             }
   5184         }
   5185     }
   5186 
   5187     // In case we've been unpaused by setPaused clearing mDoPause, need to
   5188     // update internal pause state (capture/setRepeatingRequest unpause
   5189     // directly).
   5190     Mutex::Autolock pl(mPauseLock);
   5191     if (mPaused) {
   5192         ALOGV("%s: RequestThread: Unpaused", __FUNCTION__);
   5193         sp<StatusTracker> statusTracker = mStatusTracker.promote();
   5194         if (statusTracker != 0) {
   5195             statusTracker->markComponentActive(mStatusId);
   5196         }
   5197     }
   5198     mPaused = false;
   5199 
   5200     // Check if we've reconfigured since last time, and reset the preview
   5201     // request if so. Can't use 'NULL request == repeat' across configure calls.
   5202     if (mReconfigured) {
   5203         mPrevRequest.clear();
   5204         mReconfigured = false;
   5205     }
   5206 
   5207     if (nextRequest != NULL) {
   5208         nextRequest->mResultExtras.frameNumber = mFrameNumber++;
   5209         nextRequest->mResultExtras.afTriggerId = mCurrentAfTriggerId;
   5210         nextRequest->mResultExtras.precaptureTriggerId = mCurrentPreCaptureTriggerId;
   5211 
   5212         // Since RequestThread::clear() removes buffers from the input stream,
   5213         // get the right buffer here before unlocking mRequestLock
   5214         if (nextRequest->mInputStream != NULL) {
   5215             res = nextRequest->mInputStream->getInputBuffer(&nextRequest->mInputBuffer);
   5216             if (res != OK) {
   5217                 // Can't get input buffer from gralloc queue - this could be due to
   5218                 // disconnected queue or other producer misbehavior, so not a fatal
   5219                 // error
   5220                 ALOGE("%s: Can't get input buffer, skipping request:"
   5221                         " %s (%d)", __FUNCTION__, strerror(-res), res);
   5222 
   5223                 sp<NotificationListener> listener = mListener.promote();
   5224                 if (listener != NULL) {
   5225                     listener->notifyError(
   5226                             hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST,
   5227                             nextRequest->mResultExtras);
   5228                 }
   5229                 return NULL;
   5230             }
   5231         }
   5232     }
   5233 
   5234     return nextRequest;
   5235 }
   5236 
   5237 bool Camera3Device::RequestThread::waitIfPaused() {
   5238     ATRACE_CALL();
   5239     status_t res;
   5240     Mutex::Autolock l(mPauseLock);
   5241     while (mDoPause) {
   5242         if (mPaused == false) {
   5243             mPaused = true;
   5244             ALOGV("%s: RequestThread: Paused", __FUNCTION__);
   5245             // Let the tracker know
   5246             sp<StatusTracker> statusTracker = mStatusTracker.promote();
   5247             if (statusTracker != 0) {
   5248                 statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE);
   5249             }
   5250         }
   5251 
   5252         res = mDoPauseSignal.waitRelative(mPauseLock, kRequestTimeout);
   5253         if (res == TIMED_OUT || exitPending()) {
   5254             return true;
   5255         }
   5256     }
   5257     // We don't set mPaused to false here, because waitForNextRequest needs
   5258     // to further manage the paused state in case of starvation.
   5259     return false;
   5260 }
   5261 
   5262 void Camera3Device::RequestThread::unpauseForNewRequests() {
   5263     ATRACE_CALL();
   5264     // With work to do, mark thread as unpaused.
   5265     // If paused by request (setPaused), don't resume, to avoid
   5266     // extra signaling/waiting overhead to waitUntilPaused
   5267     mRequestSignal.signal();
   5268     Mutex::Autolock p(mPauseLock);
   5269     if (!mDoPause) {
   5270         ALOGV("%s: RequestThread: Going active", __FUNCTION__);
   5271         if (mPaused) {
   5272             sp<StatusTracker> statusTracker = mStatusTracker.promote();
   5273             if (statusTracker != 0) {
   5274                 statusTracker->markComponentActive(mStatusId);
   5275             }
   5276         }
   5277         mPaused = false;
   5278     }
   5279 }
   5280 
   5281 void Camera3Device::RequestThread::setErrorState(const char *fmt, ...) {
   5282     sp<Camera3Device> parent = mParent.promote();
   5283     if (parent != NULL) {
   5284         va_list args;
   5285         va_start(args, fmt);
   5286 
   5287         parent->setErrorStateV(fmt, args);
   5288 
   5289         va_end(args);
   5290     }
   5291 }
   5292 
   5293 status_t Camera3Device::RequestThread::insertTriggers(
   5294         const sp<CaptureRequest> &request) {
   5295     ATRACE_CALL();
   5296     Mutex::Autolock al(mTriggerMutex);
   5297 
   5298     sp<Camera3Device> parent = mParent.promote();
   5299     if (parent == NULL) {
   5300         CLOGE("RequestThread: Parent is gone");
   5301         return DEAD_OBJECT;
   5302     }
   5303 
   5304     CameraMetadata &metadata = request->mSettingsList.begin()->metadata;
   5305     size_t count = mTriggerMap.size();
   5306 
   5307     for (size_t i = 0; i < count; ++i) {
   5308         RequestTrigger trigger = mTriggerMap.valueAt(i);
   5309         uint32_t tag = trigger.metadataTag;
   5310 
   5311         if (tag == ANDROID_CONTROL_AF_TRIGGER_ID || tag == ANDROID_CONTROL_AE_PRECAPTURE_ID) {
   5312             bool isAeTrigger = (trigger.metadataTag == ANDROID_CONTROL_AE_PRECAPTURE_ID);
   5313             uint32_t triggerId = static_cast<uint32_t>(trigger.entryValue);
   5314             if (isAeTrigger) {
   5315                 request->mResultExtras.precaptureTriggerId = triggerId;
   5316                 mCurrentPreCaptureTriggerId = triggerId;
   5317             } else {
   5318                 request->mResultExtras.afTriggerId = triggerId;
   5319                 mCurrentAfTriggerId = triggerId;
   5320             }
   5321             continue;
   5322         }
   5323 
   5324         camera_metadata_entry entry = metadata.find(tag);
   5325 
   5326         if (entry.count > 0) {
   5327             /**
   5328              * Already has an entry for this trigger in the request.
   5329              * Rewrite it with our requested trigger value.
   5330              */
   5331             RequestTrigger oldTrigger = trigger;
   5332 
   5333             oldTrigger.entryValue = entry.data.u8[0];
   5334 
   5335             mTriggerReplacedMap.add(tag, oldTrigger);
   5336         } else {
   5337             /**
   5338              * More typical, no trigger entry, so we just add it
   5339              */
   5340             mTriggerRemovedMap.add(tag, trigger);
   5341         }
   5342 
   5343         status_t res;
   5344 
   5345         switch (trigger.getTagType()) {
   5346             case TYPE_BYTE: {
   5347                 uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue);
   5348                 res = metadata.update(tag,
   5349                                       &entryValue,
   5350                                       /*count*/1);
   5351                 break;
   5352             }
   5353             case TYPE_INT32:
   5354                 res = metadata.update(tag,
   5355                                       &trigger.entryValue,
   5356                                       /*count*/1);
   5357                 break;
   5358             default:
   5359                 ALOGE("%s: Type not supported: 0x%x",
   5360                       __FUNCTION__,
   5361                       trigger.getTagType());
   5362                 return INVALID_OPERATION;
   5363         }
   5364 
   5365         if (res != OK) {
   5366             ALOGE("%s: Failed to update request metadata with trigger tag %s"
   5367                   ", value %d", __FUNCTION__, trigger.getTagName(),
   5368                   trigger.entryValue);
   5369             return res;
   5370         }
   5371 
   5372         ALOGV("%s: Mixed in trigger %s, value %d", __FUNCTION__,
   5373               trigger.getTagName(),
   5374               trigger.entryValue);
   5375     }
   5376 
   5377     mTriggerMap.clear();
   5378 
   5379     return count;
   5380 }
   5381 
   5382 status_t Camera3Device::RequestThread::removeTriggers(
   5383         const sp<CaptureRequest> &request) {
   5384     ATRACE_CALL();
   5385     Mutex::Autolock al(mTriggerMutex);
   5386 
   5387     CameraMetadata &metadata = request->mSettingsList.begin()->metadata;
   5388 
   5389     /**
   5390      * Replace all old entries with their old values.
   5391      */
   5392     for (size_t i = 0; i < mTriggerReplacedMap.size(); ++i) {
   5393         RequestTrigger trigger = mTriggerReplacedMap.valueAt(i);
   5394 
   5395         status_t res;
   5396 
   5397         uint32_t tag = trigger.metadataTag;
   5398         switch (trigger.getTagType()) {
   5399             case TYPE_BYTE: {
   5400                 uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue);
   5401                 res = metadata.update(tag,
   5402                                       &entryValue,
   5403                                       /*count*/1);
   5404                 break;
   5405             }
   5406             case TYPE_INT32:
   5407                 res = metadata.update(tag,
   5408                                       &trigger.entryValue,
   5409                                       /*count*/1);
   5410                 break;
   5411             default:
   5412                 ALOGE("%s: Type not supported: 0x%x",
   5413                       __FUNCTION__,
   5414                       trigger.getTagType());
   5415                 return INVALID_OPERATION;
   5416         }
   5417 
   5418         if (res != OK) {
   5419             ALOGE("%s: Failed to restore request metadata with trigger tag %s"
   5420                   ", trigger value %d", __FUNCTION__,
   5421                   trigger.getTagName(), trigger.entryValue);
   5422             return res;
   5423         }
   5424     }
   5425     mTriggerReplacedMap.clear();
   5426 
   5427     /**
   5428      * Remove all new entries.
   5429      */
   5430     for (size_t i = 0; i < mTriggerRemovedMap.size(); ++i) {
   5431         RequestTrigger trigger = mTriggerRemovedMap.valueAt(i);
   5432         status_t res = metadata.erase(trigger.metadataTag);
   5433 
   5434         if (res != OK) {
   5435             ALOGE("%s: Failed to erase metadata with trigger tag %s"
   5436                   ", trigger value %d", __FUNCTION__,
   5437                   trigger.getTagName(), trigger.entryValue);
   5438             return res;
   5439         }
   5440     }
   5441     mTriggerRemovedMap.clear();
   5442 
   5443     return OK;
   5444 }
   5445 
   5446 status_t Camera3Device::RequestThread::addDummyTriggerIds(
   5447         const sp<CaptureRequest> &request) {
   5448     // Trigger ID 0 had special meaning in the HAL2 spec, so avoid it here
   5449     static const int32_t dummyTriggerId = 1;
   5450     status_t res;
   5451 
   5452     CameraMetadata &metadata = request->mSettingsList.begin()->metadata;
   5453 
   5454     // If AF trigger is active, insert a dummy AF trigger ID if none already
   5455     // exists
   5456     camera_metadata_entry afTrigger = metadata.find(ANDROID_CONTROL_AF_TRIGGER);
   5457     camera_metadata_entry afId = metadata.find(ANDROID_CONTROL_AF_TRIGGER_ID);
   5458     if (afTrigger.count > 0 &&
   5459             afTrigger.data.u8[0] != ANDROID_CONTROL_AF_TRIGGER_IDLE &&
   5460             afId.count == 0) {
   5461         res = metadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, &dummyTriggerId, 1);
   5462         if (res != OK) return res;
   5463     }
   5464 
   5465     // If AE precapture trigger is active, insert a dummy precapture trigger ID
   5466     // if none already exists
   5467     camera_metadata_entry pcTrigger =
   5468             metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER);
   5469     camera_metadata_entry pcId = metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_ID);
   5470     if (pcTrigger.count > 0 &&
   5471             pcTrigger.data.u8[0] != ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE &&
   5472             pcId.count == 0) {
   5473         res = metadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID,
   5474                 &dummyTriggerId, 1);
   5475         if (res != OK) return res;
   5476     }
   5477 
   5478     return OK;
   5479 }
   5480 
   5481 /**
   5482  * PreparerThread inner class methods
   5483  */
   5484 
   5485 Camera3Device::PreparerThread::PreparerThread() :
   5486         Thread(/*canCallJava*/false), mListener(nullptr),
   5487         mActive(false), mCancelNow(false), mCurrentMaxCount(0), mCurrentPrepareComplete(false) {
   5488 }
   5489 
   5490 Camera3Device::PreparerThread::~PreparerThread() {
   5491     Thread::requestExitAndWait();
   5492     if (mCurrentStream != nullptr) {
   5493         mCurrentStream->cancelPrepare();
   5494         ATRACE_ASYNC_END("stream prepare", mCurrentStream->getId());
   5495         mCurrentStream.clear();
   5496     }
   5497     clear();
   5498 }
   5499 
   5500 status_t Camera3Device::PreparerThread::prepare(int maxCount, sp<Camera3StreamInterface>& stream) {
   5501     ATRACE_CALL();
   5502     status_t res;
   5503 
   5504     Mutex::Autolock l(mLock);
   5505     sp<NotificationListener> listener = mListener.promote();
   5506 
   5507     res = stream->startPrepare(maxCount);
   5508     if (res == OK) {
   5509         // No preparation needed, fire listener right off
   5510         ALOGV("%s: Stream %d already prepared", __FUNCTION__, stream->getId());
   5511         if (listener != NULL) {
   5512             listener->notifyPrepared(stream->getId());
   5513         }
   5514         return OK;
   5515     } else if (res != NOT_ENOUGH_DATA) {
   5516         return res;
   5517     }
   5518 
   5519     // Need to prepare, start up thread if necessary
   5520     if (!mActive) {
   5521         // mRunning will change to false before the thread fully shuts down, so wait to be sure it
   5522         // isn't running
   5523         Thread::requestExitAndWait();
   5524         res = Thread::run("C3PrepThread", PRIORITY_BACKGROUND);
   5525         if (res != OK) {
   5526             ALOGE("%s: Unable to start preparer stream: %d (%s)", __FUNCTION__, res, strerror(-res));
   5527             if (listener != NULL) {
   5528                 listener->notifyPrepared(stream->getId());
   5529             }
   5530             return res;
   5531         }
   5532         mCancelNow = false;
   5533         mActive = true;
   5534         ALOGV("%s: Preparer stream started", __FUNCTION__);
   5535     }
   5536 
   5537     // queue up the work
   5538     mPendingStreams.emplace(maxCount, stream);
   5539     ALOGV("%s: Stream %d queued for preparing", __FUNCTION__, stream->getId());
   5540 
   5541     return OK;
   5542 }
   5543 
   5544 void Camera3Device::PreparerThread::pause() {
   5545     ATRACE_CALL();
   5546 
   5547     Mutex::Autolock l(mLock);
   5548 
   5549     std::unordered_map<int, sp<camera3::Camera3StreamInterface> > pendingStreams;
   5550     pendingStreams.insert(mPendingStreams.begin(), mPendingStreams.end());
   5551     sp<camera3::Camera3StreamInterface> currentStream = mCurrentStream;
   5552     int currentMaxCount = mCurrentMaxCount;
   5553     mPendingStreams.clear();
   5554     mCancelNow = true;
   5555     while (mActive) {
   5556         auto res = mThreadActiveSignal.waitRelative(mLock, kActiveTimeout);
   5557         if (res == TIMED_OUT) {
   5558             ALOGE("%s: Timed out waiting on prepare thread!", __FUNCTION__);
   5559             return;
   5560         } else if (res != OK) {
   5561             ALOGE("%s: Encountered an error: %d waiting on prepare thread!", __FUNCTION__, res);
   5562             return;
   5563         }
   5564     }
   5565 
   5566     //Check whether the prepare thread was able to complete the current
   5567     //stream. In case work is still pending emplace it along with the rest
   5568     //of the streams in the pending list.
   5569     if (currentStream != nullptr) {
   5570         if (!mCurrentPrepareComplete) {
   5571             pendingStreams.emplace(currentMaxCount, currentStream);
   5572         }
   5573     }
   5574 
   5575     mPendingStreams.insert(pendingStreams.begin(), pendingStreams.end());
   5576     for (const auto& it : mPendingStreams) {
   5577         it.second->cancelPrepare();
   5578     }
   5579 }
   5580 
   5581 status_t Camera3Device::PreparerThread::resume() {
   5582     ATRACE_CALL();
   5583     status_t res;
   5584 
   5585     Mutex::Autolock l(mLock);
   5586     sp<NotificationListener> listener = mListener.promote();
   5587 
   5588     if (mActive) {
   5589         ALOGE("%s: Trying to resume an already active prepare thread!", __FUNCTION__);
   5590         return NO_INIT;
   5591     }
   5592 
   5593     auto it = mPendingStreams.begin();
   5594     for (; it != mPendingStreams.end();) {
   5595         res = it->second->startPrepare(it->first);
   5596         if (res == OK) {
   5597             if (listener != NULL) {
   5598                 listener->notifyPrepared(it->second->getId());
   5599             }
   5600             it = mPendingStreams.erase(it);
   5601         } else if (res != NOT_ENOUGH_DATA) {
   5602             ALOGE("%s: Unable to start preparer stream: %d (%s)", __FUNCTION__,
   5603                     res, strerror(-res));
   5604             it = mPendingStreams.erase(it);
   5605         } else {
   5606             it++;
   5607         }
   5608     }
   5609 
   5610     if (mPendingStreams.empty()) {
   5611         return OK;
   5612     }
   5613 
   5614     res = Thread::run("C3PrepThread", PRIORITY_BACKGROUND);
   5615     if (res != OK) {
   5616         ALOGE("%s: Unable to start preparer stream: %d (%s)",
   5617                 __FUNCTION__, res, strerror(-res));
   5618         return res;
   5619     }
   5620     mCancelNow = false;
   5621     mActive = true;
   5622     ALOGV("%s: Preparer stream started", __FUNCTION__);
   5623 
   5624     return OK;
   5625 }
   5626 
   5627 status_t Camera3Device::PreparerThread::clear() {
   5628     ATRACE_CALL();
   5629     Mutex::Autolock l(mLock);
   5630 
   5631     for (const auto& it : mPendingStreams) {
   5632         it.second->cancelPrepare();
   5633     }
   5634     mPendingStreams.clear();
   5635     mCancelNow = true;
   5636 
   5637     return OK;
   5638 }
   5639 
   5640 void Camera3Device::PreparerThread::setNotificationListener(wp<NotificationListener> listener) {
   5641     ATRACE_CALL();
   5642     Mutex::Autolock l(mLock);
   5643     mListener = listener;
   5644 }
   5645 
   5646 bool Camera3Device::PreparerThread::threadLoop() {
   5647     status_t res;
   5648     {
   5649         Mutex::Autolock l(mLock);
   5650         if (mCurrentStream == nullptr) {
   5651             // End thread if done with work
   5652             if (mPendingStreams.empty()) {
   5653                 ALOGV("%s: Preparer stream out of work", __FUNCTION__);
   5654                 // threadLoop _must not_ re-acquire mLock after it sets mActive to false; would
   5655                 // cause deadlock with prepare()'s requestExitAndWait triggered by !mActive.
   5656                 mActive = false;
   5657                 mThreadActiveSignal.signal();
   5658                 return false;
   5659             }
   5660 
   5661             // Get next stream to prepare
   5662             auto it = mPendingStreams.begin();
   5663             mCurrentStream = it->second;
   5664             mCurrentMaxCount = it->first;
   5665             mCurrentPrepareComplete = false;
   5666             mPendingStreams.erase(it);
   5667             ATRACE_ASYNC_BEGIN("stream prepare", mCurrentStream->getId());
   5668             ALOGV("%s: Preparing stream %d", __FUNCTION__, mCurrentStream->getId());
   5669         } else if (mCancelNow) {
   5670             mCurrentStream->cancelPrepare();
   5671             ATRACE_ASYNC_END("stream prepare", mCurrentStream->getId());
   5672             ALOGV("%s: Cancelling stream %d prepare", __FUNCTION__, mCurrentStream->getId());
   5673             mCurrentStream.clear();
   5674             mCancelNow = false;
   5675             return true;
   5676         }
   5677     }
   5678 
   5679     res = mCurrentStream->prepareNextBuffer();
   5680     if (res == NOT_ENOUGH_DATA) return true;
   5681     if (res != OK) {
   5682         // Something bad happened; try to recover by cancelling prepare and
   5683         // signalling listener anyway
   5684         ALOGE("%s: Stream %d returned error %d (%s) during prepare", __FUNCTION__,
   5685                 mCurrentStream->getId(), res, strerror(-res));
   5686         mCurrentStream->cancelPrepare();
   5687     }
   5688 
   5689     // This stream has finished, notify listener
   5690     Mutex::Autolock l(mLock);
   5691     sp<NotificationListener> listener = mListener.promote();
   5692     if (listener != NULL) {
   5693         ALOGV("%s: Stream %d prepare done, signaling listener", __FUNCTION__,
   5694                 mCurrentStream->getId());
   5695         listener->notifyPrepared(mCurrentStream->getId());
   5696     }
   5697 
   5698     ATRACE_ASYNC_END("stream prepare", mCurrentStream->getId());
   5699     mCurrentStream.clear();
   5700     mCurrentPrepareComplete = true;
   5701 
   5702     return true;
   5703 }
   5704 
   5705 /**
   5706  * Static callback forwarding methods from HAL to instance
   5707  */
   5708 
   5709 void Camera3Device::sProcessCaptureResult(const camera3_callback_ops *cb,
   5710         const camera3_capture_result *result) {
   5711     Camera3Device *d =
   5712             const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb));
   5713 
   5714     d->processCaptureResult(result);
   5715 }
   5716 
   5717 void Camera3Device::sNotify(const camera3_callback_ops *cb,
   5718         const camera3_notify_msg *msg) {
   5719     Camera3Device *d =
   5720             const_cast<Camera3Device*>(static_cast<const Camera3Device*>(cb));
   5721     d->notify(msg);
   5722 }
   5723 
   5724 }; // namespace android
   5725