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