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
21549e735c2ca22d16eea32fda418ba80da32a8558Dan Stoza#include <gui/BufferItem.h>
228be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#include <utils/Log.h>
238be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#include <utils/Trace.h>
248be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#include "Camera3InputStream.h"
258be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
268be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalanamespace android {
278be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
288be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalanamespace camera3 {
298be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
308be20f50711a94426f1394ec113672e41c1224e8Eino-Ville TalvalaCamera3InputStream::Camera3InputStream(int id,
318be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala        uint32_t width, uint32_t height, int format) :
32b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh        Camera3IOStreamBase(id, CAMERA3_STREAM_INPUT, width, height, /*maxSize*/0,
33b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh                            format, HAL_DATASPACE_UNKNOWN, CAMERA3_STREAM_ROTATION_0) {
340776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
350776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (format == HAL_PIXEL_FORMAT_BLOB) {
360776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Bad format, BLOB not supported", __FUNCTION__);
370776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        mState = STATE_ERROR;
380776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
390776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin}
400776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
410776a14513300f04dc5c1d2f89c4156576b8b8edIgor MurashkinCamera3InputStream::~Camera3InputStream() {
420776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    disconnectLocked();
438be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
448be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
450776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkinstatus_t Camera3InputStream::getInputBufferLocked(
460776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        camera3_stream_buffer *buffer) {
470776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    ATRACE_CALL();
480776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    status_t res;
490776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
500776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    // FIXME: will not work in (re-)registration
510776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (mState == STATE_IN_CONFIG || mState == STATE_IN_RECONFIG) {
520776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Buffer registration for input streams"
530776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              " not implemented (state %d)",
540776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId, mState);
550776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return INVALID_OPERATION;
560776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
570776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
58ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    if ((res = getBufferPreconditionCheckLocked()) != OK) {
59ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin        return res;
600776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
610776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
620776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    ANativeWindowBuffer* anb;
630776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    int fenceFd;
640776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
650776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(mConsumer != 0);
660776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
670776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    BufferItem bufferItem;
680776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
69618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    res = mConsumer->acquireBuffer(&bufferItem, /*waitForFence*/false);
700776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
710776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Can't acquire next output buffer: %s (%d)",
720776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                __FUNCTION__, mId, strerror(-res), res);
730776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return res;
740776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
750776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
760776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    anb = bufferItem.mGraphicBuffer->getNativeBuffer();
770776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(anb != NULL);
780776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    fenceFd = bufferItem.mFence->dup();
79ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin
800776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    /**
810776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * FenceFD now owned by HAL except in case of error,
820776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * in which case we reassign it to acquire_fence
830776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     */
84ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    handoutBufferLocked(*buffer, &(anb->handle), /*acquireFence*/fenceFd,
856adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He                        /*releaseFence*/-1, CAMERA3_BUFFER_STATUS_OK, /*output*/false);
860776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    mBuffersInFlight.push_back(bufferItem);
870776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
88c31dc7e61eb37214ad186f6a2bc43d7b92bd236eEino-Ville Talvala    mFrameCount++;
89c31dc7e61eb37214ad186f6a2bc43d7b92bd236eEino-Ville Talvala    mLastTimestamp = bufferItem.mTimestamp;
90c31dc7e61eb37214ad186f6a2bc43d7b92bd236eEino-Ville Talvala
910776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    return OK;
928be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
938be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
94ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkinstatus_t Camera3InputStream::returnBufferCheckedLocked(
95ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin            const camera3_stream_buffer &buffer,
96ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin            nsecs_t timestamp,
97ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin            bool output,
98ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin            /*out*/
99ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin            sp<Fence> *releaseFenceOut) {
1000776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
101ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    (void)timestamp;
102ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    (void)output;
103ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    ALOG_ASSERT(!output, "Expected output to be false");
104ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin
105ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    status_t res;
1060776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1070776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    bool bufferFound = false;
1080776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    BufferItem bufferItem;
1090776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    {
1100776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        // Find the buffer we are returning
1110776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        Vector<BufferItem>::iterator it, end;
1120776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        for (it = mBuffersInFlight.begin(), end = mBuffersInFlight.end();
1130776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin             it != end;
1140776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin             ++it) {
1150776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1160776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            const BufferItem& tmp = *it;
1170776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            ANativeWindowBuffer *anb = tmp.mGraphicBuffer->getNativeBuffer();
1180776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            if (anb != NULL && &(anb->handle) == buffer.buffer) {
1190776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                bufferFound = true;
1200776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                bufferItem = tmp;
1210776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                mBuffersInFlight.erase(it);
12205a8cf58ce8095752999e0efc7b2713cfeb5309eEino-Ville Talvala                break;
1230776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            }
1240776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        }
1250776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1260776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (!bufferFound) {
1270776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Can't return buffer that wasn't sent to HAL",
1280776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId);
1290776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return INVALID_OPERATION;
1300776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1310776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1320776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR) {
1330776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        if (buffer.release_fence != -1) {
1340776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            ALOGE("%s: Stream %d: HAL should not set release_fence(%d) when "
1350776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                  "there is an error", __FUNCTION__, mId, buffer.release_fence);
1360776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            close(buffer.release_fence);
1370776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        }
1380776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1390776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        /**
1400776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin         * Reassign release fence as the acquire fence incase of error
1410776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin         */
1420776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        const_cast<camera3_stream_buffer*>(&buffer)->release_fence =
1430776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                buffer.acquire_fence;
1440776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1450776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1460776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    /**
1470776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * Unconditionally return buffer to the buffer queue.
1480776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * - Fwk takes over the release_fence ownership
1490776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     */
1500776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    sp<Fence> releaseFence = new Fence(buffer.release_fence);
1510776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    res = mConsumer->releaseBuffer(bufferItem, releaseFence);
1520776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
1530776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Error releasing buffer back to buffer queue:"
1540776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                " %s (%d)", __FUNCTION__, mId, strerror(-res), res);
1550776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1560776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
157ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    *releaseFenceOut = releaseFence;
1580776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
159f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
1608be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
1618be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
162ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkinstatus_t Camera3InputStream::returnInputBufferLocked(
163ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin        const camera3_stream_buffer &buffer) {
164ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    ATRACE_CALL();
1650776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
166ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    return returnAnyBufferLocked(buffer, /*timestamp*/0, /*output*/false);
1678be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
1688be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
169618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chenstatus_t Camera3InputStream::getInputBufferProducerLocked(
170618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen            sp<IGraphicBufferProducer> *producer) {
171618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    ATRACE_CALL();
172618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
173618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    if (producer == NULL) {
174618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        return BAD_VALUE;
175618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    } else if (mProducer == NULL) {
176125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He        ALOGE("%s: No input stream is configured", __FUNCTION__);
177618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        return INVALID_OPERATION;
178618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    }
179618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
180618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    *producer = mProducer;
181618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    return OK;
182618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen}
183618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
1848be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalastatus_t Camera3InputStream::disconnectLocked() {
1850776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
186ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    status_t res;
187ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin
188ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    if ((res = Camera3IOStreamBase::disconnectLocked()) != OK) {
189ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin        return res;
1900776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1910776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1920776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(mBuffersInFlight.size() == 0);
1930776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
194ed0412ed78321bf9d35537626e33115862f7c805Chien-Yu Chen    mConsumer->abandon();
195ed0412ed78321bf9d35537626e33115862f7c805Chien-Yu Chen
1960776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    /**
1970776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     *  no-op since we can't disconnect the producer from the consumer-side
1980776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     */
1990776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
200ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    mState = (mState == STATE_IN_RECONFIG) ? STATE_IN_CONFIG
201ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin                                           : STATE_CONSTRUCTED;
2020776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    return OK;
2038be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
2048be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
2058be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalavoid Camera3InputStream::dump(int fd, const Vector<String16> &args) const {
2068be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala    (void) args;
2070776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    String8 lines;
2080776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    lines.appendFormat("    Stream[%d]: Input\n", mId);
2090776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    write(fd, lines.string(), lines.size());
210ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin
211ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    Camera3IOStreamBase::dump(fd, args);
2120776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin}
2130776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2140776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkinstatus_t Camera3InputStream::configureQueueLocked() {
2150776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    status_t res;
2160776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
217ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    if ((res = Camera3IOStreamBase::configureQueueLocked()) != OK) {
218ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin        return res;
2190776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2200776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2210776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(mMaxSize == 0);
2220776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(camera3_stream::format != HAL_PIXEL_FORMAT_BLOB);
2230776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2246adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    mHandoutTotalBufferCount = 0;
2250776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    mFrameCount = 0;
226c31dc7e61eb37214ad186f6a2bc43d7b92bd236eEino-Ville Talvala    mLastTimestamp = 0;
2270776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2280776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (mConsumer.get() == 0) {
2298aa0f0619ea867e8fb240cf27913d4f8ae767385Dan Stoza        sp<IGraphicBufferProducer> producer;
2308aa0f0619ea867e8fb240cf27913d4f8ae767385Dan Stoza        sp<IGraphicBufferConsumer> consumer;
2318aa0f0619ea867e8fb240cf27913d4f8ae767385Dan Stoza        BufferQueue::createBufferQueue(&producer, &consumer);
232054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin
233054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        int minUndequeuedBuffers = 0;
2348aa0f0619ea867e8fb240cf27913d4f8ae767385Dan Stoza        res = producer->query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBuffers);
235054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        if (res != OK || minUndequeuedBuffers < 0) {
236054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin            ALOGE("%s: Stream %d: Could not query min undequeued buffers (error %d, bufCount %d)",
237618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen                    __FUNCTION__, mId, res, minUndequeuedBuffers);
238054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin            return res;
239054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        }
240054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        size_t minBufs = static_cast<size_t>(minUndequeuedBuffers);
241618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
242618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        if (camera3_stream::max_buffers == 0) {
243618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen            ALOGE("%s: %d: HAL sets max_buffer to 0. Must be at least 1.",
244618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen                    __FUNCTION__, __LINE__);
245618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen            return INVALID_OPERATION;
246618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        }
247618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
248054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        /*
249054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         * We promise never to 'acquire' more than camera3_stream::max_buffers
250054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         * at any one time.
251054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         *
252054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         * Boost the number up to meet the minimum required buffer count.
253054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         *
254054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         * (Note that this sets consumer-side buffer count only,
255054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         * and not the sum of producer+consumer side as in other camera streams).
256054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         */
257054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        mTotalBufferCount = camera3_stream::max_buffers > minBufs ?
258054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin            camera3_stream::max_buffers : minBufs;
259054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        // TODO: somehow set the total buffer count when producer connects?
260054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin
2618aa0f0619ea867e8fb240cf27913d4f8ae767385Dan Stoza        mConsumer = new BufferItemConsumer(consumer, camera3_stream::usage,
2625e1f08b3917ac7900f8a11118afb7e8bf3e61c64Mathias Agopian                                           mTotalBufferCount);
2630776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        mConsumer->setName(String8::format("Camera3-InputStream-%d", mId));
264618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
265618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        mProducer = producer;
266be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh
267be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh        mConsumer->setBufferFreedListener(this);
2680776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2690776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2700776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    res = mConsumer->setDefaultBufferSize(camera3_stream::width,
2710776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                                          camera3_stream::height);
2720776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
2730776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Could not set buffer dimensions %dx%d",
2740776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId, camera3_stream::width, camera3_stream::height);
2750776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return res;
2760776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2770776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    res = mConsumer->setDefaultBufferFormat(camera3_stream::format);
2780776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
2790776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Could not set buffer format %d",
2800776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId, camera3_stream::format);
2810776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return res;
2820776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2830776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2840776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    return OK;
2858be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
2868be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
2874d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvalastatus_t Camera3InputStream::getEndpointUsage(uint32_t *usage) const {
288b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    // Per HAL3 spec, input streams have 0 for their initial usage field.
289b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    *usage = 0;
290b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    return OK;
291b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala}
292b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala
293be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yehvoid Camera3InputStream::onBufferFreed(const wp<GraphicBuffer>& gb) {
294be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh    const sp<GraphicBuffer> buffer = gb.promote();
295be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh    if (buffer != nullptr) {
296be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh        if (mBufferFreedListener != nullptr) {
297be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh            mBufferFreedListener->onBufferFreed(mId, buffer->handle);
298be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh        }
299be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh    } else {
300be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh        ALOGE("%s: GraphicBuffer is freed before onBufferFreed callback finishes!", __FUNCTION__);
301be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh    }
302be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh}
303be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh
3048be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}; // namespace camera3
3058be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
3068be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}; // namespace android
307