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> 23f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala#include "device3/Camera3Stream.h" 24f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala#include "device3/StatusTracker.h" 25fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 2613d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin#include <cutils/properties.h> 2713d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin 28fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalanamespace android { 29fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 30fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalanamespace camera3 { 31fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 32fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville TalvalaCamera3Stream::~Camera3Stream() { 33f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 34f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0 && mStatusId != StatusTracker::NO_STATUS_ID) { 35f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->removeComponent(mStatusId); 36f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 37fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 38fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 39fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville TalvalaCamera3Stream* Camera3Stream::cast(camera3_stream *stream) { 40fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return static_cast<Camera3Stream*>(stream); 41fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 42fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 43fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalaconst Camera3Stream* Camera3Stream::cast(const camera3_stream *stream) { 44fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return static_cast<const Camera3Stream*>(stream); 45fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 46fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 47fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville TalvalaCamera3Stream::Camera3Stream(int id, 48fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream_type type, 49fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala uint32_t width, uint32_t height, size_t maxSize, int format) : 50fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream(), 51fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mId(id), 52fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mName(String8::format("Camera3Stream[%d]", id)), 53fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mMaxSize(maxSize), 54f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mState(STATE_CONSTRUCTED), 55f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusId(StatusTracker::NO_STATUS_ID) { 56fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 57fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::stream_type = type; 58fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::width = width; 59fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::height = height; 60fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::format = format; 61fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::usage = 0; 62fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::max_buffers = 0; 63fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::priv = NULL; 64fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 65fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (format == HAL_PIXEL_FORMAT_BLOB && maxSize == 0) { 66fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: BLOB format with size == 0", __FUNCTION__); 67fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_ERROR; 68fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 69fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 70fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 71fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalaint Camera3Stream::getId() const { 72fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return mId; 73fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 74fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 75fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalauint32_t Camera3Stream::getWidth() const { 76fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return camera3_stream::width; 77fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 78fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 79fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalauint32_t Camera3Stream::getHeight() const { 80fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return camera3_stream::height; 81fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 82fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 83fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalaint Camera3Stream::getFormat() const { 84fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return camera3_stream::format; 85fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 86fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 87fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalacamera3_stream* Camera3Stream::startConfiguration() { 88b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala ATRACE_CALL(); 89fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 90b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala status_t res; 91fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 92fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala switch (mState) { 93fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_ERROR: 94fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: In error state", __FUNCTION__); 95fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return NULL; 96fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_CONSTRUCTED: 97fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // OK 98fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala break; 99fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_IN_CONFIG: 100fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_IN_RECONFIG: 101fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Can start config again with no trouble; but don't redo 102fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // oldUsage/oldMaxBuffers 103fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return this; 104fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_CONFIGURED: 105fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (stream_type == CAMERA3_STREAM_INPUT) { 106fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Cannot configure an input stream twice", 107fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__); 108fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return NULL; 109fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } else if (hasOutstandingBuffersLocked()) { 110fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Cannot configure stream; has outstanding buffers", 111fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__); 112fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return NULL; 113fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 114fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala break; 115fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala default: 116fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Unknown state %d", __FUNCTION__, mState); 117fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return NULL; 118fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 119fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 120b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala oldUsage = camera3_stream::usage; 121b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala oldMaxBuffers = camera3_stream::max_buffers; 122b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala 123b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala res = getEndpointUsage(&(camera3_stream::usage)); 124b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala if (res != OK) { 125b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala ALOGE("%s: Cannot query consumer endpoint usage!", 126b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala __FUNCTION__); 127b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala return NULL; 128b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala } 129fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 130f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Stop tracking if currently doing so 131f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatusId != StatusTracker::NO_STATUS_ID) { 132f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 133f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 134f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->removeComponent(mStatusId); 135f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 136f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusId = StatusTracker::NO_STATUS_ID; 137f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 138f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 139fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (mState == STATE_CONSTRUCTED) { 140fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_IN_CONFIG; 141fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } else { // mState == STATE_CONFIGURED 14213d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin LOG_ALWAYS_FATAL_IF(mState != STATE_CONFIGURED, "Invalid state: 0x%x", mState); 143fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_IN_RECONFIG; 144fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 145fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 146fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return this; 147fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 148fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 149fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalabool Camera3Stream::isConfiguring() const { 150fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 151fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return (mState == STATE_IN_CONFIG) || (mState == STATE_IN_RECONFIG); 152fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 153fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 154fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalastatus_t Camera3Stream::finishConfiguration(camera3_device *hal3Device) { 155b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala ATRACE_CALL(); 156fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 157fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala switch (mState) { 158fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_ERROR: 159fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: In error state", __FUNCTION__); 160fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return INVALID_OPERATION; 161fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_IN_CONFIG: 162fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_IN_RECONFIG: 163fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // OK 164fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala break; 165fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_CONSTRUCTED: 166fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_CONFIGURED: 167fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Cannot finish configuration that hasn't been started", 168fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__); 169fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return INVALID_OPERATION; 170fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala default: 171fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Unknown state", __FUNCTION__); 172fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return INVALID_OPERATION; 173fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 174fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 175f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Register for idle tracking 176f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 177f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 178f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusId = statusTracker->addComponent(); 179f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 180f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 181fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Check if the stream configuration is unchanged, and skip reallocation if 182fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // so. As documented in hardware/camera3.h:configure_streams(). 183fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (mState == STATE_IN_RECONFIG && 184b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala oldUsage == camera3_stream::usage && 185b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala oldMaxBuffers == camera3_stream::max_buffers) { 186fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_CONFIGURED; 187fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return OK; 188fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 189fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 190fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala status_t res; 191fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala res = configureQueueLocked(); 192fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (res != OK) { 193fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Unable to configure stream %d queue: %s (%d)", 194fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 195fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_ERROR; 196fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return res; 197fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 198fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 199fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala res = registerBuffersLocked(hal3Device); 200fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (res != OK) { 201fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Unable to register stream buffers with HAL: %s (%d)", 202fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 203fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_ERROR; 204fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return res; 205fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 206fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 207fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_CONFIGURED; 208fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 209fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return res; 210fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 211fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 2121754351d9199721e7e7943461689e399ef015260Eino-Ville Talvalastatus_t Camera3Stream::cancelConfiguration() { 2131754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ATRACE_CALL(); 2141754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala Mutex::Autolock l(mLock); 2151754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala switch (mState) { 2161754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala case STATE_ERROR: 2171754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ALOGE("%s: In error state", __FUNCTION__); 2181754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala return INVALID_OPERATION; 2191754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala case STATE_IN_CONFIG: 2201754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala case STATE_IN_RECONFIG: 2211754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // OK 2221754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala break; 2231754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala case STATE_CONSTRUCTED: 2241754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala case STATE_CONFIGURED: 2251754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ALOGE("%s: Cannot cancel configuration that hasn't been started", 2261754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala __FUNCTION__); 2271754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala return INVALID_OPERATION; 2281754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala default: 2291754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala ALOGE("%s: Unknown state", __FUNCTION__); 2301754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala return INVALID_OPERATION; 2311754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala } 2321754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 2331754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala camera3_stream::usage = oldUsage; 2341754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala camera3_stream::max_buffers = oldMaxBuffers; 2351754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 2363ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh mState = (mState == STATE_IN_RECONFIG) ? STATE_CONFIGURED : STATE_CONSTRUCTED; 2371754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala return OK; 2381754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala} 2391754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 240fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalastatus_t Camera3Stream::getBuffer(camera3_stream_buffer *buffer) { 241fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ATRACE_CALL(); 242fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 2436adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He status_t res = OK; 2442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2456adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He // This function should be only called when the stream is configured already. 2466adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He if (mState != STATE_CONFIGURED) { 2476adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He ALOGE("%s: Stream %d: Can't get buffers if stream is not in CONFIGURED state %d", 2486adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He __FUNCTION__, mId, mState); 2496adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He return INVALID_OPERATION; 2506adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He } 2516adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He 2526adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He // Wait for new buffer returned back if we are running into the limit. 2536adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He if (getHandoutOutputBufferCountLocked() == camera3_stream::max_buffers) { 2546adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He ALOGV("%s: Already dequeued max output buffers (%d), wait for next returned one.", 2556adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He __FUNCTION__, camera3_stream::max_buffers); 2566adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He res = mOutputBufferReturnedSignal.waitRelative(mLock, kWaitForBufferDuration); 2576adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He if (res != OK) { 2586adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He if (res == TIMED_OUT) { 2596adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He ALOGE("%s: wait for output buffer return timed out after %lldms", __FUNCTION__, 2606adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He kWaitForBufferDuration / 1000000LL); 2616adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He } 2626adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He return res; 2636adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He } 2646adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He } 2656adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He 2666adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He res = getBufferLocked(buffer); 2672fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res == OK) { 2682fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin fireBufferListenersLocked(*buffer, /*acquired*/true, /*output*/true); 2692fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2702fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2712fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 272fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 273fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 274fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalastatus_t Camera3Stream::returnBuffer(const camera3_stream_buffer &buffer, 275fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala nsecs_t timestamp) { 276fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ATRACE_CALL(); 277fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 2782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 27913d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin /** 28013d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin * TODO: Check that the state is valid first. 28113d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin * 28213d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin * <HAL3.2 IN_CONFIG and IN_RECONFIG in addition to CONFIGURED. 28313d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin * >= HAL3.2 CONFIGURED only 28413d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin * 28513d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin * Do this for getBuffer as well. 28613d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin */ 2872fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin status_t res = returnBufferLocked(buffer, timestamp); 2882fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res == OK) { 2892fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin fireBufferListenersLocked(buffer, /*acquired*/false, /*output*/true); 2906adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He mOutputBufferReturnedSignal.signal(); 2912fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2922fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2932fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 294fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 295fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 2965a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::getInputBuffer(camera3_stream_buffer *buffer) { 2975a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ATRACE_CALL(); 2985a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin Mutex::Autolock l(mLock); 2996adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He status_t res = OK; 3006adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He 3016adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He // This function should be only called when the stream is configured already. 3026adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He if (mState != STATE_CONFIGURED) { 3036adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He ALOGE("%s: Stream %d: Can't get input buffers if stream is not in CONFIGURED state %d", 3046adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He __FUNCTION__, mId, mState); 3056adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He return INVALID_OPERATION; 3066adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He } 3076adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He 3086adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He // Wait for new buffer returned back if we are running into the limit. 3096adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He if (getHandoutInputBufferCountLocked() == camera3_stream::max_buffers) { 3106adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He ALOGV("%s: Already dequeued max input buffers (%d), wait for next returned one.", 3116adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He __FUNCTION__, camera3_stream::max_buffers); 3126adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He res = mInputBufferReturnedSignal.waitRelative(mLock, kWaitForBufferDuration); 3136adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He if (res != OK) { 3146adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He if (res == TIMED_OUT) { 3156adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He ALOGE("%s: wait for input buffer return timed out after %lldms", __FUNCTION__, 3166adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He kWaitForBufferDuration / 1000000LL); 3176adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He } 3186adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He return res; 3196adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He } 3206adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He } 3212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3226adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He res = getInputBufferLocked(buffer); 3232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res == OK) { 3242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin fireBufferListenersLocked(*buffer, /*acquired*/true, /*output*/false); 3252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 3262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 3285a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 3295a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 3305a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::returnInputBuffer(const camera3_stream_buffer &buffer) { 3315a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ATRACE_CALL(); 3325a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin Mutex::Autolock l(mLock); 3332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin status_t res = returnInputBufferLocked(buffer); 3352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res == OK) { 3362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin fireBufferListenersLocked(buffer, /*acquired*/false, /*output*/false); 3376adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He mInputBufferReturnedSignal.signal(); 3382fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 3392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 3402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 3412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3422fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinvoid Camera3Stream::fireBufferListenersLocked( 3432fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin const camera3_stream_buffer& /*buffer*/, bool acquired, bool output) { 3442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin List<wp<Camera3StreamBufferListener> >::iterator it, end; 3452fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3462fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // TODO: finish implementing 3472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3482fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Camera3StreamBufferListener::BufferInfo info = 3492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Camera3StreamBufferListener::BufferInfo(); 3502fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin info.mOutput = output; 3512fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // TODO: rest of fields 3522fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3532fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin for (it = mBufferListenerList.begin(), end = mBufferListenerList.end(); 3542fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin it != end; 3552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ++it) { 3562fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3StreamBufferListener> listener = it->promote(); 3582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (listener != 0) { 3592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (acquired) { 3602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin listener->onBufferAcquired(info); 3612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } else { 3622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin listener->onBufferReleased(info); 3632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 3642fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 3652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 3665a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 3675a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 368fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalabool Camera3Stream::hasOutstandingBuffers() const { 369fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ATRACE_CALL(); 370fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 371fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return hasOutstandingBuffersLocked(); 372fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 373fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 374f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Stream::setStatusTracker(sp<StatusTracker> statusTracker) { 375f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mLock); 376f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> oldTracker = mStatusTracker.promote(); 377f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (oldTracker != 0 && mStatusId != StatusTracker::NO_STATUS_ID) { 378f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala oldTracker->removeComponent(mStatusId); 379f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 380f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusId = StatusTracker::NO_STATUS_ID; 381f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker = statusTracker; 382f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 383f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return OK; 384f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 385f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 386fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalastatus_t Camera3Stream::disconnect() { 387fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ATRACE_CALL(); 388fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 389e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin ALOGV("%s: Stream %d: Disconnecting...", __FUNCTION__, mId); 390e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin status_t res = disconnectLocked(); 391e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin 392e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin if (res == -ENOTCONN) { 393e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin // "Already disconnected" -- not an error 394e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin return OK; 395e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin } else { 396e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin return res; 397e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin } 398fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 399fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 400fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalastatus_t Camera3Stream::registerBuffersLocked(camera3_device *hal3Device) { 401fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ATRACE_CALL(); 40213d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin 40313d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin /** 40413d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin * >= CAMERA_DEVICE_API_VERSION_3_2: 40513d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin * 40613d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin * camera3_device_t->ops->register_stream_buffers() is not called and must 40713d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin * be NULL. 40813d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin */ 40913d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin if (hal3Device->common.version >= CAMERA_DEVICE_API_VERSION_3_2) { 41013d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin ALOGV("%s: register_stream_buffers unused as of HAL3.2", __FUNCTION__); 41113d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin 412c758f2276f9f9fca9ea24a6647361726acb03646Igor Murashkin if (hal3Device->ops->register_stream_buffers != NULL) { 41313d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin ALOGE("%s: register_stream_buffers is deprecated in HAL3.2; " 41413d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin "must be set to NULL in camera3_device::ops", __FUNCTION__); 41513d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin return INVALID_OPERATION; 41613d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin } else { 41713c878f07fb36a49aade20cec684ed8e12724751Zhijun He ALOGD("%s: Skipping NULL check for deprecated register_stream_buffers", __FUNCTION__); 41813d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin } 41913d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin 42013d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin return OK; 42113d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin } else { 42213d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin ALOGV("%s: register_stream_buffers using deprecated code path", __FUNCTION__); 42313d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin } 42413d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin 425fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala status_t res; 426fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 427fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala size_t bufferCount = getBufferCountLocked(); 428fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 429fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Vector<buffer_handle_t*> buffers; 43013d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin buffers.insertAt(/*prototype_item*/NULL, /*index*/0, bufferCount); 431fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 432fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream_buffer_set bufferSet = camera3_stream_buffer_set(); 433fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala bufferSet.stream = this; 434fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala bufferSet.num_buffers = bufferCount; 435fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala bufferSet.buffers = buffers.editArray(); 436fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 437fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Vector<camera3_stream_buffer_t> streamBuffers; 43813d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin streamBuffers.insertAt(camera3_stream_buffer_t(), /*index*/0, bufferCount); 439fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 440fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Register all buffers with the HAL. This means getting all the buffers 441fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // from the stream, providing them to the HAL with the 442fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // register_stream_buffers() method, and then returning them back to the 443fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // stream in the error state, since they won't have valid data. 444fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // 445fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Only registered buffers can be sent to the HAL. 446fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 447fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala uint32_t bufferIdx = 0; 448fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala for (; bufferIdx < bufferCount; bufferIdx++) { 449fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala res = getBufferLocked( &streamBuffers.editItemAt(bufferIdx) ); 450fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (res != OK) { 451fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Unable to get buffer %d for registration with HAL", 452fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__, bufferIdx); 453fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Skip registering, go straight to cleanup 454fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala break; 455fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 456fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 457fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala sp<Fence> fence = new Fence(streamBuffers[bufferIdx].acquire_fence); 458d76442421eadfa73f2f3a9e50f6caf65b0dd1ce9Mathias Agopian fence->waitForever("Camera3Stream::registerBuffers"); 459fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 460fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala buffers.editItemAt(bufferIdx) = streamBuffers[bufferIdx].buffer; 461fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 462fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (bufferIdx == bufferCount) { 463fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Got all buffers, register with HAL 464e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGV("%s: Registering %zu buffers with camera HAL", 465fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__, bufferCount); 46617a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->register_stream_buffers"); 467fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala res = hal3Device->ops->register_stream_buffers(hal3Device, 468fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala &bufferSet); 46917a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 470fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 471fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 472fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Return all valid buffers to stream, in ERROR state to indicate 473fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // they weren't filled. 474fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala for (size_t i = 0; i < bufferIdx; i++) { 475fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala streamBuffers.editItemAt(i).release_fence = -1; 476fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala streamBuffers.editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR; 477fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala returnBufferLocked(streamBuffers[i], 0); 478fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 479fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 480fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return res; 481fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 482fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 4835a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::getBufferLocked(camera3_stream_buffer *) { 4845a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: This type of stream does not support output", __FUNCTION__); 4855a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 4865a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 4875a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::returnBufferLocked(const camera3_stream_buffer &, 4885a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin nsecs_t) { 4895a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: This type of stream does not support output", __FUNCTION__); 4905a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 4915a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 4925a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::getInputBufferLocked(camera3_stream_buffer *) { 4935a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: This type of stream does not support input", __FUNCTION__); 4945a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 4955a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 4965a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::returnInputBufferLocked( 4975a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin const camera3_stream_buffer &) { 4985a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: This type of stream does not support input", __FUNCTION__); 4995a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 5005a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 5015a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 5022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinvoid Camera3Stream::addBufferListener( 5032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin wp<Camera3StreamBufferListener> listener) { 5042fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mLock); 505f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He 506f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He List<wp<Camera3StreamBufferListener> >::iterator it, end; 507f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He for (it = mBufferListenerList.begin(), end = mBufferListenerList.end(); 508f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He it != end; 509f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He ) { 510f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He if (*it == listener) { 511f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He ALOGE("%s: Try to add the same listener twice, ignoring...", __FUNCTION__); 512f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He return; 513f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He } 514f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He it++; 515f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He } 516f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He 5172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mBufferListenerList.push_back(listener); 5182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 5192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 5202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinvoid Camera3Stream::removeBufferListener( 5212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin const sp<Camera3StreamBufferListener>& listener) { 5222fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mLock); 5232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 5242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin bool erased = true; 5252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin List<wp<Camera3StreamBufferListener> >::iterator it, end; 5262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin for (it = mBufferListenerList.begin(), end = mBufferListenerList.end(); 5272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin it != end; 5282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ) { 5292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 5302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (*it == listener) { 5312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin it = mBufferListenerList.erase(it); 5322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin erased = true; 5332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } else { 5342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ++it; 5352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 5362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 5372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 5382fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (!erased) { 5392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGW("%s: Could not find listener to remove, already removed", 5402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__); 5412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 5422fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 5432fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 544fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace camera3 545fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 546fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace android 547