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-OutputStream"
     18 #define ATRACE_TAG ATRACE_TAG_CAMERA
     19 //#define LOG_NDEBUG 0
     20 
     21 #include <utils/Log.h>
     22 #include <utils/Trace.h>
     23 #include "Camera3OutputStream.h"
     24 
     25 #ifndef container_of
     26 #define container_of(ptr, type, member) \
     27     (type *)((char*)(ptr) - offsetof(type, member))
     28 #endif
     29 
     30 namespace android {
     31 
     32 namespace camera3 {
     33 
     34 Camera3OutputStream::Camera3OutputStream(int id,
     35         sp<Surface> consumer,
     36         uint32_t width, uint32_t height, int format,
     37         android_dataspace dataSpace, camera3_stream_rotation_t rotation,
     38         nsecs_t timestampOffset, const String8& physicalCameraId,
     39         int setId) :
     40         Camera3IOStreamBase(id, CAMERA3_STREAM_OUTPUT, width, height,
     41                             /*maxSize*/0, format, dataSpace, rotation,
     42                             physicalCameraId, setId),
     43         mConsumer(consumer),
     44         mTransform(0),
     45         mTraceFirstBuffer(true),
     46         mUseBufferManager(false),
     47         mTimestampOffset(timestampOffset),
     48         mConsumerUsage(0),
     49         mDropBuffers(false),
     50         mDequeueBufferLatency(kDequeueLatencyBinSize) {
     51 
     52     if (mConsumer == NULL) {
     53         ALOGE("%s: Consumer is NULL!", __FUNCTION__);
     54         mState = STATE_ERROR;
     55     }
     56 
     57     if (setId > CAMERA3_STREAM_SET_ID_INVALID) {
     58         mBufferReleasedListener = new BufferReleasedListener(this);
     59     }
     60 }
     61 
     62 Camera3OutputStream::Camera3OutputStream(int id,
     63         sp<Surface> consumer,
     64         uint32_t width, uint32_t height, size_t maxSize, int format,
     65         android_dataspace dataSpace, camera3_stream_rotation_t rotation,
     66         nsecs_t timestampOffset, const String8& physicalCameraId, int setId) :
     67         Camera3IOStreamBase(id, CAMERA3_STREAM_OUTPUT, width, height, maxSize,
     68                             format, dataSpace, rotation, physicalCameraId, setId),
     69         mConsumer(consumer),
     70         mTransform(0),
     71         mTraceFirstBuffer(true),
     72         mUseMonoTimestamp(false),
     73         mUseBufferManager(false),
     74         mTimestampOffset(timestampOffset),
     75         mConsumerUsage(0),
     76         mDropBuffers(false),
     77         mDequeueBufferLatency(kDequeueLatencyBinSize) {
     78 
     79     if (format != HAL_PIXEL_FORMAT_BLOB && format != HAL_PIXEL_FORMAT_RAW_OPAQUE) {
     80         ALOGE("%s: Bad format for size-only stream: %d", __FUNCTION__,
     81                 format);
     82         mState = STATE_ERROR;
     83     }
     84 
     85     if (mConsumer == NULL) {
     86         ALOGE("%s: Consumer is NULL!", __FUNCTION__);
     87         mState = STATE_ERROR;
     88     }
     89 
     90     if (setId > CAMERA3_STREAM_SET_ID_INVALID) {
     91         mBufferReleasedListener = new BufferReleasedListener(this);
     92     }
     93 }
     94 
     95 Camera3OutputStream::Camera3OutputStream(int id,
     96         uint32_t width, uint32_t height, int format,
     97         uint64_t consumerUsage, android_dataspace dataSpace,
     98         camera3_stream_rotation_t rotation, nsecs_t timestampOffset,
     99         const String8& physicalCameraId, int setId) :
    100         Camera3IOStreamBase(id, CAMERA3_STREAM_OUTPUT, width, height,
    101                             /*maxSize*/0, format, dataSpace, rotation,
    102                             physicalCameraId, setId),
    103         mConsumer(nullptr),
    104         mTransform(0),
    105         mTraceFirstBuffer(true),
    106         mUseBufferManager(false),
    107         mTimestampOffset(timestampOffset),
    108         mConsumerUsage(consumerUsage),
    109         mDropBuffers(false),
    110         mDequeueBufferLatency(kDequeueLatencyBinSize) {
    111     // Deferred consumer only support preview surface format now.
    112     if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
    113         ALOGE("%s: Deferred consumer only supports IMPLEMENTATION_DEFINED format now!",
    114                 __FUNCTION__);
    115         mState = STATE_ERROR;
    116     }
    117 
    118     // Sanity check for the consumer usage flag.
    119     if ((consumerUsage & GraphicBuffer::USAGE_HW_TEXTURE) == 0 &&
    120             (consumerUsage & GraphicBuffer::USAGE_HW_COMPOSER) == 0) {
    121         ALOGE("%s: Deferred consumer usage flag is illegal %" PRIu64 "!",
    122               __FUNCTION__, consumerUsage);
    123         mState = STATE_ERROR;
    124     }
    125 
    126     mConsumerName = String8("Deferred");
    127     if (setId > CAMERA3_STREAM_SET_ID_INVALID) {
    128         mBufferReleasedListener = new BufferReleasedListener(this);
    129     }
    130 
    131 }
    132 
    133 Camera3OutputStream::Camera3OutputStream(int id, camera3_stream_type_t type,
    134                                          uint32_t width, uint32_t height,
    135                                          int format,
    136                                          android_dataspace dataSpace,
    137                                          camera3_stream_rotation_t rotation,
    138                                          const String8& physicalCameraId,
    139                                          uint64_t consumerUsage, nsecs_t timestampOffset,
    140                                          int setId) :
    141         Camera3IOStreamBase(id, type, width, height,
    142                             /*maxSize*/0,
    143                             format, dataSpace, rotation,
    144                             physicalCameraId, setId),
    145         mTransform(0),
    146         mTraceFirstBuffer(true),
    147         mUseMonoTimestamp(false),
    148         mUseBufferManager(false),
    149         mTimestampOffset(timestampOffset),
    150         mConsumerUsage(consumerUsage),
    151         mDropBuffers(false),
    152         mDequeueBufferLatency(kDequeueLatencyBinSize) {
    153 
    154     if (setId > CAMERA3_STREAM_SET_ID_INVALID) {
    155         mBufferReleasedListener = new BufferReleasedListener(this);
    156     }
    157 
    158     // Subclasses expected to initialize mConsumer themselves
    159 }
    160 
    161 
    162 Camera3OutputStream::~Camera3OutputStream() {
    163     disconnectLocked();
    164 }
    165 
    166 status_t Camera3OutputStream::getBufferLocked(camera3_stream_buffer *buffer,
    167         const std::vector<size_t>&) {
    168     ATRACE_CALL();
    169 
    170     ANativeWindowBuffer* anb;
    171     int fenceFd = -1;
    172 
    173     status_t res;
    174     res = getBufferLockedCommon(&anb, &fenceFd);
    175     if (res != OK) {
    176         return res;
    177     }
    178 
    179     /**
    180      * FenceFD now owned by HAL except in case of error,
    181      * in which case we reassign it to acquire_fence
    182      */
    183     handoutBufferLocked(*buffer, &(anb->handle), /*acquireFence*/fenceFd,
    184                         /*releaseFence*/-1, CAMERA3_BUFFER_STATUS_OK, /*output*/true);
    185 
    186     return OK;
    187 }
    188 
    189 status_t Camera3OutputStream::queueBufferToConsumer(sp<ANativeWindow>& consumer,
    190             ANativeWindowBuffer* buffer, int anwReleaseFence,
    191             const std::vector<size_t>&) {
    192     return consumer->queueBuffer(consumer.get(), buffer, anwReleaseFence);
    193 }
    194 
    195 status_t Camera3OutputStream::returnBufferLocked(
    196         const camera3_stream_buffer &buffer,
    197         nsecs_t timestamp, const std::vector<size_t>& surface_ids) {
    198     ATRACE_CALL();
    199 
    200     status_t res = returnAnyBufferLocked(buffer, timestamp, /*output*/true, surface_ids);
    201 
    202     if (res != OK) {
    203         return res;
    204     }
    205 
    206     mLastTimestamp = timestamp;
    207     mFrameCount++;
    208 
    209     return OK;
    210 }
    211 
    212 status_t Camera3OutputStream::returnBufferCheckedLocked(
    213             const camera3_stream_buffer &buffer,
    214             nsecs_t timestamp,
    215             bool output,
    216             const std::vector<size_t>& surface_ids,
    217             /*out*/
    218             sp<Fence> *releaseFenceOut) {
    219 
    220     (void)output;
    221     ALOG_ASSERT(output, "Expected output to be true");
    222 
    223     status_t res;
    224 
    225     // Fence management - always honor release fence from HAL
    226     sp<Fence> releaseFence = new Fence(buffer.release_fence);
    227     int anwReleaseFence = releaseFence->dup();
    228 
    229     /**
    230      * Release the lock briefly to avoid deadlock with
    231      * StreamingProcessor::startStream -> Camera3Stream::isConfiguring (this
    232      * thread will go into StreamingProcessor::onFrameAvailable) during
    233      * queueBuffer
    234      */
    235     sp<ANativeWindow> currentConsumer = mConsumer;
    236     StreamState state = mState;
    237     mLock.unlock();
    238 
    239     ANativeWindowBuffer *anwBuffer = container_of(buffer.buffer, ANativeWindowBuffer, handle);
    240     /**
    241      * Return buffer back to ANativeWindow
    242      */
    243     if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR || mDropBuffers || timestamp == 0) {
    244         // Cancel buffer
    245         if (mDropBuffers) {
    246             ALOGV("%s: Dropping a frame for stream %d.", __FUNCTION__, mId);
    247         } else if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR) {
    248             ALOGV("%s: A frame is dropped for stream %d due to buffer error.", __FUNCTION__, mId);
    249         } else {
    250             ALOGE("%s: Stream %d: timestamp shouldn't be 0", __FUNCTION__, mId);
    251         }
    252 
    253         res = currentConsumer->cancelBuffer(currentConsumer.get(),
    254                 anwBuffer,
    255                 anwReleaseFence);
    256         if (shouldLogError(res, state)) {
    257             ALOGE("%s: Stream %d: Error cancelling buffer to native window:"
    258                   " %s (%d)", __FUNCTION__, mId, strerror(-res), res);
    259         }
    260 
    261         notifyBufferReleased(anwBuffer);
    262         if (mUseBufferManager) {
    263             // Return this buffer back to buffer manager.
    264             mBufferReleasedListener->onBufferReleased();
    265         }
    266     } else {
    267         if (mTraceFirstBuffer && (stream_type == CAMERA3_STREAM_OUTPUT)) {
    268             {
    269                 char traceLog[48];
    270                 snprintf(traceLog, sizeof(traceLog), "Stream %d: first full buffer\n", mId);
    271                 ATRACE_NAME(traceLog);
    272             }
    273             mTraceFirstBuffer = false;
    274         }
    275 
    276         /* Certain consumers (such as AudioSource or HardwareComposer) use
    277          * MONOTONIC time, causing time misalignment if camera timestamp is
    278          * in BOOTTIME. Do the conversion if necessary. */
    279         res = native_window_set_buffers_timestamp(mConsumer.get(),
    280                 mUseMonoTimestamp ? timestamp - mTimestampOffset : timestamp);
    281         if (res != OK) {
    282             ALOGE("%s: Stream %d: Error setting timestamp: %s (%d)",
    283                   __FUNCTION__, mId, strerror(-res), res);
    284             return res;
    285         }
    286 
    287         res = queueBufferToConsumer(currentConsumer, anwBuffer, anwReleaseFence, surface_ids);
    288         if (shouldLogError(res, state)) {
    289             ALOGE("%s: Stream %d: Error queueing buffer to native window:"
    290                   " %s (%d)", __FUNCTION__, mId, strerror(-res), res);
    291         }
    292     }
    293     mLock.lock();
    294 
    295     // Once a valid buffer has been returned to the queue, can no longer
    296     // dequeue all buffers for preallocation.
    297     if (buffer.status != CAMERA3_BUFFER_STATUS_ERROR) {
    298         mStreamUnpreparable = true;
    299     }
    300 
    301     if (res != OK) {
    302         close(anwReleaseFence);
    303     }
    304 
    305     *releaseFenceOut = releaseFence;
    306 
    307     return res;
    308 }
    309 
    310 void Camera3OutputStream::dump(int fd, const Vector<String16> &args) const {
    311     (void) args;
    312     String8 lines;
    313     lines.appendFormat("    Stream[%d]: Output\n", mId);
    314     lines.appendFormat("      Consumer name: %s\n", mConsumerName.string());
    315     write(fd, lines.string(), lines.size());
    316 
    317     Camera3IOStreamBase::dump(fd, args);
    318 
    319     mDequeueBufferLatency.dump(fd,
    320         "      DequeueBuffer latency histogram:");
    321 }
    322 
    323 status_t Camera3OutputStream::setTransform(int transform) {
    324     ATRACE_CALL();
    325     Mutex::Autolock l(mLock);
    326     return setTransformLocked(transform);
    327 }
    328 
    329 status_t Camera3OutputStream::setTransformLocked(int transform) {
    330     status_t res = OK;
    331     if (mState == STATE_ERROR) {
    332         ALOGE("%s: Stream in error state", __FUNCTION__);
    333         return INVALID_OPERATION;
    334     }
    335 
    336     mTransform = transform;
    337     if (mState == STATE_CONFIGURED) {
    338         res = native_window_set_buffers_transform(mConsumer.get(),
    339                 transform);
    340         if (res != OK) {
    341             ALOGE("%s: Unable to configure stream transform to %x: %s (%d)",
    342                     __FUNCTION__, transform, strerror(-res), res);
    343         }
    344     }
    345     return res;
    346 }
    347 
    348 status_t Camera3OutputStream::configureQueueLocked() {
    349     status_t res;
    350 
    351     mTraceFirstBuffer = true;
    352     if ((res = Camera3IOStreamBase::configureQueueLocked()) != OK) {
    353         return res;
    354     }
    355 
    356     if ((res = configureConsumerQueueLocked()) != OK) {
    357         return res;
    358     }
    359 
    360     // Set dequeueBuffer/attachBuffer timeout if the consumer is not hw composer or hw texture.
    361     // We need skip these cases as timeout will disable the non-blocking (async) mode.
    362     if (!(isConsumedByHWComposer() || isConsumedByHWTexture())) {
    363         if (mUseBufferManager) {
    364             // When buffer manager is handling the buffer, we should have available buffers in
    365             // buffer queue before we calls into dequeueBuffer because buffer manager is tracking
    366             // free buffers.
    367             // There are however some consumer side feature (ImageReader::discardFreeBuffers) that
    368             // can discard free buffers without notifying buffer manager. We want the timeout to
    369             // happen immediately here so buffer manager can try to update its internal state and
    370             // try to allocate a buffer instead of waiting.
    371             mConsumer->setDequeueTimeout(0);
    372         } else {
    373             mConsumer->setDequeueTimeout(kDequeueBufferTimeout);
    374         }
    375     }
    376 
    377     return OK;
    378 }
    379 
    380 status_t Camera3OutputStream::configureConsumerQueueLocked() {
    381     status_t res;
    382 
    383     mTraceFirstBuffer = true;
    384 
    385     ALOG_ASSERT(mConsumer != 0, "mConsumer should never be NULL");
    386 
    387     // Configure consumer-side ANativeWindow interface. The listener may be used
    388     // to notify buffer manager (if it is used) of the returned buffers.
    389     res = mConsumer->connect(NATIVE_WINDOW_API_CAMERA,
    390             /*listener*/mBufferReleasedListener,
    391             /*reportBufferRemoval*/true);
    392     if (res != OK) {
    393         ALOGE("%s: Unable to connect to native window for stream %d",
    394                 __FUNCTION__, mId);
    395         return res;
    396     }
    397 
    398     mConsumerName = mConsumer->getConsumerName();
    399 
    400     res = native_window_set_usage(mConsumer.get(), mUsage);
    401     if (res != OK) {
    402         ALOGE("%s: Unable to configure usage %" PRIu64 " for stream %d",
    403                 __FUNCTION__, mUsage, mId);
    404         return res;
    405     }
    406 
    407     res = native_window_set_scaling_mode(mConsumer.get(),
    408             NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
    409     if (res != OK) {
    410         ALOGE("%s: Unable to configure stream scaling: %s (%d)",
    411                 __FUNCTION__, strerror(-res), res);
    412         return res;
    413     }
    414 
    415     if (mMaxSize == 0) {
    416         // For buffers of known size
    417         res = native_window_set_buffers_dimensions(mConsumer.get(),
    418                 camera3_stream::width, camera3_stream::height);
    419     } else {
    420         // For buffers with bounded size
    421         res = native_window_set_buffers_dimensions(mConsumer.get(),
    422                 mMaxSize, 1);
    423     }
    424     if (res != OK) {
    425         ALOGE("%s: Unable to configure stream buffer dimensions"
    426                 " %d x %d (maxSize %zu) for stream %d",
    427                 __FUNCTION__, camera3_stream::width, camera3_stream::height,
    428                 mMaxSize, mId);
    429         return res;
    430     }
    431     res = native_window_set_buffers_format(mConsumer.get(),
    432             camera3_stream::format);
    433     if (res != OK) {
    434         ALOGE("%s: Unable to configure stream buffer format %#x for stream %d",
    435                 __FUNCTION__, camera3_stream::format, mId);
    436         return res;
    437     }
    438 
    439     res = native_window_set_buffers_data_space(mConsumer.get(),
    440             camera3_stream::data_space);
    441     if (res != OK) {
    442         ALOGE("%s: Unable to configure stream dataspace %#x for stream %d",
    443                 __FUNCTION__, camera3_stream::data_space, mId);
    444         return res;
    445     }
    446 
    447     int maxConsumerBuffers;
    448     res = static_cast<ANativeWindow*>(mConsumer.get())->query(
    449             mConsumer.get(),
    450             NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &maxConsumerBuffers);
    451     if (res != OK) {
    452         ALOGE("%s: Unable to query consumer undequeued"
    453                 " buffer count for stream %d", __FUNCTION__, mId);
    454         return res;
    455     }
    456 
    457     ALOGV("%s: Consumer wants %d buffers, HAL wants %d", __FUNCTION__,
    458             maxConsumerBuffers, camera3_stream::max_buffers);
    459     if (camera3_stream::max_buffers == 0) {
    460         ALOGE("%s: Camera HAL requested max_buffer count: %d, requires at least 1",
    461                 __FUNCTION__, camera3_stream::max_buffers);
    462         return INVALID_OPERATION;
    463     }
    464 
    465     mTotalBufferCount = maxConsumerBuffers + camera3_stream::max_buffers;
    466     mHandoutTotalBufferCount = 0;
    467     mFrameCount = 0;
    468     mLastTimestamp = 0;
    469     mUseMonoTimestamp = (isConsumedByHWComposer() | isVideoStream());
    470 
    471     res = native_window_set_buffer_count(mConsumer.get(),
    472             mTotalBufferCount);
    473     if (res != OK) {
    474         ALOGE("%s: Unable to set buffer count for stream %d",
    475                 __FUNCTION__, mId);
    476         return res;
    477     }
    478 
    479     res = native_window_set_buffers_transform(mConsumer.get(),
    480             mTransform);
    481     if (res != OK) {
    482         ALOGE("%s: Unable to configure stream transform to %x: %s (%d)",
    483                 __FUNCTION__, mTransform, strerror(-res), res);
    484         return res;
    485     }
    486 
    487     /**
    488      * Camera3 Buffer manager is only supported by HAL3.3 onwards, as the older HALs requires
    489      * buffers to be statically allocated for internal static buffer registration, while the
    490      * buffers provided by buffer manager are really dynamically allocated. Camera3Device only
    491      * sets the mBufferManager if device version is > HAL3.2, which guarantees that the buffer
    492      * manager setup is skipped in below code. Note that HAL3.2 is also excluded here, as some
    493      * HAL3.2 devices may not support the dynamic buffer registeration.
    494      * Also Camera3BufferManager does not support display/texture streams as they have its own
    495      * buffer management logic.
    496      */
    497     if (mBufferManager != 0 && mSetId > CAMERA3_STREAM_SET_ID_INVALID &&
    498             !(isConsumedByHWComposer() || isConsumedByHWTexture())) {
    499         uint64_t consumerUsage = 0;
    500         getEndpointUsage(&consumerUsage);
    501         StreamInfo streamInfo(
    502                 getId(), getStreamSetId(), getWidth(), getHeight(), getFormat(), getDataSpace(),
    503                 mUsage | consumerUsage, mTotalBufferCount,
    504                 /*isConfigured*/true);
    505         wp<Camera3OutputStream> weakThis(this);
    506         res = mBufferManager->registerStream(weakThis,
    507                 streamInfo);
    508         if (res == OK) {
    509             // Disable buffer allocation for this BufferQueue, buffer manager will take over
    510             // the buffer allocation responsibility.
    511             mConsumer->getIGraphicBufferProducer()->allowAllocation(false);
    512             mUseBufferManager = true;
    513         } else {
    514             ALOGE("%s: Unable to register stream %d to camera3 buffer manager, "
    515                   "(error %d %s), fall back to BufferQueue for buffer management!",
    516                   __FUNCTION__, mId, res, strerror(-res));
    517         }
    518     }
    519 
    520     return OK;
    521 }
    522 
    523 status_t Camera3OutputStream::getBufferLockedCommon(ANativeWindowBuffer** anb, int* fenceFd) {
    524     ATRACE_CALL();
    525     status_t res;
    526 
    527     if ((res = getBufferPreconditionCheckLocked()) != OK) {
    528         return res;
    529     }
    530 
    531     bool gotBufferFromManager = false;
    532 
    533     if (mUseBufferManager) {
    534         sp<GraphicBuffer> gb;
    535         res = mBufferManager->getBufferForStream(getId(), getStreamSetId(), &gb, fenceFd);
    536         if (res == OK) {
    537             // Attach this buffer to the bufferQueue: the buffer will be in dequeue state after a
    538             // successful return.
    539             *anb = gb.get();
    540             res = mConsumer->attachBuffer(*anb);
    541             if (shouldLogError(res, mState)) {
    542                 ALOGE("%s: Stream %d: Can't attach the output buffer to this surface: %s (%d)",
    543                         __FUNCTION__, mId, strerror(-res), res);
    544             }
    545             if (res != OK) {
    546                 checkRetAndSetAbandonedLocked(res);
    547                 return res;
    548             }
    549             gotBufferFromManager = true;
    550             ALOGV("Stream %d: Attached new buffer", getId());
    551         } else if (res == ALREADY_EXISTS) {
    552             // Have sufficient free buffers already attached, can just
    553             // dequeue from buffer queue
    554             ALOGV("Stream %d: Reusing attached buffer", getId());
    555             gotBufferFromManager = false;
    556         } else if (res != OK) {
    557             ALOGE("%s: Stream %d: Can't get next output buffer from buffer manager: %s (%d)",
    558                     __FUNCTION__, mId, strerror(-res), res);
    559             return res;
    560         }
    561     }
    562     if (!gotBufferFromManager) {
    563         /**
    564          * Release the lock briefly to avoid deadlock for below scenario:
    565          * Thread 1: StreamingProcessor::startStream -> Camera3Stream::isConfiguring().
    566          * This thread acquired StreamingProcessor lock and try to lock Camera3Stream lock.
    567          * Thread 2: Camera3Stream::returnBuffer->StreamingProcessor::onFrameAvailable().
    568          * This thread acquired Camera3Stream lock and bufferQueue lock, and try to lock
    569          * StreamingProcessor lock.
    570          * Thread 3: Camera3Stream::getBuffer(). This thread acquired Camera3Stream lock
    571          * and try to lock bufferQueue lock.
    572          * Then there is circular locking dependency.
    573          */
    574         sp<ANativeWindow> currentConsumer = mConsumer;
    575         mLock.unlock();
    576 
    577         nsecs_t dequeueStart = systemTime(SYSTEM_TIME_MONOTONIC);
    578         res = currentConsumer->dequeueBuffer(currentConsumer.get(), anb, fenceFd);
    579         nsecs_t dequeueEnd = systemTime(SYSTEM_TIME_MONOTONIC);
    580         mDequeueBufferLatency.add(dequeueStart, dequeueEnd);
    581 
    582         mLock.lock();
    583 
    584         if (mUseBufferManager && res == TIMED_OUT) {
    585             checkRemovedBuffersLocked();
    586 
    587             sp<GraphicBuffer> gb;
    588             res = mBufferManager->getBufferForStream(
    589                     getId(), getStreamSetId(), &gb, fenceFd, /*noFreeBuffer*/true);
    590 
    591             if (res == OK) {
    592                 // Attach this buffer to the bufferQueue: the buffer will be in dequeue state after
    593                 // a successful return.
    594                 *anb = gb.get();
    595                 res = mConsumer->attachBuffer(*anb);
    596                 gotBufferFromManager = true;
    597                 ALOGV("Stream %d: Attached new buffer", getId());
    598 
    599                 if (res != OK) {
    600                     if (shouldLogError(res, mState)) {
    601                         ALOGE("%s: Stream %d: Can't attach the output buffer to this surface:"
    602                                 " %s (%d)", __FUNCTION__, mId, strerror(-res), res);
    603                     }
    604                     checkRetAndSetAbandonedLocked(res);
    605                     return res;
    606                 }
    607             } else {
    608                 ALOGE("%s: Stream %d: Can't get next output buffer from buffer manager:"
    609                         " %s (%d)", __FUNCTION__, mId, strerror(-res), res);
    610                 return res;
    611             }
    612         } else if (res != OK) {
    613             if (shouldLogError(res, mState)) {
    614                 ALOGE("%s: Stream %d: Can't dequeue next output buffer: %s (%d)",
    615                         __FUNCTION__, mId, strerror(-res), res);
    616             }
    617             checkRetAndSetAbandonedLocked(res);
    618             return res;
    619         }
    620     }
    621 
    622     if (res == OK) {
    623         checkRemovedBuffersLocked();
    624     }
    625 
    626     return res;
    627 }
    628 
    629 void Camera3OutputStream::checkRemovedBuffersLocked(bool notifyBufferManager) {
    630     std::vector<sp<GraphicBuffer>> removedBuffers;
    631     status_t res = mConsumer->getAndFlushRemovedBuffers(&removedBuffers);
    632     if (res == OK) {
    633         onBuffersRemovedLocked(removedBuffers);
    634 
    635         if (notifyBufferManager && mUseBufferManager && removedBuffers.size() > 0) {
    636             mBufferManager->onBuffersRemoved(getId(), getStreamSetId(), removedBuffers.size());
    637         }
    638     }
    639 }
    640 
    641 void Camera3OutputStream::checkRetAndSetAbandonedLocked(status_t res) {
    642     // Only transition to STATE_ABANDONED from STATE_CONFIGURED. (If it is
    643     // STATE_PREPARING, let prepareNextBuffer handle the error.)
    644     if ((res == NO_INIT || res == DEAD_OBJECT) && mState == STATE_CONFIGURED) {
    645         mState = STATE_ABANDONED;
    646     }
    647 }
    648 
    649 bool Camera3OutputStream::shouldLogError(status_t res, StreamState state) {
    650     if (res == OK) {
    651         return false;
    652     }
    653     if ((res == DEAD_OBJECT || res == NO_INIT) && state == STATE_ABANDONED) {
    654         return false;
    655     }
    656     return true;
    657 }
    658 
    659 status_t Camera3OutputStream::disconnectLocked() {
    660     status_t res;
    661 
    662     if ((res = Camera3IOStreamBase::disconnectLocked()) != OK) {
    663         return res;
    664     }
    665 
    666     // Stream configuration was not finished (can only be in STATE_IN_CONFIG or STATE_CONSTRUCTED
    667     // state), don't need change the stream state, return OK.
    668     if (mConsumer == nullptr) {
    669         return OK;
    670     }
    671 
    672     ALOGV("%s: disconnecting stream %d from native window", __FUNCTION__, getId());
    673 
    674     res = native_window_api_disconnect(mConsumer.get(),
    675                                        NATIVE_WINDOW_API_CAMERA);
    676     /**
    677      * This is not an error. if client calling process dies, the window will
    678      * also die and all calls to it will return DEAD_OBJECT, thus it's already
    679      * "disconnected"
    680      */
    681     if (res == DEAD_OBJECT) {
    682         ALOGW("%s: While disconnecting stream %d from native window, the"
    683                 " native window died from under us", __FUNCTION__, mId);
    684     }
    685     else if (res != OK) {
    686         ALOGE("%s: Unable to disconnect stream %d from native window "
    687               "(error %d %s)",
    688               __FUNCTION__, mId, res, strerror(-res));
    689         mState = STATE_ERROR;
    690         return res;
    691     }
    692 
    693     // Since device is already idle, there is no getBuffer call to buffer manager, unregister the
    694     // stream at this point should be safe.
    695     if (mUseBufferManager) {
    696         res = mBufferManager->unregisterStream(getId(), getStreamSetId());
    697         if (res != OK) {
    698             ALOGE("%s: Unable to unregister stream %d from buffer manager "
    699                     "(error %d %s)", __FUNCTION__, mId, res, strerror(-res));
    700             mState = STATE_ERROR;
    701             return res;
    702         }
    703         // Note that, to make prepare/teardown case work, we must not mBufferManager.clear(), as
    704         // the stream is still in usable state after this call.
    705         mUseBufferManager = false;
    706     }
    707 
    708     mState = (mState == STATE_IN_RECONFIG) ? STATE_IN_CONFIG
    709                                            : STATE_CONSTRUCTED;
    710 
    711     mDequeueBufferLatency.log("Stream %d dequeueBuffer latency histogram", mId);
    712     mDequeueBufferLatency.reset();
    713     return OK;
    714 }
    715 
    716 status_t Camera3OutputStream::getEndpointUsage(uint64_t *usage) const {
    717 
    718     status_t res;
    719 
    720     if (mConsumer == nullptr) {
    721         // mConsumerUsage was sanitized before the Camera3OutputStream was constructed.
    722         *usage = mConsumerUsage;
    723         return OK;
    724     }
    725 
    726     res = getEndpointUsageForSurface(usage, mConsumer);
    727 
    728     return res;
    729 }
    730 
    731 void Camera3OutputStream::applyZSLUsageQuirk(int format, uint64_t *consumerUsage /*inout*/) {
    732     if (consumerUsage == nullptr) {
    733         return;
    734     }
    735 
    736     // If an opaque output stream's endpoint is ImageReader, add
    737     // GRALLOC_USAGE_HW_CAMERA_ZSL to the usage so HAL knows it will be used
    738     // for the ZSL use case.
    739     // Assume it's for ImageReader if the consumer usage doesn't have any of these bits set:
    740     //     1. GRALLOC_USAGE_HW_TEXTURE
    741     //     2. GRALLOC_USAGE_HW_RENDER
    742     //     3. GRALLOC_USAGE_HW_COMPOSER
    743     //     4. GRALLOC_USAGE_HW_VIDEO_ENCODER
    744     if (format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED &&
    745             (*consumerUsage & (GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_RENDER |
    746             GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_VIDEO_ENCODER)) == 0) {
    747         *consumerUsage |= GRALLOC_USAGE_HW_CAMERA_ZSL;
    748     }
    749 }
    750 
    751 status_t Camera3OutputStream::getEndpointUsageForSurface(uint64_t *usage,
    752         const sp<Surface>& surface) const {
    753     status_t res;
    754     uint64_t u = 0;
    755 
    756     res = native_window_get_consumer_usage(static_cast<ANativeWindow*>(surface.get()), &u);
    757     applyZSLUsageQuirk(camera3_stream::format, &u);
    758     *usage = u;
    759     return res;
    760 }
    761 
    762 bool Camera3OutputStream::isVideoStream() const {
    763     uint64_t usage = 0;
    764     status_t res = getEndpointUsage(&usage);
    765     if (res != OK) {
    766         ALOGE("%s: getting end point usage failed: %s (%d).", __FUNCTION__, strerror(-res), res);
    767         return false;
    768     }
    769 
    770     return (usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) != 0;
    771 }
    772 
    773 status_t Camera3OutputStream::setBufferManager(sp<Camera3BufferManager> bufferManager) {
    774     Mutex::Autolock l(mLock);
    775     if (mState != STATE_CONSTRUCTED) {
    776         ALOGE("%s: this method can only be called when stream in CONSTRUCTED state.",
    777                 __FUNCTION__);
    778         return INVALID_OPERATION;
    779     }
    780     mBufferManager = bufferManager;
    781 
    782     return OK;
    783 }
    784 
    785 status_t Camera3OutputStream::updateStream(const std::vector<sp<Surface>> &/*outputSurfaces*/,
    786             const std::vector<OutputStreamInfo> &/*outputInfo*/,
    787             const std::vector<size_t> &/*removedSurfaceIds*/,
    788             KeyedVector<sp<Surface>, size_t> * /*outputMapo*/) {
    789     ALOGE("%s: this method is not supported!", __FUNCTION__);
    790     return INVALID_OPERATION;
    791 }
    792 
    793 void Camera3OutputStream::BufferReleasedListener::onBufferReleased() {
    794     sp<Camera3OutputStream> stream = mParent.promote();
    795     if (stream == nullptr) {
    796         ALOGV("%s: Parent camera3 output stream was destroyed", __FUNCTION__);
    797         return;
    798     }
    799 
    800     Mutex::Autolock l(stream->mLock);
    801     if (!(stream->mUseBufferManager)) {
    802         return;
    803     }
    804 
    805     ALOGV("Stream %d: Buffer released", stream->getId());
    806     bool shouldFreeBuffer = false;
    807     status_t res = stream->mBufferManager->onBufferReleased(
    808         stream->getId(), stream->getStreamSetId(), &shouldFreeBuffer);
    809     if (res != OK) {
    810         ALOGE("%s: signaling buffer release to buffer manager failed: %s (%d).", __FUNCTION__,
    811                 strerror(-res), res);
    812         stream->mState = STATE_ERROR;
    813     }
    814 
    815     if (shouldFreeBuffer) {
    816         sp<GraphicBuffer> buffer;
    817         // Detach and free a buffer (when buffer goes out of scope)
    818         stream->detachBufferLocked(&buffer, /*fenceFd*/ nullptr);
    819         if (buffer.get() != nullptr) {
    820             stream->mBufferManager->notifyBufferRemoved(
    821                     stream->getId(), stream->getStreamSetId());
    822         }
    823     }
    824 }
    825 
    826 void Camera3OutputStream::onBuffersRemovedLocked(
    827         const std::vector<sp<GraphicBuffer>>& removedBuffers) {
    828     sp<Camera3StreamBufferFreedListener> callback = mBufferFreedListener.promote();
    829     if (callback != nullptr) {
    830         for (const auto& gb : removedBuffers) {
    831             callback->onBufferFreed(mId, gb->handle);
    832         }
    833     }
    834 }
    835 
    836 status_t Camera3OutputStream::detachBuffer(sp<GraphicBuffer>* buffer, int* fenceFd) {
    837     Mutex::Autolock l(mLock);
    838     return detachBufferLocked(buffer, fenceFd);
    839 }
    840 
    841 status_t Camera3OutputStream::detachBufferLocked(sp<GraphicBuffer>* buffer, int* fenceFd) {
    842     ALOGV("Stream %d: detachBuffer", getId());
    843     if (buffer == nullptr) {
    844         return BAD_VALUE;
    845     }
    846 
    847     sp<Fence> fence;
    848     status_t res = mConsumer->detachNextBuffer(buffer, &fence);
    849     if (res == NO_MEMORY) {
    850         // This may rarely happen, which indicates that the released buffer was freed by other
    851         // call (e.g., attachBuffer, dequeueBuffer etc.) before reaching here. We should notify the
    852         // buffer manager that this buffer has been freed. It's not fatal, but should be avoided,
    853         // therefore log a warning.
    854         *buffer = 0;
    855         ALOGW("%s: the released buffer has already been freed by the buffer queue!", __FUNCTION__);
    856     } else if (res != OK) {
    857         // Treat other errors as abandonment
    858         if (shouldLogError(res, mState)) {
    859             ALOGE("%s: detach next buffer failed: %s (%d).", __FUNCTION__, strerror(-res), res);
    860         }
    861         mState = STATE_ABANDONED;
    862         return res;
    863     }
    864 
    865     if (fenceFd != nullptr) {
    866         if (fence!= 0 && fence->isValid()) {
    867             *fenceFd = fence->dup();
    868         } else {
    869             *fenceFd = -1;
    870         }
    871     }
    872 
    873     // Here we assume detachBuffer is called by buffer manager so it doesn't need to be notified
    874     checkRemovedBuffersLocked(/*notifyBufferManager*/false);
    875     return res;
    876 }
    877 
    878 status_t Camera3OutputStream::dropBuffers(bool dropping) {
    879     Mutex::Autolock l(mLock);
    880     mDropBuffers = dropping;
    881     return OK;
    882 }
    883 
    884 const String8& Camera3OutputStream::getPhysicalCameraId() const {
    885     Mutex::Autolock l(mLock);
    886     return physicalCameraId();
    887 }
    888 
    889 status_t Camera3OutputStream::notifyBufferReleased(ANativeWindowBuffer* /*anwBuffer*/) {
    890     return OK;
    891 }
    892 
    893 bool Camera3OutputStream::isConsumerConfigurationDeferred(size_t surface_id) const {
    894     Mutex::Autolock l(mLock);
    895 
    896     if (surface_id != 0) {
    897         ALOGE("%s: surface_id %zu for Camera3OutputStream should be 0!", __FUNCTION__, surface_id);
    898     }
    899     return mConsumer == nullptr;
    900 }
    901 
    902 status_t Camera3OutputStream::setConsumers(const std::vector<sp<Surface>>& consumers) {
    903     Mutex::Autolock l(mLock);
    904     if (consumers.size() != 1) {
    905         ALOGE("%s: it's illegal to set %zu consumer surfaces!",
    906                   __FUNCTION__, consumers.size());
    907         return INVALID_OPERATION;
    908     }
    909     if (consumers[0] == nullptr) {
    910         ALOGE("%s: it's illegal to set null consumer surface!", __FUNCTION__);
    911         return INVALID_OPERATION;
    912     }
    913 
    914     if (mConsumer != nullptr) {
    915         ALOGE("%s: consumer surface was already set!", __FUNCTION__);
    916         return INVALID_OPERATION;
    917     }
    918 
    919     mConsumer = consumers[0];
    920     return OK;
    921 }
    922 
    923 bool Camera3OutputStream::isConsumedByHWComposer() const {
    924     uint64_t usage = 0;
    925     status_t res = getEndpointUsage(&usage);
    926     if (res != OK) {
    927         ALOGE("%s: getting end point usage failed: %s (%d).", __FUNCTION__, strerror(-res), res);
    928         return false;
    929     }
    930 
    931     return (usage & GRALLOC_USAGE_HW_COMPOSER) != 0;
    932 }
    933 
    934 bool Camera3OutputStream::isConsumedByHWTexture() const {
    935     uint64_t usage = 0;
    936     status_t res = getEndpointUsage(&usage);
    937     if (res != OK) {
    938         ALOGE("%s: getting end point usage failed: %s (%d).", __FUNCTION__, strerror(-res), res);
    939         return false;
    940     }
    941 
    942     return (usage & GRALLOC_USAGE_HW_TEXTURE) != 0;
    943 }
    944 
    945 }; // namespace camera3
    946 
    947 }; // namespace android
    948