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
218be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#include <utils/Log.h>
228be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#include <utils/Trace.h>
238be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#include "Camera3InputStream.h"
248be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
258be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalanamespace android {
268be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
278be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalanamespace camera3 {
288be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
298be20f50711a94426f1394ec113672e41c1224e8Eino-Ville TalvalaCamera3InputStream::Camera3InputStream(int id,
308be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala        uint32_t width, uint32_t height, int format) :
31ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin        Camera3IOStreamBase(id, CAMERA3_STREAM_INPUT, width, height,
32ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin                            /*maxSize*/0, format) {
330776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
340776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (format == HAL_PIXEL_FORMAT_BLOB) {
350776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Bad format, BLOB not supported", __FUNCTION__);
360776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        mState = STATE_ERROR;
370776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
380776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin}
390776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
400776a14513300f04dc5c1d2f89c4156576b8b8edIgor MurashkinCamera3InputStream::~Camera3InputStream() {
410776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    disconnectLocked();
428be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
438be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
440776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkinstatus_t Camera3InputStream::getInputBufferLocked(
450776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        camera3_stream_buffer *buffer) {
460776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    ATRACE_CALL();
470776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    status_t res;
480776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
490776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    // FIXME: will not work in (re-)registration
500776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (mState == STATE_IN_CONFIG || mState == STATE_IN_RECONFIG) {
510776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Buffer registration for input streams"
520776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              " not implemented (state %d)",
530776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId, mState);
540776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return INVALID_OPERATION;
550776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
560776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
57ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    if ((res = getBufferPreconditionCheckLocked()) != OK) {
58ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin        return res;
590776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
600776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
610776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    ANativeWindowBuffer* anb;
620776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    int fenceFd;
630776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
640776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(mConsumer != 0);
650776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
660776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    BufferItem bufferItem;
670776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    res = mConsumer->acquireBuffer(&bufferItem, /*waitForFence*/false);
680776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
690776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
700776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Can't acquire next output buffer: %s (%d)",
710776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                __FUNCTION__, mId, strerror(-res), res);
720776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return res;
730776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
740776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
750776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    anb = bufferItem.mGraphicBuffer->getNativeBuffer();
760776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(anb != NULL);
770776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    fenceFd = bufferItem.mFence->dup();
78ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin
790776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    /**
800776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * FenceFD now owned by HAL except in case of error,
810776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * in which case we reassign it to acquire_fence
820776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     */
83ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    handoutBufferLocked(*buffer, &(anb->handle), /*acquireFence*/fenceFd,
846adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He                        /*releaseFence*/-1, CAMERA3_BUFFER_STATUS_OK, /*output*/false);
850776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    mBuffersInFlight.push_back(bufferItem);
860776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
870776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    return OK;
888be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
898be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
90ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkinstatus_t Camera3InputStream::returnBufferCheckedLocked(
91ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin            const camera3_stream_buffer &buffer,
92ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin            nsecs_t timestamp,
93ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin            bool output,
94ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin            /*out*/
95ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin            sp<Fence> *releaseFenceOut) {
960776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
97ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    (void)timestamp;
98ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    (void)output;
99ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    ALOG_ASSERT(!output, "Expected output to be false");
100ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin
101ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    status_t res;
1020776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1030776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    bool bufferFound = false;
1040776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    BufferItem bufferItem;
1050776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    {
1060776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        // Find the buffer we are returning
1070776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        Vector<BufferItem>::iterator it, end;
1080776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        for (it = mBuffersInFlight.begin(), end = mBuffersInFlight.end();
1090776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin             it != end;
1100776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin             ++it) {
1110776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1120776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            const BufferItem& tmp = *it;
1130776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            ANativeWindowBuffer *anb = tmp.mGraphicBuffer->getNativeBuffer();
1140776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            if (anb != NULL && &(anb->handle) == buffer.buffer) {
1150776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                bufferFound = true;
1160776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                bufferItem = tmp;
1170776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                mBuffersInFlight.erase(it);
1180776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            }
1190776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        }
1200776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1210776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (!bufferFound) {
1220776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Can't return buffer that wasn't sent to HAL",
1230776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId);
1240776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return INVALID_OPERATION;
1250776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1260776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1270776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR) {
1280776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        if (buffer.release_fence != -1) {
1290776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            ALOGE("%s: Stream %d: HAL should not set release_fence(%d) when "
1300776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                  "there is an error", __FUNCTION__, mId, buffer.release_fence);
1310776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            close(buffer.release_fence);
1320776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        }
1330776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1340776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        /**
1350776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin         * Reassign release fence as the acquire fence incase of error
1360776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin         */
1370776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        const_cast<camera3_stream_buffer*>(&buffer)->release_fence =
1380776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                buffer.acquire_fence;
1390776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1400776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1410776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    /**
1420776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * Unconditionally return buffer to the buffer queue.
1430776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * - Fwk takes over the release_fence ownership
1440776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     */
1450776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    sp<Fence> releaseFence = new Fence(buffer.release_fence);
1460776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    res = mConsumer->releaseBuffer(bufferItem, releaseFence);
1470776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
1480776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Error releasing buffer back to buffer queue:"
1490776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                " %s (%d)", __FUNCTION__, mId, strerror(-res), res);
1500776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1510776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
152ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    *releaseFenceOut = releaseFence;
1530776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
154f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
1558be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
1568be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
157ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkinstatus_t Camera3InputStream::returnInputBufferLocked(
158ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin        const camera3_stream_buffer &buffer) {
159ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    ATRACE_CALL();
1600776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
161ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    return returnAnyBufferLocked(buffer, /*timestamp*/0, /*output*/false);
1628be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
1638be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
1648be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalastatus_t Camera3InputStream::disconnectLocked() {
1650776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
166ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    status_t res;
167ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin
168ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    if ((res = Camera3IOStreamBase::disconnectLocked()) != OK) {
169ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin        return res;
1700776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1710776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1720776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(mBuffersInFlight.size() == 0);
1730776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1740776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    /**
1750776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     *  no-op since we can't disconnect the producer from the consumer-side
1760776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     */
1770776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
178ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    mState = (mState == STATE_IN_RECONFIG) ? STATE_IN_CONFIG
179ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin                                           : STATE_CONSTRUCTED;
1800776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    return OK;
1818be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
1828be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
1838be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalavoid Camera3InputStream::dump(int fd, const Vector<String16> &args) const {
1848be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala    (void) args;
1850776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    String8 lines;
1860776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    lines.appendFormat("    Stream[%d]: Input\n", mId);
1870776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    write(fd, lines.string(), lines.size());
188ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin
189ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    Camera3IOStreamBase::dump(fd, args);
1900776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin}
1910776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1920776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkinstatus_t Camera3InputStream::configureQueueLocked() {
1930776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    status_t res;
1940776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
195ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    if ((res = Camera3IOStreamBase::configureQueueLocked()) != OK) {
196ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin        return res;
1970776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1980776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1990776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(mMaxSize == 0);
2000776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(camera3_stream::format != HAL_PIXEL_FORMAT_BLOB);
2010776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2026adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    mHandoutTotalBufferCount = 0;
2030776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    mFrameCount = 0;
2040776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2050776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (mConsumer.get() == 0) {
2068aa0f0619ea867e8fb240cf27913d4f8ae767385Dan Stoza        sp<IGraphicBufferProducer> producer;
2078aa0f0619ea867e8fb240cf27913d4f8ae767385Dan Stoza        sp<IGraphicBufferConsumer> consumer;
2088aa0f0619ea867e8fb240cf27913d4f8ae767385Dan Stoza        BufferQueue::createBufferQueue(&producer, &consumer);
209054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin
210054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        int minUndequeuedBuffers = 0;
2118aa0f0619ea867e8fb240cf27913d4f8ae767385Dan Stoza        res = producer->query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBuffers);
212054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        if (res != OK || minUndequeuedBuffers < 0) {
213054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin            ALOGE("%s: Stream %d: Could not query min undequeued buffers (error %d, bufCount %d)",
214054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin                  __FUNCTION__, mId, res, minUndequeuedBuffers);
215054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin            return res;
216054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        }
217054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        size_t minBufs = static_cast<size_t>(minUndequeuedBuffers);
218054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        /*
219054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         * We promise never to 'acquire' more than camera3_stream::max_buffers
220054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         * at any one time.
221054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         *
222054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         * Boost the number up to meet the minimum required buffer count.
223054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         *
224054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         * (Note that this sets consumer-side buffer count only,
225054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         * and not the sum of producer+consumer side as in other camera streams).
226054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         */
227054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        mTotalBufferCount = camera3_stream::max_buffers > minBufs ?
228054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin            camera3_stream::max_buffers : minBufs;
229054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        // TODO: somehow set the total buffer count when producer connects?
230054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin
2318aa0f0619ea867e8fb240cf27913d4f8ae767385Dan Stoza        mConsumer = new BufferItemConsumer(consumer, camera3_stream::usage,
2325e1f08b3917ac7900f8a11118afb7e8bf3e61c64Mathias Agopian                                           mTotalBufferCount);
2330776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        mConsumer->setName(String8::format("Camera3-InputStream-%d", mId));
2340776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2350776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2360776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    res = mConsumer->setDefaultBufferSize(camera3_stream::width,
2370776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                                          camera3_stream::height);
2380776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
2390776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Could not set buffer dimensions %dx%d",
2400776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId, camera3_stream::width, camera3_stream::height);
2410776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return res;
2420776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2430776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    res = mConsumer->setDefaultBufferFormat(camera3_stream::format);
2440776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
2450776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Could not set buffer format %d",
2460776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId, camera3_stream::format);
2470776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return res;
2480776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2490776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2500776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    return OK;
2518be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
2528be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
253b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvalastatus_t Camera3InputStream::getEndpointUsage(uint32_t *usage) {
254b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    // Per HAL3 spec, input streams have 0 for their initial usage field.
255b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    *usage = 0;
256b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    return OK;
257b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala}
258b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala
2598be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}; // namespace camera3
2608be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
2618be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}; // namespace android
262