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 26fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalanamespace android { 27fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 28fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalanamespace camera3 { 29fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 30fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville TalvalaCamera3Stream::~Camera3Stream() { 31f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 32f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0 && mStatusId != StatusTracker::NO_STATUS_ID) { 33f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->removeComponent(mStatusId); 34f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 35fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 36fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 37fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville TalvalaCamera3Stream* Camera3Stream::cast(camera3_stream *stream) { 38fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return static_cast<Camera3Stream*>(stream); 39fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 40fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 41fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalaconst Camera3Stream* Camera3Stream::cast(const camera3_stream *stream) { 42fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return static_cast<const Camera3Stream*>(stream); 43fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 44fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 45fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville TalvalaCamera3Stream::Camera3Stream(int id, 46fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream_type type, 47fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala uint32_t width, uint32_t height, size_t maxSize, int format) : 48fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream(), 49fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mId(id), 50fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mName(String8::format("Camera3Stream[%d]", id)), 51fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mMaxSize(maxSize), 52f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mState(STATE_CONSTRUCTED), 53f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusId(StatusTracker::NO_STATUS_ID) { 54fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 55fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::stream_type = type; 56fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::width = width; 57fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::height = height; 58fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::format = format; 59fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::usage = 0; 60fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::max_buffers = 0; 61fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream::priv = NULL; 62fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 63fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (format == HAL_PIXEL_FORMAT_BLOB && maxSize == 0) { 64fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: BLOB format with size == 0", __FUNCTION__); 65fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_ERROR; 66fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 67fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 68fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 69fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalaint Camera3Stream::getId() const { 70fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return mId; 71fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 72fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 73fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalauint32_t Camera3Stream::getWidth() const { 74fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return camera3_stream::width; 75fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 76fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 77fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalauint32_t Camera3Stream::getHeight() const { 78fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return camera3_stream::height; 79fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 80fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 81fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalaint Camera3Stream::getFormat() const { 82fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return camera3_stream::format; 83fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 84fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 85fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalacamera3_stream* Camera3Stream::startConfiguration() { 86b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala ATRACE_CALL(); 87fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 88b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala status_t res; 89fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 90fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala switch (mState) { 91fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_ERROR: 92fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: In error state", __FUNCTION__); 93fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return NULL; 94fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_CONSTRUCTED: 95fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // OK 96fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala break; 97fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_IN_CONFIG: 98fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_IN_RECONFIG: 99fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Can start config again with no trouble; but don't redo 100fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // oldUsage/oldMaxBuffers 101fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return this; 102fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_CONFIGURED: 103fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (stream_type == CAMERA3_STREAM_INPUT) { 104fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Cannot configure an input stream twice", 105fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__); 106fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return NULL; 107fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } else if (hasOutstandingBuffersLocked()) { 108fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Cannot configure stream; has outstanding buffers", 109fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__); 110fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return NULL; 111fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 112fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala break; 113fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala default: 114fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Unknown state %d", __FUNCTION__, mState); 115fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return NULL; 116fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 117fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 118b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala oldUsage = camera3_stream::usage; 119b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala oldMaxBuffers = camera3_stream::max_buffers; 120b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala 121b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala res = getEndpointUsage(&(camera3_stream::usage)); 122b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala if (res != OK) { 123b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala ALOGE("%s: Cannot query consumer endpoint usage!", 124b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala __FUNCTION__); 125b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala return NULL; 126b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala } 127fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 128f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Stop tracking if currently doing so 129f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (mStatusId != StatusTracker::NO_STATUS_ID) { 130f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 131f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 132f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala statusTracker->removeComponent(mStatusId); 133f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 134f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusId = StatusTracker::NO_STATUS_ID; 135f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 136f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 137fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (mState == STATE_CONSTRUCTED) { 138fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_IN_CONFIG; 139fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } else { // mState == STATE_CONFIGURED 140fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_IN_RECONFIG; 141fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 142fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 143fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return this; 144fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 145fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 146fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalabool Camera3Stream::isConfiguring() const { 147fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 148fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return (mState == STATE_IN_CONFIG) || (mState == STATE_IN_RECONFIG); 149fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 150fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 151fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalastatus_t Camera3Stream::finishConfiguration(camera3_device *hal3Device) { 152b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala ATRACE_CALL(); 153fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 154fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala switch (mState) { 155fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_ERROR: 156fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: In error state", __FUNCTION__); 157fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return INVALID_OPERATION; 158fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_IN_CONFIG: 159fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_IN_RECONFIG: 160fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // OK 161fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala break; 162fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_CONSTRUCTED: 163fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala case STATE_CONFIGURED: 164fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Cannot finish configuration that hasn't been started", 165fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__); 166fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return INVALID_OPERATION; 167fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala default: 168fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Unknown state", __FUNCTION__); 169fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return INVALID_OPERATION; 170fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 171fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 172f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Register for idle tracking 173f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> statusTracker = mStatusTracker.promote(); 174f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (statusTracker != 0) { 175f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusId = statusTracker->addComponent(); 176f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 177f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 178fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Check if the stream configuration is unchanged, and skip reallocation if 179fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // so. As documented in hardware/camera3.h:configure_streams(). 180fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (mState == STATE_IN_RECONFIG && 181b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala oldUsage == camera3_stream::usage && 182b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala oldMaxBuffers == camera3_stream::max_buffers) { 183fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_CONFIGURED; 184fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return OK; 185fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 186fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 187fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala status_t res; 188fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala res = configureQueueLocked(); 189fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (res != OK) { 190fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Unable to configure stream %d queue: %s (%d)", 191fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 192fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_ERROR; 193fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return res; 194fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 195fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 196fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala res = registerBuffersLocked(hal3Device); 197fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (res != OK) { 198fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Unable to register stream buffers with HAL: %s (%d)", 199fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 200fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_ERROR; 201fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return res; 202fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 203fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 204fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala mState = STATE_CONFIGURED; 205fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 206fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return res; 207fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 208fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 209fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalastatus_t Camera3Stream::getBuffer(camera3_stream_buffer *buffer) { 210fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ATRACE_CALL(); 211fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 2122fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin status_t res = getBufferLocked(buffer); 2142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res == OK) { 2152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin fireBufferListenersLocked(*buffer, /*acquired*/true, /*output*/true); 2162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 219fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 220fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 221fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalastatus_t Camera3Stream::returnBuffer(const camera3_stream_buffer &buffer, 222fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala nsecs_t timestamp) { 223fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ATRACE_CALL(); 224fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 2252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin status_t res = returnBufferLocked(buffer, timestamp); 2272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res == OK) { 2282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin fireBufferListenersLocked(buffer, /*acquired*/false, /*output*/true); 2292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 232fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 233fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 2345a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::getInputBuffer(camera3_stream_buffer *buffer) { 2355a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ATRACE_CALL(); 2365a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin Mutex::Autolock l(mLock); 2372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2382fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin status_t res = getInputBufferLocked(buffer); 2392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res == OK) { 2402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin fireBufferListenersLocked(*buffer, /*acquired*/true, /*output*/false); 2412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2422fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2432fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 2445a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 2455a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 2465a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::returnInputBuffer(const camera3_stream_buffer &buffer) { 2475a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ATRACE_CALL(); 2485a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin Mutex::Autolock l(mLock); 2492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2502fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin status_t res = returnInputBufferLocked(buffer); 2512fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res == OK) { 2522fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin fireBufferListenersLocked(buffer, /*acquired*/false, /*output*/false); 2532fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2542fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 2552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 2562fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinvoid Camera3Stream::fireBufferListenersLocked( 2582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin const camera3_stream_buffer& /*buffer*/, bool acquired, bool output) { 2592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin List<wp<Camera3StreamBufferListener> >::iterator it, end; 2602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // TODO: finish implementing 2622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Camera3StreamBufferListener::BufferInfo info = 2642fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Camera3StreamBufferListener::BufferInfo(); 2652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin info.mOutput = output; 2662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // TODO: rest of fields 2672fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2682fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin for (it = mBufferListenerList.begin(), end = mBufferListenerList.end(); 2692fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin it != end; 2702fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ++it) { 2712fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3StreamBufferListener> listener = it->promote(); 2732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (listener != 0) { 2742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (acquired) { 2752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin listener->onBufferAcquired(info); 2762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } else { 2772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin listener->onBufferReleased(info); 2782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2802fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2815a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 2825a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 283fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalabool Camera3Stream::hasOutstandingBuffers() const { 284fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ATRACE_CALL(); 285fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 286fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return hasOutstandingBuffersLocked(); 287fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 288fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 289f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvalastatus_t Camera3Stream::setStatusTracker(sp<StatusTracker> statusTracker) { 290f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex::Autolock l(mLock); 291f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<StatusTracker> oldTracker = mStatusTracker.promote(); 292f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala if (oldTracker != 0 && mStatusId != StatusTracker::NO_STATUS_ID) { 293f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala oldTracker->removeComponent(mStatusId); 294f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala } 295f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusId = StatusTracker::NO_STATUS_ID; 296f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala mStatusTracker = statusTracker; 297f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 298f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala return OK; 299f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala} 300f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 301fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalastatus_t Camera3Stream::disconnect() { 302fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ATRACE_CALL(); 303fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Mutex::Autolock l(mLock); 304e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin ALOGV("%s: Stream %d: Disconnecting...", __FUNCTION__, mId); 305e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin status_t res = disconnectLocked(); 306e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin 307e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin if (res == -ENOTCONN) { 308e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin // "Already disconnected" -- not an error 309e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin return OK; 310e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin } else { 311e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin return res; 312e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin } 313fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 314fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 315fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalastatus_t Camera3Stream::registerBuffersLocked(camera3_device *hal3Device) { 316fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ATRACE_CALL(); 317fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala status_t res; 318fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 319fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala size_t bufferCount = getBufferCountLocked(); 320fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 321fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Vector<buffer_handle_t*> buffers; 322fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala buffers.insertAt(NULL, 0, bufferCount); 323fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 324fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala camera3_stream_buffer_set bufferSet = camera3_stream_buffer_set(); 325fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala bufferSet.stream = this; 326fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala bufferSet.num_buffers = bufferCount; 327fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala bufferSet.buffers = buffers.editArray(); 328fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 329fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala Vector<camera3_stream_buffer_t> streamBuffers; 330fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala streamBuffers.insertAt(camera3_stream_buffer_t(), 0, bufferCount); 331fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 332fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Register all buffers with the HAL. This means getting all the buffers 333fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // from the stream, providing them to the HAL with the 334fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // register_stream_buffers() method, and then returning them back to the 335fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // stream in the error state, since they won't have valid data. 336fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // 337fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Only registered buffers can be sent to the HAL. 338fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 339fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala uint32_t bufferIdx = 0; 340fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala for (; bufferIdx < bufferCount; bufferIdx++) { 341fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala res = getBufferLocked( &streamBuffers.editItemAt(bufferIdx) ); 342fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (res != OK) { 343fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGE("%s: Unable to get buffer %d for registration with HAL", 344fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__, bufferIdx); 345fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Skip registering, go straight to cleanup 346fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala break; 347fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 348fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 349fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala sp<Fence> fence = new Fence(streamBuffers[bufferIdx].acquire_fence); 350d76442421eadfa73f2f3a9e50f6caf65b0dd1ce9Mathias Agopian fence->waitForever("Camera3Stream::registerBuffers"); 351fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 352fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala buffers.editItemAt(bufferIdx) = streamBuffers[bufferIdx].buffer; 353fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 354fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala if (bufferIdx == bufferCount) { 355fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Got all buffers, register with HAL 356fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala ALOGV("%s: Registering %d buffers with camera HAL", 357fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala __FUNCTION__, bufferCount); 35817a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_BEGIN("camera3->register_stream_buffers"); 359fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala res = hal3Device->ops->register_stream_buffers(hal3Device, 360fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala &bufferSet); 36117a61adbd7cc1abe432deeffc11660daa74f6496Eino-Ville Talvala ATRACE_END(); 362fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 363fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 364fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // Return all valid buffers to stream, in ERROR state to indicate 365fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala // they weren't filled. 366fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala for (size_t i = 0; i < bufferIdx; i++) { 367fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala streamBuffers.editItemAt(i).release_fence = -1; 368fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala streamBuffers.editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR; 369fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala returnBufferLocked(streamBuffers[i], 0); 370fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala } 371fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 372fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala return res; 373fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala} 374fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 3755a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::getBufferLocked(camera3_stream_buffer *) { 3765a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: This type of stream does not support output", __FUNCTION__); 3775a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 3785a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 3795a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::returnBufferLocked(const camera3_stream_buffer &, 3805a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin nsecs_t) { 3815a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: This type of stream does not support output", __FUNCTION__); 3825a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 3835a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 3845a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::getInputBufferLocked(camera3_stream_buffer *) { 3855a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: This type of stream does not support input", __FUNCTION__); 3865a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 3875a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 3885a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkinstatus_t Camera3Stream::returnInputBufferLocked( 3895a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin const camera3_stream_buffer &) { 3905a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin ALOGE("%s: This type of stream does not support input", __FUNCTION__); 3915a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin return INVALID_OPERATION; 3925a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin} 3935a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin 3942fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinvoid Camera3Stream::addBufferListener( 3952fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin wp<Camera3StreamBufferListener> listener) { 3962fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mLock); 3972fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mBufferListenerList.push_back(listener); 3982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 3992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 4002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinvoid Camera3Stream::removeBufferListener( 4012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin const sp<Camera3StreamBufferListener>& listener) { 4022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mLock); 4032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 4042fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin bool erased = true; 4052fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin List<wp<Camera3StreamBufferListener> >::iterator it, end; 4062fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin for (it = mBufferListenerList.begin(), end = mBufferListenerList.end(); 4072fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin it != end; 4082fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ) { 4092fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 4102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (*it == listener) { 4112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin it = mBufferListenerList.erase(it); 4122fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin erased = true; 4132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } else { 4142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ++it; 4152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 4162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 4172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 4182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (!erased) { 4192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGW("%s: Could not find listener to remove, already removed", 4202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__); 4212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 4222fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 4232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 424fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace camera3 425fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala 426fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace android 427