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