18be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala/*
2c28189a64a6ef65aecccb6e3bb980f1afc189a1cShuzhen Wang * Copyright (C) 2013-2018 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
30c28189a64a6ef65aecccb6e3bb980f1afc189a1cShuzhen Wangconst String8 Camera3InputStream::DUMMY_ID;
31c28189a64a6ef65aecccb6e3bb980f1afc189a1cShuzhen Wang
328be20f50711a94426f1394ec113672e41c1224e8Eino-Ville TalvalaCamera3InputStream::Camera3InputStream(int id,
338be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala        uint32_t width, uint32_t height, int format) :
34b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh        Camera3IOStreamBase(id, CAMERA3_STREAM_INPUT, width, height, /*maxSize*/0,
35c28189a64a6ef65aecccb6e3bb980f1afc189a1cShuzhen Wang                            format, HAL_DATASPACE_UNKNOWN, CAMERA3_STREAM_ROTATION_0,
36c28189a64a6ef65aecccb6e3bb980f1afc189a1cShuzhen Wang                            DUMMY_ID) {
370776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
380776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (format == HAL_PIXEL_FORMAT_BLOB) {
390776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Bad format, BLOB not supported", __FUNCTION__);
400776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        mState = STATE_ERROR;
410776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
420776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin}
430776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
440776a14513300f04dc5c1d2f89c4156576b8b8edIgor MurashkinCamera3InputStream::~Camera3InputStream() {
450776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    disconnectLocked();
468be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
478be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
480776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkinstatus_t Camera3InputStream::getInputBufferLocked(
490776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        camera3_stream_buffer *buffer) {
500776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    ATRACE_CALL();
510776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    status_t res;
520776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
530776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    // FIXME: will not work in (re-)registration
540776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (mState == STATE_IN_CONFIG || mState == STATE_IN_RECONFIG) {
550776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Buffer registration for input streams"
560776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              " not implemented (state %d)",
570776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId, mState);
580776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return INVALID_OPERATION;
590776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
600776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
61ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    if ((res = getBufferPreconditionCheckLocked()) != OK) {
62ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin        return res;
630776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
640776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
650776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    ANativeWindowBuffer* anb;
660776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    int fenceFd;
670776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
680776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(mConsumer != 0);
690776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
700776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    BufferItem bufferItem;
710776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
72618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    res = mConsumer->acquireBuffer(&bufferItem, /*waitForFence*/false);
730776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
740776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Can't acquire next output buffer: %s (%d)",
750776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                __FUNCTION__, mId, strerror(-res), res);
760776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return res;
770776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
780776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
790776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    anb = bufferItem.mGraphicBuffer->getNativeBuffer();
800776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(anb != NULL);
810776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    fenceFd = bufferItem.mFence->dup();
82ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin
830776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    /**
840776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * FenceFD now owned by HAL except in case of error,
850776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * in which case we reassign it to acquire_fence
860776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     */
87ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    handoutBufferLocked(*buffer, &(anb->handle), /*acquireFence*/fenceFd,
886adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He                        /*releaseFence*/-1, CAMERA3_BUFFER_STATUS_OK, /*output*/false);
890776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    mBuffersInFlight.push_back(bufferItem);
900776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
91c31dc7e61eb37214ad186f6a2bc43d7b92bd236eEino-Ville Talvala    mFrameCount++;
92c31dc7e61eb37214ad186f6a2bc43d7b92bd236eEino-Ville Talvala    mLastTimestamp = bufferItem.mTimestamp;
93c31dc7e61eb37214ad186f6a2bc43d7b92bd236eEino-Ville Talvala
940776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    return OK;
958be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
968be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
97ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkinstatus_t Camera3InputStream::returnBufferCheckedLocked(
98ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin            const camera3_stream_buffer &buffer,
99ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin            nsecs_t timestamp,
100ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin            bool output,
101ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin            /*out*/
102ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin            sp<Fence> *releaseFenceOut) {
1030776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
104ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    (void)timestamp;
105ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    (void)output;
106ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    ALOG_ASSERT(!output, "Expected output to be false");
107ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin
108ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    status_t res;
1090776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1100776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    bool bufferFound = false;
1110776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    BufferItem bufferItem;
1120776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    {
1130776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        // Find the buffer we are returning
1140776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        Vector<BufferItem>::iterator it, end;
1150776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        for (it = mBuffersInFlight.begin(), end = mBuffersInFlight.end();
1160776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin             it != end;
1170776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin             ++it) {
1180776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1190776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            const BufferItem& tmp = *it;
1200776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            ANativeWindowBuffer *anb = tmp.mGraphicBuffer->getNativeBuffer();
1210776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            if (anb != NULL && &(anb->handle) == buffer.buffer) {
1220776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                bufferFound = true;
1230776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                bufferItem = tmp;
1240776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                mBuffersInFlight.erase(it);
12505a8cf58ce8095752999e0efc7b2713cfeb5309eEino-Ville Talvala                break;
1260776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            }
1270776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        }
1280776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1290776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (!bufferFound) {
1300776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Can't return buffer that wasn't sent to HAL",
1310776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId);
1320776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return INVALID_OPERATION;
1330776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1340776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1350776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR) {
1360776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        if (buffer.release_fence != -1) {
1370776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            ALOGE("%s: Stream %d: HAL should not set release_fence(%d) when "
1380776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                  "there is an error", __FUNCTION__, mId, buffer.release_fence);
1390776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin            close(buffer.release_fence);
1400776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        }
1410776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1420776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        /**
1430776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin         * Reassign release fence as the acquire fence incase of error
1440776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin         */
1450776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        const_cast<camera3_stream_buffer*>(&buffer)->release_fence =
1460776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                buffer.acquire_fence;
1470776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1480776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1490776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    /**
1500776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * Unconditionally return buffer to the buffer queue.
1510776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     * - Fwk takes over the release_fence ownership
1520776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     */
1530776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    sp<Fence> releaseFence = new Fence(buffer.release_fence);
1540776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    res = mConsumer->releaseBuffer(bufferItem, releaseFence);
1550776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
1560776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Error releasing buffer back to buffer queue:"
1570776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                " %s (%d)", __FUNCTION__, mId, strerror(-res), res);
1580776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1590776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
160ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    *releaseFenceOut = releaseFence;
1610776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
162f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    return res;
1638be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
1648be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
165ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkinstatus_t Camera3InputStream::returnInputBufferLocked(
166ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin        const camera3_stream_buffer &buffer) {
167ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    ATRACE_CALL();
1680776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
169ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    return returnAnyBufferLocked(buffer, /*timestamp*/0, /*output*/false);
1708be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
1718be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
172618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chenstatus_t Camera3InputStream::getInputBufferProducerLocked(
173618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen            sp<IGraphicBufferProducer> *producer) {
174618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    ATRACE_CALL();
175618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
176618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    if (producer == NULL) {
177618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        return BAD_VALUE;
178618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    } else if (mProducer == NULL) {
179125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He        ALOGE("%s: No input stream is configured", __FUNCTION__);
180618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        return INVALID_OPERATION;
181618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    }
182618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
183618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    *producer = mProducer;
184618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    return OK;
185618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen}
186618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
1878be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalastatus_t Camera3InputStream::disconnectLocked() {
1880776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
189ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    status_t res;
190ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin
191ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    if ((res = Camera3IOStreamBase::disconnectLocked()) != OK) {
192ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin        return res;
1930776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
1940776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
1950776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(mBuffersInFlight.size() == 0);
1960776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
197ed0412ed78321bf9d35537626e33115862f7c805Chien-Yu Chen    mConsumer->abandon();
198ed0412ed78321bf9d35537626e33115862f7c805Chien-Yu Chen
1990776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    /**
2000776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     *  no-op since we can't disconnect the producer from the consumer-side
2010776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin     */
2020776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
203ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    mState = (mState == STATE_IN_RECONFIG) ? STATE_IN_CONFIG
204ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin                                           : STATE_CONSTRUCTED;
2050776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    return OK;
2068be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
2078be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
2088be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalavoid Camera3InputStream::dump(int fd, const Vector<String16> &args) const {
2098be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala    (void) args;
2100776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    String8 lines;
2110776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    lines.appendFormat("    Stream[%d]: Input\n", mId);
2120776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    write(fd, lines.string(), lines.size());
213ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin
214ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    Camera3IOStreamBase::dump(fd, args);
2150776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin}
2160776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2170776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkinstatus_t Camera3InputStream::configureQueueLocked() {
2180776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    status_t res;
2190776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
220ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin    if ((res = Camera3IOStreamBase::configureQueueLocked()) != OK) {
221ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin        return res;
2220776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2230776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2240776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(mMaxSize == 0);
2250776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    assert(camera3_stream::format != HAL_PIXEL_FORMAT_BLOB);
2260776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2276adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    mHandoutTotalBufferCount = 0;
2280776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    mFrameCount = 0;
229c31dc7e61eb37214ad186f6a2bc43d7b92bd236eEino-Ville Talvala    mLastTimestamp = 0;
2300776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2310776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (mConsumer.get() == 0) {
2328aa0f0619ea867e8fb240cf27913d4f8ae767385Dan Stoza        sp<IGraphicBufferProducer> producer;
2338aa0f0619ea867e8fb240cf27913d4f8ae767385Dan Stoza        sp<IGraphicBufferConsumer> consumer;
2348aa0f0619ea867e8fb240cf27913d4f8ae767385Dan Stoza        BufferQueue::createBufferQueue(&producer, &consumer);
235054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin
236054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        int minUndequeuedBuffers = 0;
2378aa0f0619ea867e8fb240cf27913d4f8ae767385Dan Stoza        res = producer->query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBuffers);
238054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        if (res != OK || minUndequeuedBuffers < 0) {
239054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin            ALOGE("%s: Stream %d: Could not query min undequeued buffers (error %d, bufCount %d)",
240618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen                    __FUNCTION__, mId, res, minUndequeuedBuffers);
241054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin            return res;
242054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        }
243054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        size_t minBufs = static_cast<size_t>(minUndequeuedBuffers);
244618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
245618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        if (camera3_stream::max_buffers == 0) {
246618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen            ALOGE("%s: %d: HAL sets max_buffer to 0. Must be at least 1.",
247618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen                    __FUNCTION__, __LINE__);
248618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen            return INVALID_OPERATION;
249618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        }
250618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
251054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        /*
252054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         * We promise never to 'acquire' more than camera3_stream::max_buffers
253054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         * at any one time.
254054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         *
255054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         * Boost the number up to meet the minimum required buffer count.
256054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         *
257054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         * (Note that this sets consumer-side buffer count only,
258054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         * and not the sum of producer+consumer side as in other camera streams).
259054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin         */
260054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        mTotalBufferCount = camera3_stream::max_buffers > minBufs ?
261054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin            camera3_stream::max_buffers : minBufs;
262054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin        // TODO: somehow set the total buffer count when producer connects?
263054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin
264050f5dcf7d1903926b165ebdd2dd30f7a2e83c02Emilian Peev        mConsumer = new BufferItemConsumer(consumer, mUsage,
2655e1f08b3917ac7900f8a11118afb7e8bf3e61c64Mathias Agopian                                           mTotalBufferCount);
2660776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        mConsumer->setName(String8::format("Camera3-InputStream-%d", mId));
267618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
268618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        mProducer = producer;
269be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh
270be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh        mConsumer->setBufferFreedListener(this);
2710776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2720776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2730776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    res = mConsumer->setDefaultBufferSize(camera3_stream::width,
2740776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin                                          camera3_stream::height);
2750776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
2760776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Could not set buffer dimensions %dx%d",
2770776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId, camera3_stream::width, camera3_stream::height);
2780776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return res;
2790776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2800776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    res = mConsumer->setDefaultBufferFormat(camera3_stream::format);
2810776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    if (res != OK) {
2820776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        ALOGE("%s: Stream %d: Could not set buffer format %d",
2830776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin              __FUNCTION__, mId, camera3_stream::format);
2840776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin        return res;
2850776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    }
2860776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin
2870776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin    return OK;
2888be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}
2898be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
290050f5dcf7d1903926b165ebdd2dd30f7a2e83c02Emilian Peevstatus_t Camera3InputStream::getEndpointUsage(uint64_t *usage) const {
291b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    // Per HAL3 spec, input streams have 0 for their initial usage field.
292b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    *usage = 0;
293b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    return OK;
294b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala}
295b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala
296be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yehvoid Camera3InputStream::onBufferFreed(const wp<GraphicBuffer>& gb) {
297be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh    const sp<GraphicBuffer> buffer = gb.promote();
298be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh    if (buffer != nullptr) {
299889234d4b84ef011c21e28be51ff614231603a06Emilian Peev        camera3_stream_buffer streamBuffer =
300889234d4b84ef011c21e28be51ff614231603a06Emilian Peev                {nullptr, &buffer->handle, 0, -1, -1};
301889234d4b84ef011c21e28be51ff614231603a06Emilian Peev        // Check if this buffer is outstanding.
302889234d4b84ef011c21e28be51ff614231603a06Emilian Peev        if (isOutstandingBuffer(streamBuffer)) {
303889234d4b84ef011c21e28be51ff614231603a06Emilian Peev            ALOGV("%s: Stream %d: Trying to free a buffer that is still being "
304889234d4b84ef011c21e28be51ff614231603a06Emilian Peev                    "processed.", __FUNCTION__, mId);
305889234d4b84ef011c21e28be51ff614231603a06Emilian Peev            return;
306889234d4b84ef011c21e28be51ff614231603a06Emilian Peev        }
307889234d4b84ef011c21e28be51ff614231603a06Emilian Peev
308db1e864daf162007341d6715094330c13bf5482fYin-Chia Yeh        sp<Camera3StreamBufferFreedListener> callback = mBufferFreedListener.promote();
309db1e864daf162007341d6715094330c13bf5482fYin-Chia Yeh        if (callback != nullptr) {
310db1e864daf162007341d6715094330c13bf5482fYin-Chia Yeh            callback->onBufferFreed(mId, buffer->handle);
311be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh        }
312be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh    } else {
313be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh        ALOGE("%s: GraphicBuffer is freed before onBufferFreed callback finishes!", __FUNCTION__);
314be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh    }
315be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh}
316be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh
3178be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}; // namespace camera3
3188be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala
3198be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}; // namespace android
320