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