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