Camera3Stream.h revision 1754351d9199721e7e7943461689e399ef015260
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
60fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    HAL. The stream's getBuffer/returnBuffer work. The priv pointer may still be
61fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    modified.
62fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
63fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * Transition table:
64fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
65fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    <none>               => STATE_CONSTRUCTED:
66fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When constructed with valid arguments
67fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    <none>               => STATE_ERROR:
68fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When constructed with invalid arguments
69fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_CONSTRUCTED    => STATE_IN_CONFIG:
70fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When startConfiguration() is called
71fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_IN_CONFIG      => STATE_CONFIGURED:
72fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When finishConfiguration() is called
73fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_IN_CONFIG      => STATE_ERROR:
74fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When finishConfiguration() fails to allocate or register buffers.
75fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_CONFIGURED     => STATE_IN_RE_CONFIG:  *
76fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When startConfiguration() is called again, after making sure stream is
77fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        idle with waitUntilIdle().
78fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_IN_RE_CONFIG   => STATE_CONFIGURED:
79fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When finishConfiguration() is called.
80fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_IN_RE_CONFIG   => STATE_ERROR:
81fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When finishConfiguration() fails to allocate or register buffers.
82fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_CONFIGURED     => STATE_CONSTRUCTED:
83fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When disconnect() is called after making sure stream is idle with
84fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        waitUntilIdle().
8513d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
8613d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin * Status Tracking:
8713d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    Each stream is tracked by StatusTracker as a separate component,
8813d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    depending on the handed out buffer count. The state must be STATE_CONFIGURED
8913d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    in order for the component to be marked.
9013d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
9113d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    It's marked in one of two ways:
9213d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
9313d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    - ACTIVE: One or more buffers have been handed out (with #getBuffer).
9413d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    - IDLE: All buffers have been returned (with #returnBuffer), and their
9513d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *          respective release_fence(s) have been signaled.
9613d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
9713d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    A typical use case is output streams. When the HAL has any buffers
9813d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    dequeued, the stream is marked ACTIVE. When the HAL returns all buffers
9913d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    (e.g. if no capture requests are active), the stream is marked IDLE.
10013d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    In this use case, the app consumer does not affect the component status.
10113d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
102fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala */
103fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalaclass Camera3Stream :
104fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        protected camera3_stream,
1052fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        public virtual Camera3StreamInterface,
1062fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        public virtual RefBase {
107fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  public:
108fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
109fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual ~Camera3Stream();
110fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
111fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    static Camera3Stream*       cast(camera3_stream *stream);
112fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    static const Camera3Stream* cast(const camera3_stream *stream);
113fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
114fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
115fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Get the stream's ID
116fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
117fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    int              getId() const;
118fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
119fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
120fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Get the stream's dimensions and format
121fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
122fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    uint32_t         getWidth() const;
123fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    uint32_t         getHeight() const;
124fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    int              getFormat() const;
125fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
126fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
127fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Start the stream configuration process. Returns a handle to the stream's
128fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * information to be passed into the HAL device's configure_streams call.
129fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
130fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Until finishConfiguration() is called, no other methods on the stream may be
131fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * called. The usage and max_buffers fields of camera3_stream may be modified
132fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * between start/finishConfiguration, but may not be changed after that.
133fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * The priv field of camera3_stream may be modified at any time after
134fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * startConfiguration.
135fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
136fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Returns NULL in case of error starting configuration.
137fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
138fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    camera3_stream*  startConfiguration();
139fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
140fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
141fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Check if the stream is mid-configuration (start has been called, but not
142fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * finish).  Used for lazy completion of configuration.
143fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
144fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    bool             isConfiguring() const;
145fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
146fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
147fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Completes the stream configuration process. During this call, the stream
148fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * may call the device's register_stream_buffers() method. The stream
149fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * information structure returned by startConfiguration() may no longer be
150fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * modified after this call, but can still be read until the destruction of
151fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * the stream.
152fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
153fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Returns:
154fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   OK on a successful configuration
155fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   NO_INIT in case of a serious error from the HAL device
156fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   NO_MEMORY in case of an error registering buffers
157fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   INVALID_OPERATION in case connecting to the consumer failed
158fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
159fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         finishConfiguration(camera3_device *hal3Device);
160fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
161fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
1621754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     * Cancels the stream configuration process. This returns the stream to the
1631754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     * initial state, allowing it to be configured again later.
1641754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     * This is done if the HAL rejects the proposed combined stream configuration
1651754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     */
1661754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala    status_t         cancelConfiguration();
1671754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala
1681754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala    /**
169fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Fill in the camera3_stream_buffer with the next valid buffer for this
170fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * stream, to hand over to the HAL.
171fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
172fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * This method may only be called once finishConfiguration has been called.
173fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * For bidirectional streams, this method applies to the output-side
174fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * buffers.
175fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
176fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
177fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         getBuffer(camera3_stream_buffer *buffer);
178fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
179fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
180fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Return a buffer to the stream after use by the HAL.
181fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
182fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * This method may only be called for buffers provided by getBuffer().
183fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * For bidirectional streams, this method applies to the output-side buffers
184fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
185fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         returnBuffer(const camera3_stream_buffer &buffer,
186fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala            nsecs_t timestamp);
187fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
188fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
1895a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * Fill in the camera3_stream_buffer with the next valid buffer for this
1905a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * stream, to hand over to the HAL.
1915a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
1925a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * This method may only be called once finishConfiguration has been called.
1935a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * For bidirectional streams, this method applies to the input-side
1945a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * buffers.
1955a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
1965a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     */
1975a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    status_t         getInputBuffer(camera3_stream_buffer *buffer);
1985a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
1995a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    /**
2005a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * Return a buffer to the stream after use by the HAL.
2015a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
2025a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * This method may only be called for buffers provided by getBuffer().
2035a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * For bidirectional streams, this method applies to the input-side buffers
2045a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     */
2055a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    status_t         returnInputBuffer(const camera3_stream_buffer &buffer);
2065a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
2075a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    /**
208fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Whether any of the stream's buffers are currently in use by the HAL,
209fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * including buffers that have been returned but not yet had their
210fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * release fence signaled.
211fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
212fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    bool             hasOutstandingBuffers() const;
213fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
214fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    enum {
215fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        TIMEOUT_NEVER = -1
216fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    };
217f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
218fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
219f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Set the status tracker to notify about idle transitions
220fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
221f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual status_t setStatusTracker(sp<StatusTracker> statusTracker);
222fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
223fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
224fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Disconnect stream from its non-HAL endpoint. After this,
225fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * start/finishConfiguration must be called before the stream can be used
226fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * again. This cannot be called if the stream has outstanding dequeued
227fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * buffers.
228fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
229fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         disconnect();
230fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
231fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
232fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Debug dump of the stream's state.
233fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
234fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual void     dump(int fd, const Vector<String16> &args) const = 0;
235fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
236f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He    /**
237f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * Add a camera3 buffer listener. Adding the same listener twice has
238f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * no effect.
239f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     */
2402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void             addBufferListener(
2412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            wp<Camera3StreamBufferListener> listener);
242f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He
243f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He    /**
244f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * Remove a camera3 buffer listener. Removing the same listener twice
245f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * or the listener that was never added has no effect.
246f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     */
2472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void             removeBufferListener(
2482fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            const sp<Camera3StreamBufferListener>& listener);
2492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
250fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  protected:
251fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const int mId;
252fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const String8 mName;
253fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Zero for formats with fixed buffer size for given dimensions.
254fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const size_t mMaxSize;
255fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
256fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    enum {
257fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_ERROR,
258fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_CONSTRUCTED,
259fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_IN_CONFIG,
260fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_IN_RECONFIG,
261fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_CONFIGURED
262fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    } mState;
263fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
264fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    mutable Mutex mLock;
265fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
266fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    Camera3Stream(int id, camera3_stream_type type,
267fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala            uint32_t width, uint32_t height, size_t maxSize, int format);
268fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
269fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
270fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Interface to be implemented by derived classes
271fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
272fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
273fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // getBuffer / returnBuffer implementations
274fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
275fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Since camera3_stream_buffer includes a raw pointer to the stream,
276fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // cast to camera3_stream*, implementations must increment the
277fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // refcount of the stream manually in getBufferLocked, and decrement it in
278fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // returnBufferLocked.
2795a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t getBufferLocked(camera3_stream_buffer *buffer);
280fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t returnBufferLocked(const camera3_stream_buffer &buffer,
2815a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            nsecs_t timestamp);
2825a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t getInputBufferLocked(camera3_stream_buffer *buffer);
2835a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t returnInputBufferLocked(
2845a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            const camera3_stream_buffer &buffer);
285fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual bool     hasOutstandingBuffersLocked() const = 0;
286e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin    // Can return -ENOTCONN when we are already disconnected (not an error)
287fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t disconnectLocked() = 0;
288fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
289fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Configure the buffer queue interface to the other end of the stream,
290fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // after the HAL has provided usage and max_buffers values. After this call,
291fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // the stream must be ready to produce all buffers for registration with
292fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // HAL.
293fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t configureQueueLocked() = 0;
294fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
295fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Get the total number of buffers in the queue
296fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual size_t   getBufferCountLocked() = 0;
297fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
2986adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    // Get handout output buffer count.
2996adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    virtual size_t   getHandoutOutputBufferCountLocked() = 0;
3006adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He
3016adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    // Get handout input buffer count.
3026adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    virtual size_t   getHandoutInputBufferCountLocked() = 0;
3036adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He
304b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    // Get the usage flags for the other endpoint, or return
305b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    // INVALID_OPERATION if they cannot be obtained.
306b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    virtual status_t getEndpointUsage(uint32_t *usage) = 0;
307b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala
308f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Tracking for idle state
309f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    wp<StatusTracker> mStatusTracker;
310f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Status tracker component ID
311f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    int mStatusId;
312f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
313fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  private:
314fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    uint32_t oldUsage;
315fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    uint32_t oldMaxBuffers;
3166adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    Condition mOutputBufferReturnedSignal;
3176adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    Condition mInputBufferReturnedSignal;
3186adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    static const nsecs_t kWaitForBufferDuration = 3000000000LL; // 3000 ms
319fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
320fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Gets all buffers from endpoint and registers them with the HAL.
321fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t registerBuffersLocked(camera3_device *hal3Device);
322fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
3232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void fireBufferListenersLocked(const camera3_stream_buffer& buffer,
3242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                                  bool acquired, bool output);
3252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    List<wp<Camera3StreamBufferListener> > mBufferListenerList;
3262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
327fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // class Camera3Stream
328fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
329fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace camera3
330fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
331fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace android
332fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
333fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#endif
334