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