Camera3Stream.h revision 13d315eb8c0848ea0584b9fb1d27bab55bc8158b
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    /**
162fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Fill in the camera3_stream_buffer with the next valid buffer for this
163fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * stream, to hand over to the HAL.
164fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
165fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * This method may only be called once finishConfiguration has been called.
166fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * For bidirectional streams, this method applies to the output-side
167fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * buffers.
168fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
169fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
170fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         getBuffer(camera3_stream_buffer *buffer);
171fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
172fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
173fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Return a buffer to the stream after use by the HAL.
174fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
175fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * This method may only be called for buffers provided by getBuffer().
176fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * For bidirectional streams, this method applies to the output-side buffers
177fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
178fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         returnBuffer(const camera3_stream_buffer &buffer,
179fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala            nsecs_t timestamp);
180fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
181fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
1825a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * Fill in the camera3_stream_buffer with the next valid buffer for this
1835a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * stream, to hand over to the HAL.
1845a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
1855a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * This method may only be called once finishConfiguration has been called.
1865a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * For bidirectional streams, this method applies to the input-side
1875a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * buffers.
1885a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
1895a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     */
1905a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    status_t         getInputBuffer(camera3_stream_buffer *buffer);
1915a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
1925a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    /**
1935a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * Return a buffer to the stream after use by the HAL.
1945a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
1955a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * This method may only be called for buffers provided by getBuffer().
1965a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * For bidirectional streams, this method applies to the input-side buffers
1975a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     */
1985a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    status_t         returnInputBuffer(const camera3_stream_buffer &buffer);
1995a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
2005a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    /**
201fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Whether any of the stream's buffers are currently in use by the HAL,
202fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * including buffers that have been returned but not yet had their
203fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * release fence signaled.
204fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
205fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    bool             hasOutstandingBuffers() const;
206fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
207fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    enum {
208fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        TIMEOUT_NEVER = -1
209fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    };
210f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
211fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
212f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Set the status tracker to notify about idle transitions
213fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
214f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual status_t setStatusTracker(sp<StatusTracker> statusTracker);
215fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
216fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
217fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Disconnect stream from its non-HAL endpoint. After this,
218fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * start/finishConfiguration must be called before the stream can be used
219fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * again. This cannot be called if the stream has outstanding dequeued
220fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * buffers.
221fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
222fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         disconnect();
223fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
224fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
225fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Debug dump of the stream's state.
226fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
227fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual void     dump(int fd, const Vector<String16> &args) const = 0;
228fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
2292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void             addBufferListener(
2302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            wp<Camera3StreamBufferListener> listener);
2312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void             removeBufferListener(
2322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            const sp<Camera3StreamBufferListener>& listener);
2332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
234fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  protected:
235fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const int mId;
236fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const String8 mName;
237fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Zero for formats with fixed buffer size for given dimensions.
238fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const size_t mMaxSize;
239fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
240fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    enum {
241fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_ERROR,
242fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_CONSTRUCTED,
243fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_IN_CONFIG,
244fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_IN_RECONFIG,
245fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_CONFIGURED
246fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    } mState;
247fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
248fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    mutable Mutex mLock;
249fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
250fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    Camera3Stream(int id, camera3_stream_type type,
251fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala            uint32_t width, uint32_t height, size_t maxSize, int format);
252fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
253fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
254fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Interface to be implemented by derived classes
255fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
256fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
257fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // getBuffer / returnBuffer implementations
258fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
259fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Since camera3_stream_buffer includes a raw pointer to the stream,
260fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // cast to camera3_stream*, implementations must increment the
261fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // refcount of the stream manually in getBufferLocked, and decrement it in
262fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // returnBufferLocked.
2635a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t getBufferLocked(camera3_stream_buffer *buffer);
264fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t returnBufferLocked(const camera3_stream_buffer &buffer,
2655a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            nsecs_t timestamp);
2665a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t getInputBufferLocked(camera3_stream_buffer *buffer);
2675a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t returnInputBufferLocked(
2685a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            const camera3_stream_buffer &buffer);
269fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual bool     hasOutstandingBuffersLocked() const = 0;
270e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin    // Can return -ENOTCONN when we are already disconnected (not an error)
271fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t disconnectLocked() = 0;
272fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
273fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Configure the buffer queue interface to the other end of the stream,
274fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // after the HAL has provided usage and max_buffers values. After this call,
275fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // the stream must be ready to produce all buffers for registration with
276fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // HAL.
277fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t configureQueueLocked() = 0;
278fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
279fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Get the total number of buffers in the queue
280fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual size_t   getBufferCountLocked() = 0;
281fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
282b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    // Get the usage flags for the other endpoint, or return
283b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    // INVALID_OPERATION if they cannot be obtained.
284b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    virtual status_t getEndpointUsage(uint32_t *usage) = 0;
285b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala
286f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Tracking for idle state
287f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    wp<StatusTracker> mStatusTracker;
288f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Status tracker component ID
289f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    int mStatusId;
290f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
291fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  private:
292fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    uint32_t oldUsage;
293fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    uint32_t oldMaxBuffers;
294fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
295fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Gets all buffers from endpoint and registers them with the HAL.
296fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t registerBuffersLocked(camera3_device *hal3Device);
297fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
2982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void fireBufferListenersLocked(const camera3_stream_buffer& buffer,
2992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                                  bool acquired, bool output);
3002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    List<wp<Camera3StreamBufferListener> > mBufferListenerList;
3012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
302fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // class Camera3Stream
303fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
304fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace camera3
305fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
306fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace android
307fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
308fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#endif
309