Camera3InputStream.cpp revision 0776a14513300f04dc5c1d2f89c4156576b8b8ed
18be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala/*
28be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * Copyright (C) 2013 The Android Open Source Project
38be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala *
48be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
58be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * you may not use this file except in compliance with the License.
68be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * You may obtain a copy of the License at
78be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala *
88be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
98be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala *
108be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
118be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
128be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * See the License for the specific language governing permissions and
148be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * limitations under the License.
158be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala */
168be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
178be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#define LOG_TAG "Camera3-InputStream"
188be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA
198be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala//#define LOG_NDEBUG 0
208be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
210776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin// This is needed for stdint.h to define INT64_MAX in C++
220776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin#define __STDC_LIMIT_MACROS
230776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
248be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#include <utils/Log.h>
258be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#include <utils/Trace.h>
268be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#include "Camera3InputStream.h"
278be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
288be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalanamespace android {
298be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
308be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalanamespace camera3 {
318be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
328be20f50711a94426f1394ec113672e41c1224e8Eino-Ville TalvalaCamera3InputStream::Camera3InputStream(int id,
338be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala        uint32_t width, uint32_t height, int format) :
340776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        Camera3Stream(id, CAMERA3_STREAM_INPUT, width, height, 0, format),
350776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        mTotalBufferCount(0),
360776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        mDequeuedBufferCount(0),
370776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        mFrameCount(0),
380776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        mLastTimestamp(0) {
390776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    mCombinedFence = new Fence();
400776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
410776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (format == HAL_PIXEL_FORMAT_BLOB) {
420776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Bad format, BLOB not supported", __FUNCTION__);
430776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        mState = STATE_ERROR;
440776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
450776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin}
460776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
470776a14513300f04dc5c1d2f89c4156576b8b8edIgor MurashkinCamera3InputStream::~Camera3InputStream() {
480776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    disconnectLocked();
498be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
508be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
510776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkinstatus_t Camera3InputStream::getInputBufferLocked(
520776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        camera3_stream_buffer *buffer) {
530776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    ATRACE_CALL();
540776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    status_t res;
550776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
560776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    // FIXME: will not work in (re-)registration
570776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (mState == STATE_IN_CONFIG || mState == STATE_IN_RECONFIG) {
580776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Buffer registration for input streams"
590776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              " not implemented (state %d)",
600776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId, mState);
610776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return INVALID_OPERATION;
620776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
630776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
640776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    // Allow acquire during IN_[RE]CONFIG for registration
650776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (mState != STATE_CONFIGURED &&
660776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            mState != STATE_IN_CONFIG && mState != STATE_IN_RECONFIG) {
670776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Can't get buffers in unconfigured state %d",
680776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                __FUNCTION__, mId, mState);
690776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return INVALID_OPERATION;
700776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
710776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
720776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    // Only limit acquire amount when fully configured
730776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (mState == STATE_CONFIGURED &&
740776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            mDequeuedBufferCount == camera3_stream::max_buffers) {
750776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Already acquired maximum number of simultaneous"
760776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                " buffers (%d)", __FUNCTION__, mId,
770776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                camera3_stream::max_buffers);
780776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return INVALID_OPERATION;
790776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
800776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
810776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    ANativeWindowBuffer* anb;
820776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    int fenceFd;
830776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
840776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(mConsumer != 0);
850776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
860776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    BufferItem bufferItem;
870776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    res = mConsumer->acquireBuffer(&bufferItem, /*waitForFence*/false);
880776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
890776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
900776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Can't acquire next output buffer: %s (%d)",
910776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                __FUNCTION__, mId, strerror(-res), res);
920776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return res;
930776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
940776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
950776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    anb = bufferItem.mGraphicBuffer->getNativeBuffer();
960776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(anb != NULL);
970776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    fenceFd = bufferItem.mFence->dup();
980776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    /**
990776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * FenceFD now owned by HAL except in case of error,
1000776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * in which case we reassign it to acquire_fence
1010776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     */
1020776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1030776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    // Handing out a raw pointer to this object. Increment internal refcount.
1040776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    incStrong(this);
1050776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    buffer->stream = this;
1060776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    buffer->buffer = &(anb->handle);
1070776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    buffer->acquire_fence = fenceFd;
1080776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    buffer->release_fence = -1;
1090776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    buffer->status = CAMERA3_BUFFER_STATUS_OK;
1100776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1110776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    mDequeuedBufferCount++;
1120776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1130776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    mBuffersInFlight.push_back(bufferItem);
1140776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1150776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    return OK;
1168be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
1178be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
1180776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkinstatus_t Camera3InputStream::returnInputBufferLocked(
1190776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        const camera3_stream_buffer &buffer) {
1200776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    ATRACE_CALL();
1210776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    status_t res;
1220776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1230776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    // returnBuffer may be called from a raw pointer, not a sp<>, and we'll be
1240776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    // decrementing the internal refcount next. In case this is the last ref, we
1250776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    // might get destructed on the decStrong(), so keep an sp around until the
1260776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    // end of the call - otherwise have to sprinkle the decStrong on all exit
1270776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    // points.
1280776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    sp<Camera3InputStream> keepAlive(this);
1290776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    decStrong(this);
1300776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1310776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    // Allow buffers to be returned in the error state, to allow for disconnect
1320776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    // and in the in-config states for registration
1330776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (mState == STATE_CONSTRUCTED) {
1340776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Can't return buffers in unconfigured state %d",
1350776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                __FUNCTION__, mId, mState);
1360776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return INVALID_OPERATION;
1370776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1380776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (mDequeuedBufferCount == 0) {
1390776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: No buffers outstanding to return", __FUNCTION__,
1400776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                mId);
1410776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return INVALID_OPERATION;
1420776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1430776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1440776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    bool bufferFound = false;
1450776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    BufferItem bufferItem;
1460776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    {
1470776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        // Find the buffer we are returning
1480776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        Vector<BufferItem>::iterator it, end;
1490776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        for (it = mBuffersInFlight.begin(), end = mBuffersInFlight.end();
1500776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin             it != end;
1510776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin             ++it) {
1520776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1530776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            const BufferItem& tmp = *it;
1540776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            ANativeWindowBuffer *anb = tmp.mGraphicBuffer->getNativeBuffer();
1550776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            if (anb != NULL && &(anb->handle) == buffer.buffer) {
1560776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                bufferFound = true;
1570776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                bufferItem = tmp;
1580776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                mBuffersInFlight.erase(it);
1590776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                mDequeuedBufferCount--;
1600776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            }
1610776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        }
1620776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1630776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (!bufferFound) {
1640776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Can't return buffer that wasn't sent to HAL",
1650776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId);
1660776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return INVALID_OPERATION;
1670776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1680776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1690776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR) {
1700776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        if (buffer.release_fence != -1) {
1710776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            ALOGE("%s: Stream %d: HAL should not set release_fence(%d) when "
1720776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                  "there is an error", __FUNCTION__, mId, buffer.release_fence);
1730776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            close(buffer.release_fence);
1740776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        }
1750776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1760776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        /**
1770776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin         * Reassign release fence as the acquire fence incase of error
1780776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin         */
1790776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        const_cast<camera3_stream_buffer*>(&buffer)->release_fence =
1800776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                buffer.acquire_fence;
1810776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1820776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1830776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    /**
1840776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * Unconditionally return buffer to the buffer queue.
1850776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * - Fwk takes over the release_fence ownership
1860776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     */
1870776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    sp<Fence> releaseFence = new Fence(buffer.release_fence);
1880776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    res = mConsumer->releaseBuffer(bufferItem, releaseFence);
1890776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
1900776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Error releasing buffer back to buffer queue:"
1910776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                " %s (%d)", __FUNCTION__, mId, strerror(-res), res);
1920776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return res;
1930776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1940776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1950776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    mCombinedFence = Fence::merge(mName, mCombinedFence, releaseFence);
1960776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1970776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    mBufferReturnedSignal.signal();
1980776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1990776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    return OK;
2000776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2018be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
2028be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
2038be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalabool Camera3InputStream::hasOutstandingBuffersLocked() const {
2040776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    nsecs_t signalTime = mCombinedFence->getSignalTime();
2050776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    ALOGV("%s: Stream %d: Has %d outstanding buffers,"
2060776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            " buffer signal time is %lld",
2070776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            __FUNCTION__, mId, mDequeuedBufferCount, signalTime);
2080776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (mDequeuedBufferCount > 0 || signalTime == INT64_MAX) {
2090776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return true;
2100776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2118be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala    return false;
2128be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
2138be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
2148be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalastatus_t Camera3InputStream::waitUntilIdle(nsecs_t timeout) {
2150776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    status_t res;
2160776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    {
2170776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        Mutex::Autolock l(mLock);
2180776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        while (mDequeuedBufferCount > 0) {
2190776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            if (timeout != TIMEOUT_NEVER) {
2200776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                nsecs_t startTime = systemTime();
2210776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                res = mBufferReturnedSignal.waitRelative(mLock, timeout);
2220776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                if (res == TIMED_OUT) {
2230776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                    return res;
2240776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                } else if (res != OK) {
2250776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                    ALOGE("%s: Error waiting for outstanding buffers: %s (%d)",
2260776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                            __FUNCTION__, strerror(-res), res);
2270776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                    return res;
2280776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                }
2290776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                nsecs_t deltaTime = systemTime() - startTime;
2300776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                if (timeout <= deltaTime) {
2310776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                    timeout = 0;
2320776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                } else {
2330776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                    timeout -= deltaTime;
2340776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                }
2350776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            } else {
2360776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                res = mBufferReturnedSignal.wait(mLock);
2370776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                if (res != OK) {
2380776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                    ALOGE("%s: Error waiting for outstanding buffers: %s (%d)",
2390776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                            __FUNCTION__, strerror(-res), res);
2400776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                    return res;
2410776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                }
2420776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            }
2430776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        }
2440776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2450776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2460776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    // No lock
2470776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2480776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    unsigned int timeoutMs;
2490776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (timeout == TIMEOUT_NEVER) {
2500776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        timeoutMs = Fence::TIMEOUT_NEVER;
2510776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    } else if (timeout == 0) {
2520776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        timeoutMs = 0;
2530776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    } else {
2540776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        // Round up to wait at least 1 ms
2550776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        timeoutMs = (timeout + 999999) / 1000000;
2560776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2570776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2580776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    return mCombinedFence->wait(timeoutMs);
2590776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin}
2600776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2610776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkinsize_t Camera3InputStream::getBufferCountLocked() {
2620776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    return mTotalBufferCount;
2638be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
2648be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
2658be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalastatus_t Camera3InputStream::disconnectLocked() {
2660776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    switch (mState) {
2670776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        case STATE_IN_RECONFIG:
2680776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        case STATE_CONFIGURED:
2690776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            // OK
2700776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            break;
2710776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        default:
2720776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            // No connection, nothing to do
2730776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            return OK;
2740776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2750776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2760776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (mDequeuedBufferCount > 0) {
2770776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Can't disconnect with %d buffers still acquired!",
2780776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                __FUNCTION__, mDequeuedBufferCount);
2790776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return INVALID_OPERATION;
2800776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2810776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2820776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(mBuffersInFlight.size() == 0);
2830776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2840776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    /**
2850776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     *  no-op since we can't disconnect the producer from the consumer-side
2860776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     */
2870776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2880776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    mState = (mState == STATE_IN_RECONFIG) ? STATE_IN_CONFIG : STATE_CONSTRUCTED;
2890776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    return OK;
2908be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
2918be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
2928be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalasp<IGraphicBufferProducer> Camera3InputStream::getProducerInterface() const {
2938be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala    return mConsumer->getProducerInterface();
2948be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
2958be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
2968be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalavoid Camera3InputStream::dump(int fd, const Vector<String16> &args) const {
2978be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala    (void) args;
2980776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    String8 lines;
2990776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    lines.appendFormat("    Stream[%d]: Input\n", mId);
3000776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    lines.appendFormat("      State: %d\n", mState);
3010776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    lines.appendFormat("      Dims: %d x %d, format 0x%x\n",
3020776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            camera3_stream::width, camera3_stream::height,
3030776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            camera3_stream::format);
3040776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    lines.appendFormat("      Max size: %d\n", mMaxSize);
3050776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    lines.appendFormat("      Usage: %d, max HAL buffers: %d\n",
3060776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            camera3_stream::usage, camera3_stream::max_buffers);
3070776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    lines.appendFormat("      Frames produced: %d, last timestamp: %lld ns\n",
3080776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            mFrameCount, mLastTimestamp);
3090776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    lines.appendFormat("      Total buffers: %d, currently acquired: %d\n",
3100776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            mTotalBufferCount, mDequeuedBufferCount);
3110776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    write(fd, lines.string(), lines.size());
3120776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin}
3130776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
3140776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkinstatus_t Camera3InputStream::configureQueueLocked() {
3150776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    status_t res;
3160776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
3170776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    switch (mState) {
3180776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        case STATE_IN_RECONFIG:
3190776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            res = disconnectLocked();
3200776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            if (res != OK) {
3210776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                return res;
3220776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            }
3230776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            break;
3240776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        case STATE_IN_CONFIG:
3250776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            // OK
3260776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            break;
3270776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        default:
3280776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            ALOGE("%s: Bad state: %d", __FUNCTION__, mState);
3290776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            return INVALID_OPERATION;
3300776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
3310776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
3320776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(mMaxSize == 0);
3330776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(camera3_stream::format != HAL_PIXEL_FORMAT_BLOB);
3340776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
3350776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    mTotalBufferCount = BufferQueue::MIN_UNDEQUEUED_BUFFERS +
3360776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                        camera3_stream::max_buffers;
3370776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    mDequeuedBufferCount = 0;
3380776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    mFrameCount = 0;
3390776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
3400776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (mConsumer.get() == 0) {
3410776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        mConsumer = new BufferItemConsumer(camera3_stream::usage,
3420776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                                           mTotalBufferCount,
3430776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                                           /*synchronousMode*/true);
3440776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        mConsumer->setName(String8::format("Camera3-InputStream-%d", mId));
3450776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
3460776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
3470776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    res = mConsumer->setDefaultBufferSize(camera3_stream::width,
3480776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                                          camera3_stream::height);
3490776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
3500776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Could not set buffer dimensions %dx%d",
3510776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId, camera3_stream::width, camera3_stream::height);
3520776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return res;
3530776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
3540776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    res = mConsumer->setDefaultBufferFormat(camera3_stream::format);
3550776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
3560776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Could not set buffer format %d",
3570776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId, camera3_stream::format);
3580776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return res;
3590776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
3600776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
3610776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    return OK;
3628be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
3638be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
3648be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}; // namespace camera3
3658be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
3668be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}; // namespace android
367