Camera3Stream.h revision b2f5b19e5b6e1408a259add23dba91037756a943
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().
85fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala */
86fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalaclass Camera3Stream :
87fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        protected camera3_stream,
882fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        public virtual Camera3StreamInterface,
892fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        public virtual RefBase {
90fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  public:
91fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
92fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual ~Camera3Stream();
93fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
94fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    static Camera3Stream*       cast(camera3_stream *stream);
95fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    static const Camera3Stream* cast(const camera3_stream *stream);
96fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
97fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
98fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Get the stream's ID
99fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
100fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    int              getId() const;
101fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
102fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
103fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Get the stream's dimensions and format
104fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
105fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    uint32_t         getWidth() const;
106fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    uint32_t         getHeight() const;
107fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    int              getFormat() const;
108fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
109fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
110fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Start the stream configuration process. Returns a handle to the stream's
111fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * information to be passed into the HAL device's configure_streams call.
112fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
113fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Until finishConfiguration() is called, no other methods on the stream may be
114fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * called. The usage and max_buffers fields of camera3_stream may be modified
115fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * between start/finishConfiguration, but may not be changed after that.
116fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * The priv field of camera3_stream may be modified at any time after
117fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * startConfiguration.
118fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
119fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Returns NULL in case of error starting configuration.
120fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
121fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    camera3_stream*  startConfiguration();
122fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
123fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
124fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Check if the stream is mid-configuration (start has been called, but not
125fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * finish).  Used for lazy completion of configuration.
126fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
127fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    bool             isConfiguring() const;
128fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
129fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
130fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Completes the stream configuration process. During this call, the stream
131fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * may call the device's register_stream_buffers() method. The stream
132fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * information structure returned by startConfiguration() may no longer be
133fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * modified after this call, but can still be read until the destruction of
134fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * the stream.
135fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
136fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Returns:
137fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   OK on a successful configuration
138fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   NO_INIT in case of a serious error from the HAL device
139fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   NO_MEMORY in case of an error registering buffers
140fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   INVALID_OPERATION in case connecting to the consumer failed
141fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
142fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         finishConfiguration(camera3_device *hal3Device);
143fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
144fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
145fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Fill in the camera3_stream_buffer with the next valid buffer for this
146fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * stream, to hand over to the HAL.
147fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
148fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * This method may only be called once finishConfiguration has been called.
149fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * For bidirectional streams, this method applies to the output-side
150fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * buffers.
151fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
152fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
153fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         getBuffer(camera3_stream_buffer *buffer);
154fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
155fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
156fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Return a buffer to the stream after use by the HAL.
157fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
158fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * This method may only be called for buffers provided by getBuffer().
159fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * For bidirectional streams, this method applies to the output-side buffers
160fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
161fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         returnBuffer(const camera3_stream_buffer &buffer,
162fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala            nsecs_t timestamp);
163fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
164fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
1655a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * Fill in the camera3_stream_buffer with the next valid buffer for this
1665a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * stream, to hand over to the HAL.
1675a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
1685a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * This method may only be called once finishConfiguration has been called.
1695a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * For bidirectional streams, this method applies to the input-side
1705a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * buffers.
1715a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
1725a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     */
1735a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    status_t         getInputBuffer(camera3_stream_buffer *buffer);
1745a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
1755a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    /**
1765a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * Return a buffer to the stream after use by the HAL.
1775a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
1785a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * This method may only be called for buffers provided by getBuffer().
1795a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * For bidirectional streams, this method applies to the input-side buffers
1805a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     */
1815a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    status_t         returnInputBuffer(const camera3_stream_buffer &buffer);
1825a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
1835a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    /**
184fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Whether any of the stream's buffers are currently in use by the HAL,
185fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * including buffers that have been returned but not yet had their
186fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * release fence signaled.
187fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
188fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    bool             hasOutstandingBuffers() const;
189fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
190fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    enum {
191fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        TIMEOUT_NEVER = -1
192fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    };
193fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
194fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Wait until the HAL is done with all of this stream's buffers, including
195fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * signalling all release fences. Returns TIMED_OUT if the timeout is exceeded,
196fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * OK on success. Pass in TIMEOUT_NEVER for timeout to indicate an indefinite wait.
197fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
198fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t waitUntilIdle(nsecs_t timeout) = 0;
199fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
200fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
201fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Disconnect stream from its non-HAL endpoint. After this,
202fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * start/finishConfiguration must be called before the stream can be used
203fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * again. This cannot be called if the stream has outstanding dequeued
204fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * buffers.
205fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
206fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         disconnect();
207fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
208fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
209fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Debug dump of the stream's state.
210fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
211fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual void     dump(int fd, const Vector<String16> &args) const = 0;
212fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
2132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void             addBufferListener(
2142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            wp<Camera3StreamBufferListener> listener);
2152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void             removeBufferListener(
2162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            const sp<Camera3StreamBufferListener>& listener);
2172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
218fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  protected:
219fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const int mId;
220fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const String8 mName;
221fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Zero for formats with fixed buffer size for given dimensions.
222fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const size_t mMaxSize;
223fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
224fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    enum {
225fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_ERROR,
226fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_CONSTRUCTED,
227fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_IN_CONFIG,
228fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_IN_RECONFIG,
229fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_CONFIGURED
230fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    } mState;
231fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
232fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    mutable Mutex mLock;
233fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
234fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    Camera3Stream(int id, camera3_stream_type type,
235fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala            uint32_t width, uint32_t height, size_t maxSize, int format);
236fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
237fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
238fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Interface to be implemented by derived classes
239fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
240fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
241fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // getBuffer / returnBuffer implementations
242fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
243fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Since camera3_stream_buffer includes a raw pointer to the stream,
244fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // cast to camera3_stream*, implementations must increment the
245fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // refcount of the stream manually in getBufferLocked, and decrement it in
246fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // returnBufferLocked.
2475a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t getBufferLocked(camera3_stream_buffer *buffer);
248fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t returnBufferLocked(const camera3_stream_buffer &buffer,
2495a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            nsecs_t timestamp);
2505a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t getInputBufferLocked(camera3_stream_buffer *buffer);
2515a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t returnInputBufferLocked(
2525a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            const camera3_stream_buffer &buffer);
253fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual bool     hasOutstandingBuffersLocked() const = 0;
254e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin    // Can return -ENOTCONN when we are already disconnected (not an error)
255fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t disconnectLocked() = 0;
256fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
257fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Configure the buffer queue interface to the other end of the stream,
258fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // after the HAL has provided usage and max_buffers values. After this call,
259fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // the stream must be ready to produce all buffers for registration with
260fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // HAL.
261fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t configureQueueLocked() = 0;
262fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
263fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Get the total number of buffers in the queue
264fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual size_t   getBufferCountLocked() = 0;
265fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
266b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    // Get the usage flags for the other endpoint, or return
267b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    // INVALID_OPERATION if they cannot be obtained.
268b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    virtual status_t getEndpointUsage(uint32_t *usage) = 0;
269b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala
270fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  private:
271fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    uint32_t oldUsage;
272fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    uint32_t oldMaxBuffers;
273fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
274fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Gets all buffers from endpoint and registers them with the HAL.
275fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t registerBuffersLocked(camera3_device *hal3Device);
276fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
2772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void fireBufferListenersLocked(const camera3_stream_buffer& buffer,
2782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                                  bool acquired, bool output);
2792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    List<wp<Camera3StreamBufferListener> > mBufferListenerList;
2802fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
281fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // class Camera3Stream
282fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
283fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace camera3
284fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
285fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace android
286fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
287fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#endif
288