Camera3Stream.h revision 02bf03287652923b5bb5316667b065423565d6b4
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#ifndef ANDROID_SERVERS_CAMERA3_STREAM_H
18fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#define ANDROID_SERVERS_CAMERA3_STREAM_H
19fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
20fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#include <gui/Surface.h>
21fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#include <utils/RefBase.h>
22fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#include <utils/String8.h>
23fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#include <utils/String16.h>
242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <utils/List.h>
25fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
26fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#include "hardware/camera3.h"
27fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "Camera3StreamBufferListener.h"
292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "Camera3StreamInterface.h"
302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
31fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalanamespace android {
32fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
33fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalanamespace camera3 {
34fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
35fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala/**
36fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * A class for managing a single stream of input or output data from the camera
37fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * device.
38fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
39fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * The stream has an internal state machine to track whether it's
40fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * connected/configured/etc.
41fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
42fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * States:
43fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
44fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *  STATE_ERROR: A serious error has occurred, stream is unusable. Outstanding
45fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    buffers may still be returned.
46fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
47fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *  STATE_CONSTRUCTED: The stream is ready for configuration, but buffers cannot
48fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    be gotten yet. Not connected to any endpoint, no buffers are registered
49fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    with the HAL.
50fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
51fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *  STATE_IN_CONFIG: Configuration has started, but not yet concluded. During this
52fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    time, the usage, max_buffers, and priv fields of camera3_stream returned by
53fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    startConfiguration() may be modified.
54fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
55fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *  STATE_IN_RE_CONFIG: Configuration has started, and the stream has been
56fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    configured before. Need to track separately from IN_CONFIG to avoid
57fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    re-registering buffers with HAL.
58fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
59fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *  STATE_CONFIGURED: Stream is configured, and has registered buffers with the
604d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    HAL (if necessary). The stream's getBuffer/returnBuffer work. The priv
614d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    pointer may still be modified.
624d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *
634d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *  STATE_PREPARING: The stream's buffers are being pre-allocated for use.  On
644d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    older HALs, this is done as part of configuration, but in newer HALs
654d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    buffers may be allocated at time of first use. But some use cases require
664d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    buffer allocation upfront, to minmize disruption due to lengthy allocation
674d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    duration.  In this state, only prepareNextBuffer() and cancelPrepare()
684d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    may be called.
69fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
70fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * Transition table:
71fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
72fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    <none>               => STATE_CONSTRUCTED:
73fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When constructed with valid arguments
74fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    <none>               => STATE_ERROR:
75fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When constructed with invalid arguments
76fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_CONSTRUCTED    => STATE_IN_CONFIG:
77fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When startConfiguration() is called
78fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_IN_CONFIG      => STATE_CONFIGURED:
79fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When finishConfiguration() is called
80fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_IN_CONFIG      => STATE_ERROR:
81fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When finishConfiguration() fails to allocate or register buffers.
82fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_CONFIGURED     => STATE_IN_RE_CONFIG:  *
83fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When startConfiguration() is called again, after making sure stream is
84fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        idle with waitUntilIdle().
85fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_IN_RE_CONFIG   => STATE_CONFIGURED:
86fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When finishConfiguration() is called.
87fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_IN_RE_CONFIG   => STATE_ERROR:
88fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When finishConfiguration() fails to allocate or register buffers.
89fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_CONFIGURED     => STATE_CONSTRUCTED:
90fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When disconnect() is called after making sure stream is idle with
91fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        waitUntilIdle().
924d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    STATE_CONFIGURED     => STATE_PREPARING:
934d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *        When startPrepare is called before the stream has a buffer
944d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *        queued back into it for the first time.
954d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    STATE_PREPARING      => STATE_CONFIGURED:
964d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *        When sufficient prepareNextBuffer calls have been made to allocate
974d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *        all stream buffers, or cancelPrepare is called.
9813d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
9913d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin * Status Tracking:
10013d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    Each stream is tracked by StatusTracker as a separate component,
10113d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    depending on the handed out buffer count. The state must be STATE_CONFIGURED
10213d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    in order for the component to be marked.
10313d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
10413d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    It's marked in one of two ways:
10513d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
10613d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    - ACTIVE: One or more buffers have been handed out (with #getBuffer).
10713d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    - IDLE: All buffers have been returned (with #returnBuffer), and their
10813d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *          respective release_fence(s) have been signaled.
10913d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
11013d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    A typical use case is output streams. When the HAL has any buffers
11113d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    dequeued, the stream is marked ACTIVE. When the HAL returns all buffers
11213d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    (e.g. if no capture requests are active), the stream is marked IDLE.
11313d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    In this use case, the app consumer does not affect the component status.
11413d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
115fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala */
116fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalaclass Camera3Stream :
117fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        protected camera3_stream,
1182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        public virtual Camera3StreamInterface,
1192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        public virtual RefBase {
120fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  public:
121fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
122fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual ~Camera3Stream();
123fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
124fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    static Camera3Stream*       cast(camera3_stream *stream);
125fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    static const Camera3Stream* cast(const camera3_stream *stream);
126fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
127fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
128fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Get the stream's ID
129fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
130fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    int              getId() const;
131fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
132fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
133125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Get the output stream set id.
134125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
135125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    int              getStreamSetId() const;
136125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
137125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
138fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Get the stream's dimensions and format
139fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
1403d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala    uint32_t          getWidth() const;
1413d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala    uint32_t          getHeight() const;
1423d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala    int               getFormat() const;
1433d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala    android_dataspace getDataSpace() const;
144fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
145fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
146fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Start the stream configuration process. Returns a handle to the stream's
147fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * information to be passed into the HAL device's configure_streams call.
148fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
149fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Until finishConfiguration() is called, no other methods on the stream may be
150fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * called. The usage and max_buffers fields of camera3_stream may be modified
151fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * between start/finishConfiguration, but may not be changed after that.
152fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * The priv field of camera3_stream may be modified at any time after
153fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * startConfiguration.
154fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
155fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Returns NULL in case of error starting configuration.
156fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
157fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    camera3_stream*  startConfiguration();
158fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
159fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
160fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Check if the stream is mid-configuration (start has been called, but not
161fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * finish).  Used for lazy completion of configuration.
162fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
163fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    bool             isConfiguring() const;
164fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
165fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
166fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Completes the stream configuration process. During this call, the stream
167fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * may call the device's register_stream_buffers() method. The stream
168fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * information structure returned by startConfiguration() may no longer be
169fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * modified after this call, but can still be read until the destruction of
170fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * the stream.
171fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
172fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Returns:
173fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   OK on a successful configuration
174fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   NO_INIT in case of a serious error from the HAL device
175fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   NO_MEMORY in case of an error registering buffers
176fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   INVALID_OPERATION in case connecting to the consumer failed
177fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
178fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         finishConfiguration(camera3_device *hal3Device);
179fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
180fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
1811754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     * Cancels the stream configuration process. This returns the stream to the
1821754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     * initial state, allowing it to be configured again later.
1831754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     * This is done if the HAL rejects the proposed combined stream configuration
1841754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     */
1851754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala    status_t         cancelConfiguration();
1861754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala
1871754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala    /**
1884d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Determine whether the stream has already become in-use (has received
1894d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * a valid filled buffer), which determines if a stream can still have
1904d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * prepareNextBuffer called on it.
1914d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
1924d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    bool             isUnpreparable();
1934d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
1944d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
1954d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Start stream preparation. May only be called in the CONFIGURED state,
196c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk     * when no valid buffers have yet been returned to this stream. Prepares
197c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk     * up to maxCount buffers, or the maximum number of buffers needed by the
198c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk     * pipeline if maxCount is ALLOCATE_PIPELINE_MAX.
1994d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2004d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * If no prepartion is necessary, returns OK and does not transition to
2014d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * PREPARING state. Otherwise, returns NOT_ENOUGH_DATA and transitions
2024d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * to PREPARING.
2034d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2044d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * This call performs no allocation, so is quick to call.
2054d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2064d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Returns:
2074d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    OK if no more buffers need to be preallocated
2084d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    NOT_ENOUGH_DATA if calls to prepareNextBuffer are needed to finish
2094d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *        buffer pre-allocation, and transitions to the PREPARING state.
2104d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    NO_INIT in case of a serious error from the HAL device
2114d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    INVALID_OPERATION if called when not in CONFIGURED state, or a
2124d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *        valid buffer has already been returned to this stream.
2134d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
214c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk    status_t         startPrepare(int maxCount);
2154d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
2164d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
2174d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Check if the stream is mid-preparing.
2184d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
2194d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    bool             isPreparing() const;
2204d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
2214d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
2224d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Continue stream buffer preparation by allocating the next
2234d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * buffer for this stream.  May only be called in the PREPARED state.
2244d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2254d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Returns OK and transitions to the CONFIGURED state if all buffers
2264d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * are allocated after the call concludes. Otherwise returns NOT_ENOUGH_DATA.
2274d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2284d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * This call allocates one buffer, which may take several milliseconds for
2294d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * large buffers.
2304d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2314d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Returns:
2324d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    OK if no more buffers need to be preallocated, and transitions
2334d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *        to the CONFIGURED state.
2344d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    NOT_ENOUGH_DATA if more calls to prepareNextBuffer are needed to finish
2354d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *        buffer pre-allocation.
2364d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    NO_INIT in case of a serious error from the HAL device
2374d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    INVALID_OPERATION if called when not in CONFIGURED state, or a
2384d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *        valid buffer has already been returned to this stream.
2394d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
2404d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    status_t         prepareNextBuffer();
2414d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
2424d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
2434d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Cancel stream preparation early. In case allocation needs to be
2444d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * stopped, this method transitions the stream back to the CONFIGURED state.
2454d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Buffers that have been allocated with prepareNextBuffer remain that way,
2464d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * but a later use of prepareNextBuffer will require just as many
2474d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * calls as if the earlier prepare attempt had not existed.
2484d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2494d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Returns:
2504d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    OK if cancellation succeeded, and transitions to the CONFIGURED state
2514d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    INVALID_OPERATION if not in the PREPARING state
2524d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    NO_INIT in case of a serious error from the HAL device
2534d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
2544d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    status_t        cancelPrepare();
2554d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
2564d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
257b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     * Tear down memory for this stream. This frees all unused gralloc buffers
258b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     * allocated for this stream, but leaves it ready for operation afterward.
259b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     *
260b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     * May only be called in the CONFIGURED state, and keeps the stream in
261b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     * the CONFIGURED state.
262b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     *
263b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     * Returns:
264b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     *    OK if teardown succeeded.
265b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     *    INVALID_OPERATION if not in the CONFIGURED state
266b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     *    NO_INIT in case of a serious error from the HAL device
267b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     */
268b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala    status_t       tearDown();
269b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala
270b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala    /**
271fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Fill in the camera3_stream_buffer with the next valid buffer for this
272fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * stream, to hand over to the HAL.
273fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
274fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * This method may only be called once finishConfiguration has been called.
275fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * For bidirectional streams, this method applies to the output-side
276fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * buffers.
277fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
278fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
279fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         getBuffer(camera3_stream_buffer *buffer);
280fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
281fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
282fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Return a buffer to the stream after use by the HAL.
283fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
284fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * This method may only be called for buffers provided by getBuffer().
285fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * For bidirectional streams, this method applies to the output-side buffers
286fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
287fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         returnBuffer(const camera3_stream_buffer &buffer,
288fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala            nsecs_t timestamp);
289fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
290fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
2915a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * Fill in the camera3_stream_buffer with the next valid buffer for this
2925a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * stream, to hand over to the HAL.
2935a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
2945a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * This method may only be called once finishConfiguration has been called.
2955a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * For bidirectional streams, this method applies to the input-side
2965a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * buffers.
2975a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
2985a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     */
2995a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    status_t         getInputBuffer(camera3_stream_buffer *buffer);
3005a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
3015a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    /**
3025a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * Return a buffer to the stream after use by the HAL.
3035a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
3045a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * This method may only be called for buffers provided by getBuffer().
3055a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * For bidirectional streams, this method applies to the input-side buffers
3065a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     */
3075a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    status_t         returnInputBuffer(const camera3_stream_buffer &buffer);
3085a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
309618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // get the buffer producer of the input buffer queue.
310618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // only apply to input streams.
311618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    status_t         getInputBufferProducer(sp<IGraphicBufferProducer> *producer);
312618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
3135a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    /**
314fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Whether any of the stream's buffers are currently in use by the HAL,
315fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * including buffers that have been returned but not yet had their
316fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * release fence signaled.
317fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
318fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    bool             hasOutstandingBuffers() const;
319fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
320fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    enum {
321fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        TIMEOUT_NEVER = -1
322fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    };
323f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
324fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
325f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Set the status tracker to notify about idle transitions
326fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
327f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual status_t setStatusTracker(sp<StatusTracker> statusTracker);
328fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
329fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
330fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Disconnect stream from its non-HAL endpoint. After this,
331fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * start/finishConfiguration must be called before the stream can be used
332fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * again. This cannot be called if the stream has outstanding dequeued
333fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * buffers.
334fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
335fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         disconnect();
336fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
337fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
338fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Debug dump of the stream's state.
339fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
340fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual void     dump(int fd, const Vector<String16> &args) const = 0;
341fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
342f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He    /**
343f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * Add a camera3 buffer listener. Adding the same listener twice has
344f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * no effect.
345f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     */
3462fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void             addBufferListener(
3472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            wp<Camera3StreamBufferListener> listener);
348f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He
349f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He    /**
350f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * Remove a camera3 buffer listener. Removing the same listener twice
351f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * or the listener that was never added has no effect.
352f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     */
3532fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void             removeBufferListener(
3542fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            const sp<Camera3StreamBufferListener>& listener);
3552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
356fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  protected:
357fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const int mId;
358125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
359125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Stream set id, used to indicate which group of this stream belongs to for buffer sharing
360125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * across multiple streams.
361125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
362125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * The default value is set to CAMERA3_STREAM_SET_ID_INVALID, which indicates that this stream
363125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * doesn't intend to share buffers with any other streams, and this stream will fall back to
364125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * the existing BufferQueue mechanism to manage the buffer allocations and buffer circulation.
365125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * When a valid stream set id is set, this stream intends to use the Camera3BufferManager to
366125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * manage the buffer allocations; the BufferQueue will only handle the buffer transaction
367125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * between the producer and consumer. For this case, upon successfully registration, the streams
368125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * with the same stream set id will potentially share the buffers allocated by
369125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Camera3BufferManager.
370125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
371125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    const int mSetId;
372125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
373fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const String8 mName;
374fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Zero for formats with fixed buffer size for given dimensions.
375fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const size_t mMaxSize;
376fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
377fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    enum {
378fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_ERROR,
379fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_CONSTRUCTED,
380fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_IN_CONFIG,
381fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_IN_RECONFIG,
3824d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        STATE_CONFIGURED,
3834d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        STATE_PREPARING
384fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    } mState;
385fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
386fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    mutable Mutex mLock;
387fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
388fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    Camera3Stream(int id, camera3_stream_type type,
3893d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala            uint32_t width, uint32_t height, size_t maxSize, int format,
390125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He            android_dataspace dataSpace, camera3_stream_rotation_t rotation,
391125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He            int setId);
392fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
393fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
394fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Interface to be implemented by derived classes
395fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
396fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
397fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // getBuffer / returnBuffer implementations
398fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
399fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Since camera3_stream_buffer includes a raw pointer to the stream,
400fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // cast to camera3_stream*, implementations must increment the
401fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // refcount of the stream manually in getBufferLocked, and decrement it in
402fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // returnBufferLocked.
4035a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t getBufferLocked(camera3_stream_buffer *buffer);
404fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t returnBufferLocked(const camera3_stream_buffer &buffer,
4055a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            nsecs_t timestamp);
4065a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t getInputBufferLocked(camera3_stream_buffer *buffer);
4075a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t returnInputBufferLocked(
4085a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            const camera3_stream_buffer &buffer);
409fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual bool     hasOutstandingBuffersLocked() const = 0;
410618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // Get the buffer producer of the input buffer queue. Only apply to input streams.
411618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    virtual status_t getInputBufferProducerLocked(sp<IGraphicBufferProducer> *producer);
412618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
413e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin    // Can return -ENOTCONN when we are already disconnected (not an error)
414fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t disconnectLocked() = 0;
415fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
416fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Configure the buffer queue interface to the other end of the stream,
417fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // after the HAL has provided usage and max_buffers values. After this call,
418fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // the stream must be ready to produce all buffers for registration with
419fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // HAL.
420fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t configureQueueLocked() = 0;
421fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
422fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Get the total number of buffers in the queue
423fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual size_t   getBufferCountLocked() = 0;
424fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
4256adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    // Get handout output buffer count.
4266adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    virtual size_t   getHandoutOutputBufferCountLocked() = 0;
4276adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He
4286adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    // Get handout input buffer count.
4296adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    virtual size_t   getHandoutInputBufferCountLocked() = 0;
4306adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He
431b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    // Get the usage flags for the other endpoint, or return
432b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    // INVALID_OPERATION if they cannot be obtained.
4334d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    virtual status_t getEndpointUsage(uint32_t *usage) const = 0;
434b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala
435f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Tracking for idle state
436f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    wp<StatusTracker> mStatusTracker;
437f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Status tracker component ID
438f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    int mStatusId;
439f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
4404d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // Tracking for stream prepare - whether this stream can still have
4414d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // prepareNextBuffer called on it.
4424d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    bool mStreamUnpreparable;
4434d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
444fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  private:
44502bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala    uint32_t mOldUsage;
44602bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala    uint32_t mOldMaxBuffers;
4476adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    Condition mOutputBufferReturnedSignal;
4486adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    Condition mInputBufferReturnedSignal;
4496adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    static const nsecs_t kWaitForBufferDuration = 3000000000LL; // 3000 ms
450fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
451fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Gets all buffers from endpoint and registers them with the HAL.
452fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t registerBuffersLocked(camera3_device *hal3Device);
453fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
4542fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void fireBufferListenersLocked(const camera3_stream_buffer& buffer,
4552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                                  bool acquired, bool output);
4562fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    List<wp<Camera3StreamBufferListener> > mBufferListenerList;
4572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
4584d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    status_t        cancelPrepareLocked();
4594d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
4604d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // Tracking for PREPARING state
4614d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
4624d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // State of buffer preallocation. Only true if either prepareNextBuffer
4634d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // has been called sufficient number of times, or stream configuration
4644d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // had to register buffers with the HAL
4654d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    bool mPrepared;
4664d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
4674d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    Vector<camera3_stream_buffer_t> mPreparedBuffers;
4684d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    size_t mPreparedBufferIdx;
4694d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
470c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk    // Number of buffers allocated on last prepare call.
47102bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala    size_t mLastMaxCount;
472c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk
473fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // class Camera3Stream
474fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
475fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace camera3
476fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
477fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace android
478fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
479fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#endif
480