Camera3InputStream.cpp revision 0776a14513300f04dc5c1d2f89c4156576b8b8ed
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 210776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin// This is needed for stdint.h to define INT64_MAX in C++ 220776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin#define __STDC_LIMIT_MACROS 230776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 248be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#include <utils/Log.h> 258be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#include <utils/Trace.h> 268be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#include "Camera3InputStream.h" 278be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 288be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalanamespace android { 298be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 308be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalanamespace camera3 { 318be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 328be20f50711a94426f1394ec113672e41c1224e8Eino-Ville TalvalaCamera3InputStream::Camera3InputStream(int id, 338be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala uint32_t width, uint32_t height, int format) : 340776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin Camera3Stream(id, CAMERA3_STREAM_INPUT, width, height, 0, format), 350776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mTotalBufferCount(0), 360776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mDequeuedBufferCount(0), 370776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mFrameCount(0), 380776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mLastTimestamp(0) { 390776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mCombinedFence = new Fence(); 400776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 410776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (format == HAL_PIXEL_FORMAT_BLOB) { 420776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Bad format, BLOB not supported", __FUNCTION__); 430776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mState = STATE_ERROR; 440776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 450776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin} 460776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 470776a14513300f04dc5c1d2f89c4156576b8b8edIgor MurashkinCamera3InputStream::~Camera3InputStream() { 480776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin disconnectLocked(); 498be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala} 508be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 510776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkinstatus_t Camera3InputStream::getInputBufferLocked( 520776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin camera3_stream_buffer *buffer) { 530776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ATRACE_CALL(); 540776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin status_t res; 550776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 560776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // FIXME: will not work in (re-)registration 570776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (mState == STATE_IN_CONFIG || mState == STATE_IN_RECONFIG) { 580776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Stream %d: Buffer registration for input streams" 590776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin " not implemented (state %d)", 600776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin __FUNCTION__, mId, mState); 610776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return INVALID_OPERATION; 620776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 630776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 640776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // Allow acquire during IN_[RE]CONFIG for registration 650776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (mState != STATE_CONFIGURED && 660776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mState != STATE_IN_CONFIG && mState != STATE_IN_RECONFIG) { 670776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Stream %d: Can't get buffers in unconfigured state %d", 680776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin __FUNCTION__, mId, mState); 690776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return INVALID_OPERATION; 700776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 710776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 720776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // Only limit acquire amount when fully configured 730776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (mState == STATE_CONFIGURED && 740776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mDequeuedBufferCount == camera3_stream::max_buffers) { 750776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Stream %d: Already acquired maximum number of simultaneous" 760776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin " buffers (%d)", __FUNCTION__, mId, 770776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin camera3_stream::max_buffers); 780776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return INVALID_OPERATION; 790776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 800776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 810776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ANativeWindowBuffer* anb; 820776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin int fenceFd; 830776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 840776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin assert(mConsumer != 0); 850776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 860776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin BufferItem bufferItem; 870776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin res = mConsumer->acquireBuffer(&bufferItem, /*waitForFence*/false); 880776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 890776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (res != OK) { 900776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Stream %d: Can't acquire next output buffer: %s (%d)", 910776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin __FUNCTION__, mId, strerror(-res), res); 920776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return res; 930776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 940776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 950776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin anb = bufferItem.mGraphicBuffer->getNativeBuffer(); 960776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin assert(anb != NULL); 970776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin fenceFd = bufferItem.mFence->dup(); 980776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin /** 990776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin * FenceFD now owned by HAL except in case of error, 1000776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin * in which case we reassign it to acquire_fence 1010776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin */ 1020776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 1030776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // Handing out a raw pointer to this object. Increment internal refcount. 1040776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin incStrong(this); 1050776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin buffer->stream = this; 1060776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin buffer->buffer = &(anb->handle); 1070776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin buffer->acquire_fence = fenceFd; 1080776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin buffer->release_fence = -1; 1090776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin buffer->status = CAMERA3_BUFFER_STATUS_OK; 1100776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 1110776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mDequeuedBufferCount++; 1120776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 1130776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mBuffersInFlight.push_back(bufferItem); 1140776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 1150776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return OK; 1168be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala} 1178be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 1180776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkinstatus_t Camera3InputStream::returnInputBufferLocked( 1190776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin const camera3_stream_buffer &buffer) { 1200776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ATRACE_CALL(); 1210776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin status_t res; 1220776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 1230776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // returnBuffer may be called from a raw pointer, not a sp<>, and we'll be 1240776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // decrementing the internal refcount next. In case this is the last ref, we 1250776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // might get destructed on the decStrong(), so keep an sp around until the 1260776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // end of the call - otherwise have to sprinkle the decStrong on all exit 1270776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // points. 1280776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin sp<Camera3InputStream> keepAlive(this); 1290776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin decStrong(this); 1300776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 1310776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // Allow buffers to be returned in the error state, to allow for disconnect 1320776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // and in the in-config states for registration 1330776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (mState == STATE_CONSTRUCTED) { 1340776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Stream %d: Can't return buffers in unconfigured state %d", 1350776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin __FUNCTION__, mId, mState); 1360776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return INVALID_OPERATION; 1370776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 1380776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (mDequeuedBufferCount == 0) { 1390776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Stream %d: No buffers outstanding to return", __FUNCTION__, 1400776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mId); 1410776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return INVALID_OPERATION; 1420776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 1430776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 1440776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin bool bufferFound = false; 1450776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin BufferItem bufferItem; 1460776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin { 1470776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // Find the buffer we are returning 1480776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin Vector<BufferItem>::iterator it, end; 1490776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin for (it = mBuffersInFlight.begin(), end = mBuffersInFlight.end(); 1500776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin it != end; 1510776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ++it) { 1520776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 1530776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin const BufferItem& tmp = *it; 1540776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ANativeWindowBuffer *anb = tmp.mGraphicBuffer->getNativeBuffer(); 1550776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (anb != NULL && &(anb->handle) == buffer.buffer) { 1560776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin bufferFound = true; 1570776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin bufferItem = tmp; 1580776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mBuffersInFlight.erase(it); 1590776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mDequeuedBufferCount--; 1600776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 1610776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 1620776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 1630776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (!bufferFound) { 1640776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Stream %d: Can't return buffer that wasn't sent to HAL", 1650776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin __FUNCTION__, mId); 1660776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return INVALID_OPERATION; 1670776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 1680776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 1690776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR) { 1700776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (buffer.release_fence != -1) { 1710776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Stream %d: HAL should not set release_fence(%d) when " 1720776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin "there is an error", __FUNCTION__, mId, buffer.release_fence); 1730776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin close(buffer.release_fence); 1740776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 1750776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 1760776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin /** 1770776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin * Reassign release fence as the acquire fence incase of error 1780776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin */ 1790776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin const_cast<camera3_stream_buffer*>(&buffer)->release_fence = 1800776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin buffer.acquire_fence; 1810776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 1820776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 1830776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin /** 1840776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin * Unconditionally return buffer to the buffer queue. 1850776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin * - Fwk takes over the release_fence ownership 1860776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin */ 1870776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin sp<Fence> releaseFence = new Fence(buffer.release_fence); 1880776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin res = mConsumer->releaseBuffer(bufferItem, releaseFence); 1890776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (res != OK) { 1900776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Stream %d: Error releasing buffer back to buffer queue:" 1910776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin " %s (%d)", __FUNCTION__, mId, strerror(-res), res); 1920776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return res; 1930776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 1940776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 1950776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mCombinedFence = Fence::merge(mName, mCombinedFence, releaseFence); 1960776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 1970776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mBufferReturnedSignal.signal(); 1980776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 1990776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return OK; 2000776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 2018be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala} 2028be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 2038be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalabool Camera3InputStream::hasOutstandingBuffersLocked() const { 2040776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin nsecs_t signalTime = mCombinedFence->getSignalTime(); 2050776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGV("%s: Stream %d: Has %d outstanding buffers," 2060776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin " buffer signal time is %lld", 2070776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin __FUNCTION__, mId, mDequeuedBufferCount, signalTime); 2080776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (mDequeuedBufferCount > 0 || signalTime == INT64_MAX) { 2090776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return true; 2100776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 2118be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala return false; 2128be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala} 2138be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 2148be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalastatus_t Camera3InputStream::waitUntilIdle(nsecs_t timeout) { 2150776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin status_t res; 2160776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin { 2170776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin Mutex::Autolock l(mLock); 2180776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin while (mDequeuedBufferCount > 0) { 2190776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (timeout != TIMEOUT_NEVER) { 2200776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin nsecs_t startTime = systemTime(); 2210776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin res = mBufferReturnedSignal.waitRelative(mLock, timeout); 2220776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (res == TIMED_OUT) { 2230776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return res; 2240776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } else if (res != OK) { 2250776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Error waiting for outstanding buffers: %s (%d)", 2260776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin __FUNCTION__, strerror(-res), res); 2270776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return res; 2280776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 2290776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin nsecs_t deltaTime = systemTime() - startTime; 2300776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (timeout <= deltaTime) { 2310776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin timeout = 0; 2320776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } else { 2330776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin timeout -= deltaTime; 2340776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 2350776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } else { 2360776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin res = mBufferReturnedSignal.wait(mLock); 2370776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (res != OK) { 2380776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Error waiting for outstanding buffers: %s (%d)", 2390776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin __FUNCTION__, strerror(-res), res); 2400776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return res; 2410776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 2420776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 2430776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 2440776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 2450776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 2460776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // No lock 2470776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 2480776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin unsigned int timeoutMs; 2490776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (timeout == TIMEOUT_NEVER) { 2500776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin timeoutMs = Fence::TIMEOUT_NEVER; 2510776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } else if (timeout == 0) { 2520776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin timeoutMs = 0; 2530776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } else { 2540776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // Round up to wait at least 1 ms 2550776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin timeoutMs = (timeout + 999999) / 1000000; 2560776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 2570776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 2580776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return mCombinedFence->wait(timeoutMs); 2590776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin} 2600776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 2610776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkinsize_t Camera3InputStream::getBufferCountLocked() { 2620776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return mTotalBufferCount; 2638be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala} 2648be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 2658be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalastatus_t Camera3InputStream::disconnectLocked() { 2660776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin switch (mState) { 2670776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin case STATE_IN_RECONFIG: 2680776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin case STATE_CONFIGURED: 2690776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // OK 2700776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin break; 2710776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin default: 2720776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // No connection, nothing to do 2730776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return OK; 2740776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 2750776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 2760776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (mDequeuedBufferCount > 0) { 2770776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Can't disconnect with %d buffers still acquired!", 2780776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin __FUNCTION__, mDequeuedBufferCount); 2790776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return INVALID_OPERATION; 2800776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 2810776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 2820776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin assert(mBuffersInFlight.size() == 0); 2830776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 2840776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin /** 2850776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin * no-op since we can't disconnect the producer from the consumer-side 2860776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin */ 2870776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 2880776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mState = (mState == STATE_IN_RECONFIG) ? STATE_IN_CONFIG : STATE_CONSTRUCTED; 2890776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return OK; 2908be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala} 2918be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 2928be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalasp<IGraphicBufferProducer> Camera3InputStream::getProducerInterface() const { 2938be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala return mConsumer->getProducerInterface(); 2948be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala} 2958be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 2968be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalavoid Camera3InputStream::dump(int fd, const Vector<String16> &args) const { 2978be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala (void) args; 2980776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin String8 lines; 2990776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin lines.appendFormat(" Stream[%d]: Input\n", mId); 3000776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin lines.appendFormat(" State: %d\n", mState); 3010776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin lines.appendFormat(" Dims: %d x %d, format 0x%x\n", 3020776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin camera3_stream::width, camera3_stream::height, 3030776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin camera3_stream::format); 3040776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin lines.appendFormat(" Max size: %d\n", mMaxSize); 3050776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin lines.appendFormat(" Usage: %d, max HAL buffers: %d\n", 3060776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin camera3_stream::usage, camera3_stream::max_buffers); 3070776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin lines.appendFormat(" Frames produced: %d, last timestamp: %lld ns\n", 3080776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mFrameCount, mLastTimestamp); 3090776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin lines.appendFormat(" Total buffers: %d, currently acquired: %d\n", 3100776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mTotalBufferCount, mDequeuedBufferCount); 3110776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin write(fd, lines.string(), lines.size()); 3120776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin} 3130776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 3140776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkinstatus_t Camera3InputStream::configureQueueLocked() { 3150776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin status_t res; 3160776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 3170776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin switch (mState) { 3180776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin case STATE_IN_RECONFIG: 3190776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin res = disconnectLocked(); 3200776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (res != OK) { 3210776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return res; 3220776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 3230776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin break; 3240776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin case STATE_IN_CONFIG: 3250776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin // OK 3260776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin break; 3270776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin default: 3280776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Bad state: %d", __FUNCTION__, mState); 3290776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return INVALID_OPERATION; 3300776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 3310776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 3320776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin assert(mMaxSize == 0); 3330776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin assert(camera3_stream::format != HAL_PIXEL_FORMAT_BLOB); 3340776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 3350776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mTotalBufferCount = BufferQueue::MIN_UNDEQUEUED_BUFFERS + 3360776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin camera3_stream::max_buffers; 3370776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mDequeuedBufferCount = 0; 3380776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mFrameCount = 0; 3390776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 3400776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (mConsumer.get() == 0) { 3410776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mConsumer = new BufferItemConsumer(camera3_stream::usage, 3420776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mTotalBufferCount, 3430776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin /*synchronousMode*/true); 3440776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin mConsumer->setName(String8::format("Camera3-InputStream-%d", mId)); 3450776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 3460776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 3470776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin res = mConsumer->setDefaultBufferSize(camera3_stream::width, 3480776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin camera3_stream::height); 3490776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (res != OK) { 3500776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Stream %d: Could not set buffer dimensions %dx%d", 3510776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin __FUNCTION__, mId, camera3_stream::width, camera3_stream::height); 3520776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return res; 3530776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 3540776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin res = mConsumer->setDefaultBufferFormat(camera3_stream::format); 3550776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin if (res != OK) { 3560776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin ALOGE("%s: Stream %d: Could not set buffer format %d", 3570776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin __FUNCTION__, mId, camera3_stream::format); 3580776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return res; 3590776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin } 3600776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin 3610776a14513300f04dc5c1d2f89c4156576b8b8edIgor Murashkin return OK; 3628be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala} 3638be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 3648be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}; // namespace camera3 3658be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 3668be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}; // namespace android 367