Camera3Stream.h revision bee0f0a5e7aa19aa7c59de03b508985b68bc6b5e
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.
98e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen *    STATE_CONFIGURED     => STATE_ABANDONED:
99e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen *        When the buffer queue of the stream is abandoned.
10013d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
10113d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin * Status Tracking:
10213d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    Each stream is tracked by StatusTracker as a separate component,
10313d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    depending on the handed out buffer count. The state must be STATE_CONFIGURED
10413d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    in order for the component to be marked.
10513d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
10613d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    It's marked in one of two ways:
10713d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
10813d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    - ACTIVE: One or more buffers have been handed out (with #getBuffer).
10913d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    - IDLE: All buffers have been returned (with #returnBuffer), and their
11013d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *          respective release_fence(s) have been signaled.
11113d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
11213d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    A typical use case is output streams. When the HAL has any buffers
11313d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    dequeued, the stream is marked ACTIVE. When the HAL returns all buffers
11413d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    (e.g. if no capture requests are active), the stream is marked IDLE.
11513d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    In this use case, the app consumer does not affect the component status.
11613d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
117fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala */
118fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalaclass Camera3Stream :
119fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        protected camera3_stream,
1202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        public virtual Camera3StreamInterface,
1212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        public virtual RefBase {
122fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  public:
123fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
124fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual ~Camera3Stream();
125fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
126fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    static Camera3Stream*       cast(camera3_stream *stream);
127fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    static const Camera3Stream* cast(const camera3_stream *stream);
128fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
129fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
130fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Get the stream's ID
131fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
132fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    int              getId() const;
133fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
134fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
135125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Get the output stream set id.
136125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
137125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    int              getStreamSetId() const;
138125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
139125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
140fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Get the stream's dimensions and format
141fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
1423d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala    uint32_t          getWidth() const;
1433d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala    uint32_t          getHeight() const;
1443d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala    int               getFormat() const;
1453d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala    android_dataspace getDataSpace() const;
146fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
1470b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala    camera3_stream*   asHalStream() override {
1480b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala        return this;
1490b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala    }
1500b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala
151fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
152fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Start the stream configuration process. Returns a handle to the stream's
153fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * information to be passed into the HAL device's configure_streams call.
154fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
155fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Until finishConfiguration() is called, no other methods on the stream may be
156fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * called. The usage and max_buffers fields of camera3_stream may be modified
157fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * between start/finishConfiguration, but may not be changed after that.
158fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * The priv field of camera3_stream may be modified at any time after
159fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * startConfiguration.
160fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
161fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Returns NULL in case of error starting configuration.
162fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
163fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    camera3_stream*  startConfiguration();
164fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
165fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
166fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Check if the stream is mid-configuration (start has been called, but not
167fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * finish).  Used for lazy completion of configuration.
168fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
169fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    bool             isConfiguring() const;
170fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
171fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
1720b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala     * Completes the stream configuration process. The stream information
1730b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala     * structure returned by startConfiguration() may no longer be modified
1740b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala     * after this call, but can still be read until the destruction of the
1750b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala     * stream.
176fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
177fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Returns:
178fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   OK on a successful configuration
179fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   NO_INIT in case of a serious error from the HAL device
180fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   NO_MEMORY in case of an error registering buffers
1815d677d1f0879d5101e38df480a38228a64d63959Zhijun He     *   INVALID_OPERATION in case connecting to the consumer failed or consumer
1825d677d1f0879d5101e38df480a38228a64d63959Zhijun He     *       doesn't exist yet.
183fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
1840b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala    status_t         finishConfiguration();
185fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
186fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
1871754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     * Cancels the stream configuration process. This returns the stream to the
1881754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     * initial state, allowing it to be configured again later.
1891754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     * This is done if the HAL rejects the proposed combined stream configuration
1901754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     */
1911754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala    status_t         cancelConfiguration();
1921754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala
1931754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala    /**
1944d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Determine whether the stream has already become in-use (has received
1954d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * a valid filled buffer), which determines if a stream can still have
1964d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * prepareNextBuffer called on it.
1974d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
1984d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    bool             isUnpreparable();
1994d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
2004d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
2014d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Start stream preparation. May only be called in the CONFIGURED state,
202c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk     * when no valid buffers have yet been returned to this stream. Prepares
203c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk     * up to maxCount buffers, or the maximum number of buffers needed by the
204c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk     * pipeline if maxCount is ALLOCATE_PIPELINE_MAX.
2054d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2064d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * If no prepartion is necessary, returns OK and does not transition to
2074d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * PREPARING state. Otherwise, returns NOT_ENOUGH_DATA and transitions
2084d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * to PREPARING.
2094d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2104d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * This call performs no allocation, so is quick to call.
2114d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2124d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Returns:
2134d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    OK if no more buffers need to be preallocated
2144d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    NOT_ENOUGH_DATA if calls to prepareNextBuffer are needed to finish
2154d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *        buffer pre-allocation, and transitions to the PREPARING state.
2164d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    NO_INIT in case of a serious error from the HAL device
2174d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    INVALID_OPERATION if called when not in CONFIGURED state, or a
2184d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *        valid buffer has already been returned to this stream.
2194d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
220c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk    status_t         startPrepare(int maxCount);
2214d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
2224d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
2234d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Check if the stream is mid-preparing.
2244d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
2254d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    bool             isPreparing() const;
2264d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
2274d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
2284d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Continue stream buffer preparation by allocating the next
2294d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * buffer for this stream.  May only be called in the PREPARED state.
2304d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2314d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Returns OK and transitions to the CONFIGURED state if all buffers
2324d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * are allocated after the call concludes. Otherwise returns NOT_ENOUGH_DATA.
2334d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2344d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * This call allocates one buffer, which may take several milliseconds for
2354d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * large buffers.
2364d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2374d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Returns:
2384d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    OK if no more buffers need to be preallocated, and transitions
2394d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *        to the CONFIGURED state.
2404d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    NOT_ENOUGH_DATA if more calls to prepareNextBuffer are needed to finish
2414d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *        buffer pre-allocation.
2424d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    NO_INIT in case of a serious error from the HAL device
2434d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    INVALID_OPERATION if called when not in CONFIGURED state, or a
2444d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *        valid buffer has already been returned to this stream.
2454d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
2464d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    status_t         prepareNextBuffer();
2474d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
2484d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
2494d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Cancel stream preparation early. In case allocation needs to be
2504d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * stopped, this method transitions the stream back to the CONFIGURED state.
2514d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Buffers that have been allocated with prepareNextBuffer remain that way,
2524d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * but a later use of prepareNextBuffer will require just as many
2534d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * calls as if the earlier prepare attempt had not existed.
2544d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2554d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Returns:
2564d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    OK if cancellation succeeded, and transitions to the CONFIGURED state
2574d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    INVALID_OPERATION if not in the PREPARING state
2584d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    NO_INIT in case of a serious error from the HAL device
2594d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
2604d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    status_t        cancelPrepare();
2614d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
2624d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
263b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     * Tear down memory for this stream. This frees all unused gralloc buffers
264b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     * allocated for this stream, but leaves it ready for operation afterward.
265b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     *
266b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     * May only be called in the CONFIGURED state, and keeps the stream in
267b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     * the CONFIGURED state.
268b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     *
269b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     * Returns:
270b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     *    OK if teardown succeeded.
271b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     *    INVALID_OPERATION if not in the CONFIGURED state
272b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     *    NO_INIT in case of a serious error from the HAL device
273b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     */
274b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala    status_t       tearDown();
275b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala
276b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala    /**
277fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Fill in the camera3_stream_buffer with the next valid buffer for this
278fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * stream, to hand over to the HAL.
279fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
280bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang     * Multiple surfaces could share the same HAL stream, but a request may
281bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang     * be only for a subset of surfaces. In this case, the
282bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang     * Camera3StreamInterface object needs the surface ID information to acquire
283bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang     * buffers for those surfaces.
284bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang     *
285fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * This method may only be called once finishConfiguration has been called.
286fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * For bidirectional streams, this method applies to the output-side
287fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * buffers.
288fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
289fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
290bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang    status_t         getBuffer(camera3_stream_buffer *buffer,
291bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang            const std::vector<size_t>& surface_ids = std::vector<size_t>());
292fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
293fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
294fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Return a buffer to the stream after use by the HAL.
295fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
296fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * This method may only be called for buffers provided by getBuffer().
297fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * For bidirectional streams, this method applies to the output-side buffers
298fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
299fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         returnBuffer(const camera3_stream_buffer &buffer,
300fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala            nsecs_t timestamp);
301fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
302fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
3035a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * Fill in the camera3_stream_buffer with the next valid buffer for this
3045a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * stream, to hand over to the HAL.
3055a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
3065a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * This method may only be called once finishConfiguration has been called.
3075a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * For bidirectional streams, this method applies to the input-side
3085a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * buffers.
3095a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
3105a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     */
3115a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    status_t         getInputBuffer(camera3_stream_buffer *buffer);
3125a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
3135a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    /**
3145a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * Return a buffer to the stream after use by the HAL.
3155a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
3165a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * This method may only be called for buffers provided by getBuffer().
3175a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * For bidirectional streams, this method applies to the input-side buffers
3185a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     */
3195a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    status_t         returnInputBuffer(const camera3_stream_buffer &buffer);
3205a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
321618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // get the buffer producer of the input buffer queue.
322618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // only apply to input streams.
323618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    status_t         getInputBufferProducer(sp<IGraphicBufferProducer> *producer);
324618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
3255a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    /**
326fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Whether any of the stream's buffers are currently in use by the HAL,
327fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * including buffers that have been returned but not yet had their
328fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * release fence signaled.
329fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
330fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    bool             hasOutstandingBuffers() const;
331fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
332fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    enum {
333fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        TIMEOUT_NEVER = -1
334fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    };
335f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
336fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
337f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Set the status tracker to notify about idle transitions
338fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
339f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual status_t setStatusTracker(sp<StatusTracker> statusTracker);
340fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
341fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
342fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Disconnect stream from its non-HAL endpoint. After this,
343fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * start/finishConfiguration must be called before the stream can be used
344fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * again. This cannot be called if the stream has outstanding dequeued
345fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * buffers.
346fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
347fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         disconnect();
348fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
349fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
350fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Debug dump of the stream's state.
351fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
352fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual void     dump(int fd, const Vector<String16> &args) const = 0;
353fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
354f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He    /**
355f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * Add a camera3 buffer listener. Adding the same listener twice has
356f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * no effect.
357f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     */
3582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void             addBufferListener(
3592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            wp<Camera3StreamBufferListener> listener);
360f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He
361f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He    /**
362f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * Remove a camera3 buffer listener. Removing the same listener twice
363f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * or the listener that was never added has no effect.
364f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     */
3652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void             removeBufferListener(
3662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            const sp<Camera3StreamBufferListener>& listener);
3672fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
368e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    /**
369e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen     * Return if the buffer queue of the stream is abandoned.
370e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen     */
371e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    bool             isAbandoned() const;
372e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen
373fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  protected:
374fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const int mId;
375125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
376125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Stream set id, used to indicate which group of this stream belongs to for buffer sharing
377125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * across multiple streams.
378125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
379125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * The default value is set to CAMERA3_STREAM_SET_ID_INVALID, which indicates that this stream
380125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * doesn't intend to share buffers with any other streams, and this stream will fall back to
381125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * the existing BufferQueue mechanism to manage the buffer allocations and buffer circulation.
382125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * When a valid stream set id is set, this stream intends to use the Camera3BufferManager to
383125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * manage the buffer allocations; the BufferQueue will only handle the buffer transaction
384125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * between the producer and consumer. For this case, upon successfully registration, the streams
385125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * with the same stream set id will potentially share the buffers allocated by
386125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Camera3BufferManager.
387125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
388125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    const int mSetId;
389125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
390fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const String8 mName;
391fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Zero for formats with fixed buffer size for given dimensions.
392fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const size_t mMaxSize;
393fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
394fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    enum {
395fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_ERROR,
396fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_CONSTRUCTED,
397fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_IN_CONFIG,
398fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_IN_RECONFIG,
3994d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        STATE_CONFIGURED,
400e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        STATE_PREPARING,
401e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        STATE_ABANDONED
402fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    } mState;
403fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
404fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    mutable Mutex mLock;
405fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
406fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    Camera3Stream(int id, camera3_stream_type type,
4073d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala            uint32_t width, uint32_t height, size_t maxSize, int format,
408125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He            android_dataspace dataSpace, camera3_stream_rotation_t rotation,
409125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He            int setId);
410fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
411fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
412fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Interface to be implemented by derived classes
413fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
414fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
415fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // getBuffer / returnBuffer implementations
416fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
417fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Since camera3_stream_buffer includes a raw pointer to the stream,
418fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // cast to camera3_stream*, implementations must increment the
419fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // refcount of the stream manually in getBufferLocked, and decrement it in
420fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // returnBufferLocked.
421bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang    virtual status_t getBufferLocked(camera3_stream_buffer *buffer,
422bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang            const std::vector<size_t>& surface_ids = std::vector<size_t>());
423fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t returnBufferLocked(const camera3_stream_buffer &buffer,
4245a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            nsecs_t timestamp);
4255a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t getInputBufferLocked(camera3_stream_buffer *buffer);
4265a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t returnInputBufferLocked(
4275a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            const camera3_stream_buffer &buffer);
428fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual bool     hasOutstandingBuffersLocked() const = 0;
429618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // Get the buffer producer of the input buffer queue. Only apply to input streams.
430618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    virtual status_t getInputBufferProducerLocked(sp<IGraphicBufferProducer> *producer);
431618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
432e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin    // Can return -ENOTCONN when we are already disconnected (not an error)
433fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t disconnectLocked() = 0;
434fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
435fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Configure the buffer queue interface to the other end of the stream,
436fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // after the HAL has provided usage and max_buffers values. After this call,
437fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // the stream must be ready to produce all buffers for registration with
438fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // HAL.
439fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t configureQueueLocked() = 0;
440fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
441fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Get the total number of buffers in the queue
442fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual size_t   getBufferCountLocked() = 0;
443fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
4446adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    // Get handout output buffer count.
4456adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    virtual size_t   getHandoutOutputBufferCountLocked() = 0;
4466adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He
4476adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    // Get handout input buffer count.
4486adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    virtual size_t   getHandoutInputBufferCountLocked() = 0;
4496adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He
450b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    // Get the usage flags for the other endpoint, or return
451b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    // INVALID_OPERATION if they cannot be obtained.
4524d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    virtual status_t getEndpointUsage(uint32_t *usage) const = 0;
453b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala
454f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Tracking for idle state
455f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    wp<StatusTracker> mStatusTracker;
456f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Status tracker component ID
457f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    int mStatusId;
458f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
4594d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // Tracking for stream prepare - whether this stream can still have
4604d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // prepareNextBuffer called on it.
4614d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    bool mStreamUnpreparable;
4624d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
463fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  private:
46402bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala    uint32_t mOldUsage;
46502bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala    uint32_t mOldMaxBuffers;
4666adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    Condition mOutputBufferReturnedSignal;
4676adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    Condition mInputBufferReturnedSignal;
4686adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    static const nsecs_t kWaitForBufferDuration = 3000000000LL; // 3000 ms
469fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
470fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Gets all buffers from endpoint and registers them with the HAL.
471fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t registerBuffersLocked(camera3_device *hal3Device);
472fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
4732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void fireBufferListenersLocked(const camera3_stream_buffer& buffer,
4742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                                  bool acquired, bool output);
4752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    List<wp<Camera3StreamBufferListener> > mBufferListenerList;
4762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
4774d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    status_t        cancelPrepareLocked();
4784d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
479e02e932d2210bd513bb8283840bbe24b58d28620Chien-Yu Chen    // Return whether the buffer is in the list of outstanding buffers.
480e02e932d2210bd513bb8283840bbe24b58d28620Chien-Yu Chen    bool isOutstandingBuffer(const camera3_stream_buffer& buffer);
481e02e932d2210bd513bb8283840bbe24b58d28620Chien-Yu Chen
482e02e932d2210bd513bb8283840bbe24b58d28620Chien-Yu Chen    // Remove the buffer from the list of outstanding buffers.
483e02e932d2210bd513bb8283840bbe24b58d28620Chien-Yu Chen    void removeOutstandingBuffer(const camera3_stream_buffer& buffer);
484e02e932d2210bd513bb8283840bbe24b58d28620Chien-Yu Chen
4854d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // Tracking for PREPARING state
4864d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
4874d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // State of buffer preallocation. Only true if either prepareNextBuffer
4884d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // has been called sufficient number of times, or stream configuration
4894d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // had to register buffers with the HAL
4904d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    bool mPrepared;
4914d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
4924d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    Vector<camera3_stream_buffer_t> mPreparedBuffers;
4934d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    size_t mPreparedBufferIdx;
4944d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
495c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk    // Number of buffers allocated on last prepare call.
49602bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala    size_t mLastMaxCount;
497c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk
498e02e932d2210bd513bb8283840bbe24b58d28620Chien-Yu Chen    // Outstanding buffers dequeued from the stream's buffer queue.
499e02e932d2210bd513bb8283840bbe24b58d28620Chien-Yu Chen    List<buffer_handle_t> mOutstandingBuffers;
500e02e932d2210bd513bb8283840bbe24b58d28620Chien-Yu Chen
501fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // class Camera3Stream
502fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
503fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace camera3
504fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
505fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace android
506fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
507fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#endif
508