Camera3Stream.cpp revision 5a269fa72b419e7fe4bf6bf9b27eec8782b3a963
1fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala/* 2fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * Copyright (C) 2013 The Android Open Source Project 3fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * 4fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 5fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * you may not use this file except in compliance with the License. 6fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * You may obtain a copy of the License at 7fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * 8fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 9fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * 10fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 11fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 12fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * See the License for the specific language governing permissions and 14fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * limitations under the License. 15fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala */ 16fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 17fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#define LOG_TAG "Camera3-Stream" 18fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA 19fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala//#define LOG_NDEBUG 0 20fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 21fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#include <utils/Log.h> 22fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#include <utils/Trace.h> 23fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#include "Camera3Stream.h" 24fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 25fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalanamespace android { 26fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 27fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalanamespace camera3 { 28fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 29fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville TalvalaCamera3Stream::~Camera3Stream() { 30fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 31fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 32fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville TalvalaCamera3Stream* Camera3Stream::cast(camera3_stream *stream) { 33fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return static_cast<Camera3Stream*>(stream); 34fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 35fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 36fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalaconst Camera3Stream* Camera3Stream::cast(const camera3_stream *stream) { 37fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return static_cast<const Camera3Stream*>(stream); 38fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 39fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 40fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville TalvalaCamera3Stream::Camera3Stream(int id, 41fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream_type type, 42fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala uint32_t width, uint32_t height, size_t maxSize, int format) : 43fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream(), 44fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mId(id), 45fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mName(String8::format("Camera3Stream[%d]", id)), 46fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mMaxSize(maxSize), 47fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState(STATE_CONSTRUCTED) { 48fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 49fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::stream_type = type; 50fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::width = width; 51fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::height = height; 52fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::format = format; 53fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::usage = 0; 54fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::max_buffers = 0; 55fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::priv = NULL; 56fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 57fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (format == HAL_PIXEL_FORMAT_BLOB && maxSize == 0) { 58fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: BLOB format with size == 0", __FUNCTION__); 59fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_ERROR; 60fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 61fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 62fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 63fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalaint Camera3Stream::getId() const { 64fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return mId; 65fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 66fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 67fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalauint32_t Camera3Stream::getWidth() const { 68fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return camera3_stream::width; 69fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 70fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 71fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalauint32_t Camera3Stream::getHeight() const { 72fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return camera3_stream::height; 73fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 74fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 75fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalaint Camera3Stream::getFormat() const { 76fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return camera3_stream::format; 77fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 78fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 79fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalacamera3_stream* Camera3Stream::startConfiguration() { 80fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 81fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 82fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala switch (mState) { 83fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_ERROR: 84fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: In error state", __FUNCTION__); 85fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return NULL; 86fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_CONSTRUCTED: 87fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // OK 88fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala break; 89fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_IN_CONFIG: 90fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_IN_RECONFIG: 91fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Can start config again with no trouble; but don't redo 92fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // oldUsage/oldMaxBuffers 93fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return this; 94fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_CONFIGURED: 95fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (stream_type == CAMERA3_STREAM_INPUT) { 96fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Cannot configure an input stream twice", 97fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__); 98fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return NULL; 99fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } else if (hasOutstandingBuffersLocked()) { 100fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Cannot configure stream; has outstanding buffers", 101fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__); 102fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return NULL; 103fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 104fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala break; 105fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala default: 106fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Unknown state %d", __FUNCTION__, mState); 107fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return NULL; 108fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 109fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 110fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala oldUsage = usage; 111fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala oldMaxBuffers = max_buffers; 112fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 113fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (mState == STATE_CONSTRUCTED) { 114fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_IN_CONFIG; 115fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } else { // mState == STATE_CONFIGURED 116fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_IN_RECONFIG; 117fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 118fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 119fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return this; 120fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 121fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 122fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalabool Camera3Stream::isConfiguring() const { 123fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 124fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return (mState == STATE_IN_CONFIG) || (mState == STATE_IN_RECONFIG); 125fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 126fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 127fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalastatus_t Camera3Stream::finishConfiguration(camera3_device *hal3Device) { 128fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 129fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala switch (mState) { 130fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_ERROR: 131fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: In error state", __FUNCTION__); 132fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return INVALID_OPERATION; 133fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_IN_CONFIG: 134fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_IN_RECONFIG: 135fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // OK 136fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala break; 137fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_CONSTRUCTED: 138fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_CONFIGURED: 139fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Cannot finish configuration that hasn't been started", 140fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__); 141fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return INVALID_OPERATION; 142fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala default: 143fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Unknown state", __FUNCTION__); 144fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return INVALID_OPERATION; 145fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 146fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 147fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Check if the stream configuration is unchanged, and skip reallocation if 148fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // so. As documented in hardware/camera3.h:configure_streams(). 149fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (mState == STATE_IN_RECONFIG && 150fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala oldUsage == usage && 151fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala oldMaxBuffers == max_buffers) { 152fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_CONFIGURED; 153fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return OK; 154fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 155fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 156fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala status_t res; 157fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala res = configureQueueLocked(); 158fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (res != OK) { 159fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Unable to configure stream %d queue: %s (%d)", 160fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 161fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_ERROR; 162fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return res; 163fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 164fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 165fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala res = registerBuffersLocked(hal3Device); 166fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (res != OK) { 167fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Unable to register stream buffers with HAL: %s (%d)", 168fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 169fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_ERROR; 170fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return res; 171fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 172fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 173fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_CONFIGURED; 174fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 175fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return res; 176fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 177fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 178fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalastatus_t Camera3Stream::getBuffer(camera3_stream_buffer *buffer) { 179fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ATRACE_CALL(); 180fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 181fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return getBufferLocked(buffer); 182fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 183fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 184fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalastatus_t Camera3Stream::returnBuffer(const camera3_stream_buffer &buffer, 185fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala nsecs_t timestamp) { 186fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ATRACE_CALL(); 187fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 188fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return returnBufferLocked(buffer, timestamp); 189fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 190fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 1915a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::getInputBuffer(camera3_stream_buffer *buffer) { 1925a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ATRACE_CALL(); 1935a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin Mutex::Autolock l(mLock); 1945a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return getInputBufferLocked(buffer); 1955a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 1965a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 1975a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::returnInputBuffer(const camera3_stream_buffer &buffer) { 1985a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ATRACE_CALL(); 1995a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin Mutex::Autolock l(mLock); 2005a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return returnInputBufferLocked(buffer); 2015a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 2025a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 203fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalabool Camera3Stream::hasOutstandingBuffers() const { 204fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ATRACE_CALL(); 205fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 206fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return hasOutstandingBuffersLocked(); 207fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 208fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 209fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalastatus_t Camera3Stream::disconnect() { 210fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ATRACE_CALL(); 211fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 212fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return disconnectLocked(); 213fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 214fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 215fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalastatus_t Camera3Stream::registerBuffersLocked(camera3_device *hal3Device) { 216fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ATRACE_CALL(); 217fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala status_t res; 218fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 219fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala size_t bufferCount = getBufferCountLocked(); 220fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 221fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Vector<buffer_handle_t*> buffers; 222fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala buffers.insertAt(NULL, 0, bufferCount); 223fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 224fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream_buffer_set bufferSet = camera3_stream_buffer_set(); 225fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala bufferSet.stream = this; 226fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala bufferSet.num_buffers = bufferCount; 227fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala bufferSet.buffers = buffers.editArray(); 228fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 229fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Vector<camera3_stream_buffer_t> streamBuffers; 230fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala streamBuffers.insertAt(camera3_stream_buffer_t(), 0, bufferCount); 231fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 232fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Register all buffers with the HAL. This means getting all the buffers 233fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // from the stream, providing them to the HAL with the 234fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // register_stream_buffers() method, and then returning them back to the 235fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // stream in the error state, since they won't have valid data. 236fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // 237fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Only registered buffers can be sent to the HAL. 238fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 239fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala uint32_t bufferIdx = 0; 240fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala for (; bufferIdx < bufferCount; bufferIdx++) { 241fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala res = getBufferLocked( &streamBuffers.editItemAt(bufferIdx) ); 242fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (res != OK) { 243fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Unable to get buffer %d for registration with HAL", 244fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__, bufferIdx); 245fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Skip registering, go straight to cleanup 246fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala break; 247fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 248fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 249fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala sp<Fence> fence = new Fence(streamBuffers[bufferIdx].acquire_fence); 250fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala fence->waitForever(kRegisterFenceTimeoutMs, 251fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala "Camera3Stream::registerBuffers"); 252fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 253fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala buffers.editItemAt(bufferIdx) = streamBuffers[bufferIdx].buffer; 254fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 255fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (bufferIdx == bufferCount) { 256fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Got all buffers, register with HAL 257fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGV("%s: Registering %d buffers with camera HAL", 258fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__, bufferCount); 259fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala res = hal3Device->ops->register_stream_buffers(hal3Device, 260fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala &bufferSet); 261fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 262fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 263fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Return all valid buffers to stream, in ERROR state to indicate 264fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // they weren't filled. 265fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala for (size_t i = 0; i < bufferIdx; i++) { 266fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala streamBuffers.editItemAt(i).release_fence = -1; 267fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala streamBuffers.editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR; 268fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala returnBufferLocked(streamBuffers[i], 0); 269fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 270fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 271fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return res; 272fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 273fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 2745a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::getBufferLocked(camera3_stream_buffer *) { 2755a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: This type of stream does not support output", __FUNCTION__); 2765a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 2775a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 2785a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::returnBufferLocked(const camera3_stream_buffer &, 2795a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin nsecs_t) { 2805a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: This type of stream does not support output", __FUNCTION__); 2815a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 2825a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 2835a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::getInputBufferLocked(camera3_stream_buffer *) { 2845a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: This type of stream does not support input", __FUNCTION__); 2855a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 2865a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 2875a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::returnInputBufferLocked( 2885a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin const camera3_stream_buffer &) { 2895a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: This type of stream does not support input", __FUNCTION__); 2905a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 2915a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 2925a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 293fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace camera3 294fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 295fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace android 296