Home | History | Annotate | Download | only in client2
      1 /*
      2  * Copyright (C) 2013 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 "Camera2-ZslProcessor"
     18 #define ATRACE_TAG ATRACE_TAG_CAMERA
     19 //#define LOG_NDEBUG 0
     20 //#define LOG_NNDEBUG 0
     21 
     22 #ifdef LOG_NNDEBUG
     23 #define ALOGVV(...) ALOGV(__VA_ARGS__)
     24 #else
     25 #define ALOGVV(...) if (0) ALOGV(__VA_ARGS__)
     26 #endif
     27 
     28 #include <inttypes.h>
     29 
     30 #include <utils/Log.h>
     31 #include <utils/Trace.h>
     32 #include <gui/Surface.h>
     33 
     34 #include "common/CameraDeviceBase.h"
     35 #include "api1/Camera2Client.h"
     36 #include "api1/client2/CaptureSequencer.h"
     37 #include "api1/client2/ZslProcessor.h"
     38 #include "device3/Camera3Device.h"
     39 
     40 typedef android::RingBufferConsumer::PinnedBufferItem PinnedBufferItem;
     41 
     42 namespace android {
     43 namespace camera2 {
     44 
     45 namespace {
     46 struct TimestampFinder : public RingBufferConsumer::RingBufferComparator {
     47     typedef RingBufferConsumer::BufferInfo BufferInfo;
     48 
     49     enum {
     50         SELECT_I1 = -1,
     51         SELECT_I2 = 1,
     52         SELECT_NEITHER = 0,
     53     };
     54 
     55     explicit TimestampFinder(nsecs_t timestamp) : mTimestamp(timestamp) {}
     56     ~TimestampFinder() {}
     57 
     58     template <typename T>
     59     static void swap(T& a, T& b) {
     60         T tmp = a;
     61         a = b;
     62         b = tmp;
     63     }
     64 
     65     /**
     66      * Try to find the best candidate for a ZSL buffer.
     67      * Match priority from best to worst:
     68      *  1) Timestamps match.
     69      *  2) Timestamp is closest to the needle (and lower).
     70      *  3) Timestamp is closest to the needle (and higher).
     71      *
     72      */
     73     virtual int compare(const BufferInfo *i1,
     74                         const BufferInfo *i2) const {
     75         // Try to select non-null object first.
     76         if (i1 == NULL) {
     77             return SELECT_I2;
     78         } else if (i2 == NULL) {
     79             return SELECT_I1;
     80         }
     81 
     82         // Best result: timestamp is identical
     83         if (i1->mTimestamp == mTimestamp) {
     84             return SELECT_I1;
     85         } else if (i2->mTimestamp == mTimestamp) {
     86             return SELECT_I2;
     87         }
     88 
     89         const BufferInfo* infoPtrs[2] = {
     90             i1,
     91             i2
     92         };
     93         int infoSelectors[2] = {
     94             SELECT_I1,
     95             SELECT_I2
     96         };
     97 
     98         // Order i1,i2 so that always i1.timestamp < i2.timestamp
     99         if (i1->mTimestamp > i2->mTimestamp) {
    100             swap(infoPtrs[0], infoPtrs[1]);
    101             swap(infoSelectors[0], infoSelectors[1]);
    102         }
    103 
    104         // Second best: closest (lower) timestamp
    105         if (infoPtrs[1]->mTimestamp < mTimestamp) {
    106             return infoSelectors[1];
    107         } else if (infoPtrs[0]->mTimestamp < mTimestamp) {
    108             return infoSelectors[0];
    109         }
    110 
    111         // Worst: closest (higher) timestamp
    112         return infoSelectors[0];
    113 
    114         /**
    115          * The above cases should cover all the possibilities,
    116          * and we get an 'empty' result only if the ring buffer
    117          * was empty itself
    118          */
    119     }
    120 
    121     const nsecs_t mTimestamp;
    122 }; // struct TimestampFinder
    123 } // namespace anonymous
    124 
    125 ZslProcessor::ZslProcessor(
    126     sp<Camera2Client> client,
    127     wp<CaptureSequencer> sequencer):
    128         Thread(false),
    129         mLatestClearedBufferTimestamp(0),
    130         mState(RUNNING),
    131         mClient(client),
    132         mSequencer(sequencer),
    133         mId(client->getCameraId()),
    134         mZslStreamId(NO_STREAM),
    135         mInputStreamId(NO_STREAM),
    136         mFrameListHead(0),
    137         mHasFocuser(false),
    138         mInputBuffer(nullptr),
    139         mProducer(nullptr),
    140         mInputProducer(nullptr),
    141         mInputProducerSlot(-1),
    142         mBuffersToDetach(0) {
    143     // Initialize buffer queue and frame list based on pipeline max depth.
    144     size_t pipelineMaxDepth = kDefaultMaxPipelineDepth;
    145     if (client != 0) {
    146         sp<Camera3Device> device =
    147         static_cast<Camera3Device*>(client->getCameraDevice().get());
    148         if (device != 0) {
    149             camera_metadata_ro_entry_t entry =
    150                 device->info().find(ANDROID_REQUEST_PIPELINE_MAX_DEPTH);
    151             if (entry.count == 1) {
    152                 pipelineMaxDepth = entry.data.u8[0];
    153             } else {
    154                 ALOGW("%s: Unable to find the android.request.pipelineMaxDepth,"
    155                         " use default pipeline max depth %d", __FUNCTION__,
    156                         kDefaultMaxPipelineDepth);
    157             }
    158 
    159             entry = device->info().find(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE);
    160             if (entry.count > 0 && entry.data.f[0] != 0.) {
    161                 mHasFocuser = true;
    162             }
    163         }
    164     }
    165 
    166     ALOGV("%s: Initialize buffer queue and frame list depth based on max pipeline depth (%zu)",
    167           __FUNCTION__, pipelineMaxDepth);
    168     // Need to keep buffer queue longer than metadata queue because sometimes buffer arrives
    169     // earlier than metadata which causes the buffer corresponding to oldest metadata being
    170     // removed.
    171     mFrameListDepth = pipelineMaxDepth;
    172     mBufferQueueDepth = mFrameListDepth + 1;
    173 
    174     mZslQueue.insertAt(0, mBufferQueueDepth);
    175     mFrameList.insertAt(0, mFrameListDepth);
    176     sp<CaptureSequencer> captureSequencer = mSequencer.promote();
    177     if (captureSequencer != 0) captureSequencer->setZslProcessor(this);
    178 }
    179 
    180 ZslProcessor::~ZslProcessor() {
    181     ALOGV("%s: Exit", __FUNCTION__);
    182     deleteStream();
    183 }
    184 
    185 void ZslProcessor::onResultAvailable(const CaptureResult &result) {
    186     ATRACE_CALL();
    187     ALOGV("%s:", __FUNCTION__);
    188     Mutex::Autolock l(mInputMutex);
    189     camera_metadata_ro_entry_t entry;
    190     entry = result.mMetadata.find(ANDROID_SENSOR_TIMESTAMP);
    191     nsecs_t timestamp = entry.data.i64[0];
    192     if (entry.count == 0) {
    193         ALOGE("%s: metadata doesn't have timestamp, skip this result", __FUNCTION__);
    194         return;
    195     }
    196 
    197     entry = result.mMetadata.find(ANDROID_REQUEST_FRAME_COUNT);
    198     if (entry.count == 0) {
    199         ALOGE("%s: metadata doesn't have frame number, skip this result", __FUNCTION__);
    200         return;
    201     }
    202     int32_t frameNumber = entry.data.i32[0];
    203 
    204     ALOGVV("Got preview metadata for frame %d with timestamp %" PRId64, frameNumber, timestamp);
    205 
    206     if (mState != RUNNING) return;
    207 
    208     // Corresponding buffer has been cleared. No need to push into mFrameList
    209     if (timestamp <= mLatestClearedBufferTimestamp) return;
    210 
    211     mFrameList.editItemAt(mFrameListHead) = result.mMetadata;
    212     mFrameListHead = (mFrameListHead + 1) % mFrameListDepth;
    213 }
    214 
    215 status_t ZslProcessor::updateStream(const Parameters &params) {
    216     ATRACE_CALL();
    217     ALOGV("%s: Configuring ZSL streams", __FUNCTION__);
    218     status_t res;
    219 
    220     Mutex::Autolock l(mInputMutex);
    221 
    222     sp<Camera2Client> client = mClient.promote();
    223     if (client == 0) {
    224         ALOGE("%s: Camera %d: Client does not exist", __FUNCTION__, mId);
    225         return INVALID_OPERATION;
    226     }
    227     sp<Camera3Device> device =
    228         static_cast<Camera3Device*>(client->getCameraDevice().get());
    229     if (device == 0) {
    230         ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId);
    231         return INVALID_OPERATION;
    232     }
    233 
    234     if ((mZslStreamId != NO_STREAM) || (mInputStreamId != NO_STREAM)) {
    235         // Check if stream parameters have to change
    236         uint32_t currentWidth, currentHeight;
    237         res = device->getStreamInfo(mZslStreamId,
    238                 &currentWidth, &currentHeight, 0, 0);
    239         if (res != OK) {
    240             ALOGE("%s: Camera %d: Error querying capture output stream info: "
    241                     "%s (%d)", __FUNCTION__,
    242                     client->getCameraId(), strerror(-res), res);
    243             return res;
    244         }
    245         if (currentWidth != (uint32_t)params.fastInfo.arrayWidth ||
    246                 currentHeight != (uint32_t)params.fastInfo.arrayHeight) {
    247             if (mZslStreamId != NO_STREAM) {
    248                 ALOGV("%s: Camera %d: Deleting stream %d since the buffer "
    249                       "dimensions changed",
    250                     __FUNCTION__, client->getCameraId(), mZslStreamId);
    251                 res = device->deleteStream(mZslStreamId);
    252                 if (res == -EBUSY) {
    253                     ALOGV("%s: Camera %d: Device is busy, call updateStream again "
    254                           " after it becomes idle", __FUNCTION__, mId);
    255                     return res;
    256                 } else if(res != OK) {
    257                     ALOGE("%s: Camera %d: Unable to delete old output stream "
    258                             "for ZSL: %s (%d)", __FUNCTION__,
    259                             client->getCameraId(), strerror(-res), res);
    260                     return res;
    261                 }
    262                 mZslStreamId = NO_STREAM;
    263             }
    264 
    265             if (mInputStreamId != NO_STREAM) {
    266                 ALOGV("%s: Camera %d: Deleting stream %d since the buffer "
    267                       "dimensions changed",
    268                     __FUNCTION__, client->getCameraId(), mInputStreamId);
    269                 res = device->deleteStream(mInputStreamId);
    270                 if (res == -EBUSY) {
    271                     ALOGV("%s: Camera %d: Device is busy, call updateStream again "
    272                           " after it becomes idle", __FUNCTION__, mId);
    273                     return res;
    274                 } else if(res != OK) {
    275                     ALOGE("%s: Camera %d: Unable to delete old output stream "
    276                             "for ZSL: %s (%d)", __FUNCTION__,
    277                             client->getCameraId(), strerror(-res), res);
    278                     return res;
    279                 }
    280                 mInputStreamId = NO_STREAM;
    281             }
    282             if (nullptr != mInputProducer.get()) {
    283                 mInputProducer->disconnect(NATIVE_WINDOW_API_CPU);
    284                 mInputProducer.clear();
    285             }
    286         }
    287     }
    288 
    289     if (mInputStreamId == NO_STREAM) {
    290         res = device->createInputStream(params.fastInfo.arrayWidth,
    291             params.fastInfo.arrayHeight, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
    292             &mInputStreamId);
    293         if (res != OK) {
    294             ALOGE("%s: Camera %d: Can't create input stream: "
    295                     "%s (%d)", __FUNCTION__, client->getCameraId(),
    296                     strerror(-res), res);
    297             return res;
    298         }
    299     }
    300 
    301     if (mZslStreamId == NO_STREAM) {
    302         // Create stream for HAL production
    303         // TODO: Sort out better way to select resolution for ZSL
    304 
    305         sp<IGraphicBufferProducer> producer;
    306         sp<IGraphicBufferConsumer> consumer;
    307         BufferQueue::createBufferQueue(&producer, &consumer);
    308         mProducer = new RingBufferConsumer(consumer, GRALLOC_USAGE_HW_CAMERA_ZSL,
    309             mBufferQueueDepth);
    310         mProducer->setName(String8("Camera2-ZslRingBufferConsumer"));
    311         sp<Surface> outSurface = new Surface(producer);
    312 
    313         res = device->createStream(outSurface, params.fastInfo.arrayWidth,
    314             params.fastInfo.arrayHeight, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
    315             HAL_DATASPACE_UNKNOWN, CAMERA3_STREAM_ROTATION_0, &mZslStreamId);
    316         if (res != OK) {
    317             ALOGE("%s: Camera %d: Can't create ZSL stream: "
    318                     "%s (%d)", __FUNCTION__, client->getCameraId(),
    319                     strerror(-res), res);
    320             return res;
    321         }
    322     }
    323 
    324     client->registerFrameListener(Camera2Client::kPreviewRequestIdStart,
    325             Camera2Client::kPreviewRequestIdEnd,
    326             this,
    327             /*sendPartials*/false);
    328 
    329     return OK;
    330 }
    331 
    332 status_t ZslProcessor::deleteStream() {
    333     ATRACE_CALL();
    334     status_t res;
    335     sp<Camera3Device> device = nullptr;
    336     sp<Camera2Client> client = nullptr;
    337 
    338     Mutex::Autolock l(mInputMutex);
    339 
    340     if ((mZslStreamId != NO_STREAM) || (mInputStreamId != NO_STREAM)) {
    341         client = mClient.promote();
    342         if (client == 0) {
    343             ALOGE("%s: Camera %d: Client does not exist", __FUNCTION__, mId);
    344             return INVALID_OPERATION;
    345         }
    346 
    347         device =
    348             reinterpret_cast<Camera3Device*>(client->getCameraDevice().get());
    349         if (device == 0) {
    350             ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId);
    351             return INVALID_OPERATION;
    352         }
    353     }
    354 
    355     if (mZslStreamId != NO_STREAM) {
    356         res = device->deleteStream(mZslStreamId);
    357         if (res != OK) {
    358             ALOGE("%s: Camera %d: Cannot delete ZSL output stream %d: "
    359                     "%s (%d)", __FUNCTION__, client->getCameraId(),
    360                     mZslStreamId, strerror(-res), res);
    361             return res;
    362         }
    363 
    364         mZslStreamId = NO_STREAM;
    365     }
    366     if (mInputStreamId != NO_STREAM) {
    367         res = device->deleteStream(mInputStreamId);
    368         if (res != OK) {
    369             ALOGE("%s: Camera %d: Cannot delete input stream %d: "
    370                     "%s (%d)", __FUNCTION__, client->getCameraId(),
    371                     mInputStreamId, strerror(-res), res);
    372             return res;
    373         }
    374 
    375         mInputStreamId = NO_STREAM;
    376     }
    377 
    378     if (nullptr != mInputProducer.get()) {
    379         mInputProducer->disconnect(NATIVE_WINDOW_API_CPU);
    380         mInputProducer.clear();
    381     }
    382 
    383     return OK;
    384 }
    385 
    386 int ZslProcessor::getStreamId() const {
    387     Mutex::Autolock l(mInputMutex);
    388     return mZslStreamId;
    389 }
    390 
    391 status_t ZslProcessor::updateRequestWithDefaultStillRequest(CameraMetadata &request) const {
    392     sp<Camera2Client> client = mClient.promote();
    393     if (client == 0) {
    394         ALOGE("%s: Camera %d: Client does not exist", __FUNCTION__, mId);
    395         return INVALID_OPERATION;
    396     }
    397     sp<Camera3Device> device =
    398         static_cast<Camera3Device*>(client->getCameraDevice().get());
    399     if (device == 0) {
    400         ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId);
    401         return INVALID_OPERATION;
    402     }
    403 
    404     CameraMetadata stillTemplate;
    405     device->createDefaultRequest(CAMERA3_TEMPLATE_STILL_CAPTURE, &stillTemplate);
    406 
    407     // Find some of the post-processing tags, and assign the value from template to the request.
    408     // Only check the aberration mode and noise reduction mode for now, as they are very important
    409     // for image quality.
    410     uint32_t postProcessingTags[] = {
    411             ANDROID_NOISE_REDUCTION_MODE,
    412             ANDROID_COLOR_CORRECTION_ABERRATION_MODE,
    413             ANDROID_COLOR_CORRECTION_MODE,
    414             ANDROID_TONEMAP_MODE,
    415             ANDROID_SHADING_MODE,
    416             ANDROID_HOT_PIXEL_MODE,
    417             ANDROID_EDGE_MODE
    418     };
    419 
    420     camera_metadata_entry_t entry;
    421     for (size_t i = 0; i < sizeof(postProcessingTags) / sizeof(uint32_t); i++) {
    422         entry = stillTemplate.find(postProcessingTags[i]);
    423         if (entry.count > 0) {
    424             request.update(postProcessingTags[i], entry.data.u8, 1);
    425         }
    426     }
    427 
    428     return OK;
    429 }
    430 
    431 void ZslProcessor::notifyInputReleased() {
    432     Mutex::Autolock l(mInputMutex);
    433 
    434     mBuffersToDetach++;
    435     mBuffersToDetachSignal.signal();
    436 }
    437 
    438 void ZslProcessor::doNotifyInputReleasedLocked() {
    439     assert(nullptr != mInputBuffer.get());
    440     assert(nullptr != mInputProducer.get());
    441 
    442     sp<GraphicBuffer> gb;
    443     sp<Fence> fence;
    444     auto rc = mInputProducer->detachNextBuffer(&gb, &fence);
    445     if (NO_ERROR != rc) {
    446         ALOGE("%s: Failed to detach buffer from input producer: %d",
    447             __FUNCTION__, rc);
    448         return;
    449     }
    450 
    451     BufferItem &item = mInputBuffer->getBufferItem();
    452     sp<GraphicBuffer> inputBuffer = item.mGraphicBuffer;
    453     if (gb->handle != inputBuffer->handle) {
    454         ALOGE("%s: Input mismatch, expected buffer %p received %p", __FUNCTION__,
    455             inputBuffer->handle, gb->handle);
    456         return;
    457     }
    458 
    459     mInputBuffer.clear();
    460     ALOGV("%s: Memory optimization, clearing ZSL queue",
    461           __FUNCTION__);
    462     clearZslResultQueueLocked();
    463 
    464     // Required so we accept more ZSL requests
    465     mState = RUNNING;
    466 }
    467 
    468 void ZslProcessor::InputProducerListener::onBufferReleased() {
    469     sp<ZslProcessor> parent = mParent.promote();
    470     if (nullptr != parent.get()) {
    471         parent->notifyInputReleased();
    472     }
    473 }
    474 
    475 status_t ZslProcessor::pushToReprocess(int32_t requestId) {
    476     ALOGV("%s: Send in reprocess request with id %d",
    477             __FUNCTION__, requestId);
    478     Mutex::Autolock l(mInputMutex);
    479     status_t res;
    480     sp<Camera2Client> client = mClient.promote();
    481 
    482     if (client == 0) {
    483         ALOGE("%s: Camera %d: Client does not exist", __FUNCTION__, mId);
    484         return INVALID_OPERATION;
    485     }
    486 
    487     IF_ALOGV() {
    488         dumpZslQueue(-1);
    489     }
    490 
    491     size_t metadataIdx;
    492     nsecs_t candidateTimestamp = getCandidateTimestampLocked(&metadataIdx);
    493 
    494     if (candidateTimestamp == -1) {
    495         ALOGV("%s: Could not find good candidate for ZSL reprocessing",
    496               __FUNCTION__);
    497         return NOT_ENOUGH_DATA;
    498     } else {
    499         ALOGV("%s: Found good ZSL candidate idx: %u",
    500             __FUNCTION__, (unsigned int) metadataIdx);
    501     }
    502 
    503     if (nullptr == mInputProducer.get()) {
    504         res = client->getCameraDevice()->getInputBufferProducer(
    505             &mInputProducer);
    506         if (res != OK) {
    507             ALOGE("%s: Camera %d: Unable to retrieve input producer: "
    508                     "%s (%d)", __FUNCTION__, client->getCameraId(),
    509                     strerror(-res), res);
    510             return res;
    511         }
    512 
    513         IGraphicBufferProducer::QueueBufferOutput output;
    514         res = mInputProducer->connect(new InputProducerListener(this),
    515             NATIVE_WINDOW_API_CPU, false, &output);
    516         if (res != OK) {
    517             ALOGE("%s: Camera %d: Unable to connect to input producer: "
    518                     "%s (%d)", __FUNCTION__, client->getCameraId(),
    519                     strerror(-res), res);
    520             return res;
    521         }
    522     }
    523 
    524     res = enqueueInputBufferByTimestamp(candidateTimestamp,
    525         /*actualTimestamp*/NULL);
    526     if (res == NO_BUFFER_AVAILABLE) {
    527         ALOGV("%s: No ZSL buffers yet", __FUNCTION__);
    528         return NOT_ENOUGH_DATA;
    529     } else if (res != OK) {
    530         ALOGE("%s: Unable to push buffer for reprocessing: %s (%d)",
    531                 __FUNCTION__, strerror(-res), res);
    532         return res;
    533     }
    534 
    535     {
    536         CameraMetadata request = mFrameList[metadataIdx];
    537 
    538         // Verify that the frame is reasonable for reprocessing
    539 
    540         camera_metadata_entry_t entry;
    541         entry = request.find(ANDROID_CONTROL_AE_STATE);
    542         if (entry.count == 0) {
    543             ALOGE("%s: ZSL queue frame has no AE state field!",
    544                     __FUNCTION__);
    545             return BAD_VALUE;
    546         }
    547         if (entry.data.u8[0] != ANDROID_CONTROL_AE_STATE_CONVERGED &&
    548                 entry.data.u8[0] != ANDROID_CONTROL_AE_STATE_LOCKED) {
    549             ALOGV("%s: ZSL queue frame AE state is %d, need full capture",
    550                     __FUNCTION__, entry.data.u8[0]);
    551             return NOT_ENOUGH_DATA;
    552         }
    553 
    554         uint8_t requestType = ANDROID_REQUEST_TYPE_REPROCESS;
    555         res = request.update(ANDROID_REQUEST_TYPE,
    556                 &requestType, 1);
    557         if (res != OK) {
    558             ALOGE("%s: Unable to update request type",
    559                   __FUNCTION__);
    560             return INVALID_OPERATION;
    561         }
    562 
    563         int32_t inputStreams[1] =
    564                 { mInputStreamId };
    565         res = request.update(ANDROID_REQUEST_INPUT_STREAMS,
    566                 inputStreams, 1);
    567         if (res != OK) {
    568             ALOGE("%s: Unable to update request input streams",
    569                   __FUNCTION__);
    570             return INVALID_OPERATION;
    571         }
    572 
    573         uint8_t captureIntent =
    574                 static_cast<uint8_t>(ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
    575         res = request.update(ANDROID_CONTROL_CAPTURE_INTENT,
    576                 &captureIntent, 1);
    577         if (res != OK ) {
    578             ALOGE("%s: Unable to update request capture intent",
    579                   __FUNCTION__);
    580             return INVALID_OPERATION;
    581         }
    582 
    583         // TODO: Shouldn't we also update the latest preview frame?
    584         int32_t outputStreams[1] =
    585                 { client->getCaptureStreamId() };
    586         res = request.update(ANDROID_REQUEST_OUTPUT_STREAMS,
    587                 outputStreams, 1);
    588         if (res != OK) {
    589             ALOGE("%s: Unable to update request output streams",
    590                   __FUNCTION__);
    591             return INVALID_OPERATION;
    592         }
    593 
    594         res = request.update(ANDROID_REQUEST_ID,
    595                 &requestId, 1);
    596         if (res != OK ) {
    597             ALOGE("%s: Unable to update frame to a reprocess request",
    598                   __FUNCTION__);
    599             return INVALID_OPERATION;
    600         }
    601 
    602         res = client->stopStream();
    603         if (res != OK) {
    604             ALOGE("%s: Camera %d: Unable to stop preview for ZSL capture: "
    605                 "%s (%d)",
    606                 __FUNCTION__, client->getCameraId(), strerror(-res), res);
    607             return INVALID_OPERATION;
    608         }
    609 
    610         // Update JPEG settings
    611         {
    612             SharedParameters::Lock l(client->getParameters());
    613             res = l.mParameters.updateRequestJpeg(&request);
    614             if (res != OK) {
    615                 ALOGE("%s: Camera %d: Unable to update JPEG entries of ZSL "
    616                         "capture request: %s (%d)", __FUNCTION__,
    617                         client->getCameraId(),
    618                         strerror(-res), res);
    619                 return res;
    620             }
    621         }
    622 
    623         // Update post-processing settings
    624         res = updateRequestWithDefaultStillRequest(request);
    625         if (res != OK) {
    626             ALOGW("%s: Unable to update post-processing tags, the reprocessed image quality "
    627                     "may be compromised", __FUNCTION__);
    628         }
    629 
    630         mLatestCapturedRequest = request;
    631         res = client->getCameraDevice()->capture(request);
    632         if (res != OK ) {
    633             ALOGE("%s: Unable to send ZSL reprocess request to capture: %s"
    634                   " (%d)", __FUNCTION__, strerror(-res), res);
    635             return res;
    636         }
    637 
    638         mState = LOCKED;
    639     }
    640 
    641     return OK;
    642 }
    643 
    644 status_t ZslProcessor::enqueueInputBufferByTimestamp(
    645         nsecs_t timestamp,
    646         nsecs_t* actualTimestamp) {
    647 
    648     TimestampFinder timestampFinder = TimestampFinder(timestamp);
    649 
    650     mInputBuffer = mProducer->pinSelectedBuffer(timestampFinder,
    651         /*waitForFence*/false);
    652 
    653     if (nullptr == mInputBuffer.get()) {
    654         ALOGE("%s: No ZSL buffers were available yet", __FUNCTION__);
    655         return NO_BUFFER_AVAILABLE;
    656     }
    657 
    658     nsecs_t actual = mInputBuffer->getBufferItem().mTimestamp;
    659 
    660     if (actual != timestamp) {
    661         // TODO: This is problematic, the metadata queue timestamp should
    662         //       usually have a corresponding ZSL buffer with the same timestamp.
    663         //       If this is not the case, then it is possible that we will use
    664         //       a ZSL buffer from a different request, which can result in
    665         //       side effects during the reprocess pass.
    666         ALOGW("%s: ZSL buffer candidate search didn't find an exact match --"
    667               " requested timestamp = %" PRId64 ", actual timestamp = %" PRId64,
    668               __FUNCTION__, timestamp, actual);
    669     }
    670 
    671     if (nullptr != actualTimestamp) {
    672         *actualTimestamp = actual;
    673     }
    674 
    675     BufferItem &item = mInputBuffer->getBufferItem();
    676     auto rc = mInputProducer->attachBuffer(&mInputProducerSlot,
    677         item.mGraphicBuffer);
    678     if (OK != rc) {
    679         ALOGE("%s: Failed to attach input ZSL buffer to producer: %d",
    680             __FUNCTION__, rc);
    681         return rc;
    682     }
    683 
    684     IGraphicBufferProducer::QueueBufferOutput output;
    685     IGraphicBufferProducer::QueueBufferInput input(item.mTimestamp,
    686             item.mIsAutoTimestamp, item.mDataSpace, item.mCrop,
    687             item.mScalingMode, item.mTransform, item.mFence);
    688     rc = mInputProducer->queueBuffer(mInputProducerSlot, input, &output);
    689     if (OK != rc) {
    690         ALOGE("%s: Failed to queue ZSL buffer to producer: %d",
    691             __FUNCTION__, rc);
    692         return rc;
    693     }
    694 
    695     return rc;
    696 }
    697 
    698 status_t ZslProcessor::clearInputRingBufferLocked(nsecs_t* latestTimestamp) {
    699 
    700     if (nullptr != latestTimestamp) {
    701         *latestTimestamp = mProducer->getLatestTimestamp();
    702     }
    703     mInputBuffer.clear();
    704 
    705     return mProducer->clear();
    706 }
    707 
    708 status_t ZslProcessor::clearZslQueue() {
    709     Mutex::Autolock l(mInputMutex);
    710     // If in middle of capture, can't clear out queue
    711     if (mState == LOCKED) return OK;
    712 
    713     return clearZslQueueLocked();
    714 }
    715 
    716 status_t ZslProcessor::clearZslQueueLocked() {
    717     if (NO_STREAM != mZslStreamId) {
    718         // clear result metadata list first.
    719         clearZslResultQueueLocked();
    720         return clearInputRingBufferLocked(&mLatestClearedBufferTimestamp);
    721     }
    722     return OK;
    723 }
    724 
    725 void ZslProcessor::clearZslResultQueueLocked() {
    726     mFrameList.clear();
    727     mFrameListHead = 0;
    728     mFrameList.insertAt(0, mFrameListDepth);
    729 }
    730 
    731 void ZslProcessor::dump(int fd, const Vector<String16>& /*args*/) const {
    732     Mutex::Autolock l(mInputMutex);
    733     if (!mLatestCapturedRequest.isEmpty()) {
    734         String8 result("    Latest ZSL capture request:\n");
    735         write(fd, result.string(), result.size());
    736         mLatestCapturedRequest.dump(fd, 2, 6);
    737     } else {
    738         String8 result("    Latest ZSL capture request: none yet\n");
    739         write(fd, result.string(), result.size());
    740     }
    741     dumpZslQueue(fd);
    742 }
    743 
    744 bool ZslProcessor::threadLoop() {
    745     Mutex::Autolock l(mInputMutex);
    746 
    747     if (mBuffersToDetach == 0) {
    748         status_t res = mBuffersToDetachSignal.waitRelative(mInputMutex, kWaitDuration);
    749         if (res == TIMED_OUT) return true;
    750     }
    751     while (mBuffersToDetach > 0) {
    752         doNotifyInputReleasedLocked();
    753         mBuffersToDetach--;
    754     }
    755 
    756     return true;
    757 }
    758 
    759 void ZslProcessor::dumpZslQueue(int fd) const {
    760     String8 header("ZSL queue contents:");
    761     String8 indent("    ");
    762     ALOGV("%s", header.string());
    763     if (fd != -1) {
    764         header = indent + header + "\n";
    765         write(fd, header.string(), header.size());
    766     }
    767     for (size_t i = 0; i < mZslQueue.size(); i++) {
    768         const ZslPair &queueEntry = mZslQueue[i];
    769         nsecs_t bufferTimestamp = queueEntry.buffer.mTimestamp;
    770         camera_metadata_ro_entry_t entry;
    771         nsecs_t frameTimestamp = 0;
    772         int frameAeState = -1;
    773         if (!queueEntry.frame.isEmpty()) {
    774             entry = queueEntry.frame.find(ANDROID_SENSOR_TIMESTAMP);
    775             if (entry.count > 0) frameTimestamp = entry.data.i64[0];
    776             entry = queueEntry.frame.find(ANDROID_CONTROL_AE_STATE);
    777             if (entry.count > 0) frameAeState = entry.data.u8[0];
    778         }
    779         String8 result =
    780                 String8::format("   %zu: b: %" PRId64 "\tf: %" PRId64 ", AE state: %d", i,
    781                         bufferTimestamp, frameTimestamp, frameAeState);
    782         ALOGV("%s", result.string());
    783         if (fd != -1) {
    784             result = indent + result + "\n";
    785             write(fd, result.string(), result.size());
    786         }
    787 
    788     }
    789 }
    790 
    791 bool ZslProcessor::isFixedFocusMode(uint8_t afMode) const {
    792     switch (afMode) {
    793         case ANDROID_CONTROL_AF_MODE_AUTO:
    794         case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
    795         case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
    796         case ANDROID_CONTROL_AF_MODE_MACRO:
    797             return false;
    798             break;
    799         case ANDROID_CONTROL_AF_MODE_OFF:
    800         case ANDROID_CONTROL_AF_MODE_EDOF:
    801             return true;
    802         default:
    803             ALOGE("%s: unknown focus mode %d", __FUNCTION__, afMode);
    804             return false;
    805     }
    806 }
    807 
    808 nsecs_t ZslProcessor::getCandidateTimestampLocked(size_t* metadataIdx) const {
    809     /**
    810      * Find the smallest timestamp we know about so far
    811      * - ensure that aeState is either converged or locked
    812      */
    813 
    814     size_t idx = 0;
    815     nsecs_t minTimestamp = -1;
    816 
    817     size_t emptyCount = mFrameList.size();
    818 
    819     for (size_t j = 0; j < mFrameList.size(); j++) {
    820         const CameraMetadata &frame = mFrameList[j];
    821         if (!frame.isEmpty()) {
    822 
    823             emptyCount--;
    824 
    825             camera_metadata_ro_entry_t entry;
    826             entry = frame.find(ANDROID_SENSOR_TIMESTAMP);
    827             if (entry.count == 0) {
    828                 ALOGE("%s: Can't find timestamp in frame!",
    829                         __FUNCTION__);
    830                 continue;
    831             }
    832             nsecs_t frameTimestamp = entry.data.i64[0];
    833             if (minTimestamp > frameTimestamp || minTimestamp == -1) {
    834 
    835                 entry = frame.find(ANDROID_CONTROL_AE_STATE);
    836 
    837                 if (entry.count == 0) {
    838                     /**
    839                      * This is most likely a HAL bug. The aeState field is
    840                      * mandatory, so it should always be in a metadata packet.
    841                      */
    842                     ALOGW("%s: ZSL queue frame has no AE state field!",
    843                             __FUNCTION__);
    844                     continue;
    845                 }
    846                 if (entry.data.u8[0] != ANDROID_CONTROL_AE_STATE_CONVERGED &&
    847                         entry.data.u8[0] != ANDROID_CONTROL_AE_STATE_LOCKED) {
    848                     ALOGVV("%s: ZSL queue frame AE state is %d, need "
    849                            "full capture",  __FUNCTION__, entry.data.u8[0]);
    850                     continue;
    851                 }
    852 
    853                 entry = frame.find(ANDROID_CONTROL_AF_MODE);
    854                 if (entry.count == 0) {
    855                     ALOGW("%s: ZSL queue frame has no AF mode field!",
    856                             __FUNCTION__);
    857                     continue;
    858                 }
    859                 uint8_t afMode = entry.data.u8[0];
    860                 if (afMode == ANDROID_CONTROL_AF_MODE_OFF) {
    861                     // Skip all the ZSL buffer for manual AF mode, as we don't really
    862                     // know the af state.
    863                     continue;
    864                 }
    865 
    866                 // Check AF state if device has focuser and focus mode isn't fixed
    867                 if (mHasFocuser && !isFixedFocusMode(afMode)) {
    868                     // Make sure the candidate frame has good focus.
    869                     entry = frame.find(ANDROID_CONTROL_AF_STATE);
    870                     if (entry.count == 0) {
    871                         ALOGW("%s: ZSL queue frame has no AF state field!",
    872                                 __FUNCTION__);
    873                         continue;
    874                     }
    875                     uint8_t afState = entry.data.u8[0];
    876                     if (afState != ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED &&
    877                             afState != ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED &&
    878                             afState != ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED) {
    879                         ALOGVV("%s: ZSL queue frame AF state is %d is not good for capture, skip it",
    880                                 __FUNCTION__, afState);
    881                         continue;
    882                     }
    883                 }
    884 
    885                 minTimestamp = frameTimestamp;
    886                 idx = j;
    887             }
    888 
    889             ALOGVV("%s: Saw timestamp %" PRId64, __FUNCTION__, frameTimestamp);
    890         }
    891     }
    892 
    893     if (emptyCount == mFrameList.size()) {
    894         /**
    895          * This could be mildly bad and means our ZSL was triggered before
    896          * there were any frames yet received by the camera framework.
    897          *
    898          * This is a fairly corner case which can happen under:
    899          * + a user presses the shutter button real fast when the camera starts
    900          *     (startPreview followed immediately by takePicture).
    901          * + burst capture case (hitting shutter button as fast possible)
    902          *
    903          * If this happens in steady case (preview running for a while, call
    904          *     a single takePicture) then this might be a fwk bug.
    905          */
    906         ALOGW("%s: ZSL queue has no metadata frames", __FUNCTION__);
    907     }
    908 
    909     ALOGV("%s: Candidate timestamp %" PRId64 " (idx %zu), empty frames: %zu",
    910           __FUNCTION__, minTimestamp, idx, emptyCount);
    911 
    912     if (metadataIdx) {
    913         *metadataIdx = idx;
    914     }
    915 
    916     return minTimestamp;
    917 }
    918 
    919 }; // namespace camera2
    920 }; // namespace android
    921