Camera3Stream.h revision 7b82efe7a376c882f8f938e1c41b8311a8cdda4a
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/*
2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2013 The Android Open Source Project
3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License.
6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at
7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software
11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and
14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License.
15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */
16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
17fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_SERVERS_CAMERA3_STREAM_H
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#define ANDROID_SERVERS_CAMERA3_STREAM_H
191aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams
201aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <gui/Surface.h>
21c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <utils/RefBase.h>
22c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <utils/String8.h>
23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <utils/String16.h>
24fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <utils/List.h>
25fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
26fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "hardware/camera3.h"
27fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
28fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "Camera3StreamBufferListener.h"
29fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "Camera3StreamInterface.h"
301aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace camera3 {
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
354815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams/**
364815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams * A class for managing a single stream of input or output data from the camera
374815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams * device.
384815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams *
39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * The stream has an internal state machine to track whether it's
40f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams * connected/configured/etc.
41f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams *
424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams * States:
434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams *
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *  STATE_ERROR: A serious error has occurred, stream is unusable. Outstanding
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *    buffers may still be returned.
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *  STATE_CONSTRUCTED: The stream is ready for configuration, but buffers cannot
48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *    be gotten yet. Not connected to any endpoint, no buffers are registered
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *    with the HAL.
5056bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams *
5156bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams *  STATE_IN_CONFIG: Configuration has started, but not yet concluded. During this
52992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams *    time, the usage, max_buffers, and priv fields of camera3_stream returned by
53cacee55b3217710cc01a3aa42ea447a779facc74Jason Sams *    startConfiguration() may be modified.
54cacee55b3217710cc01a3aa42ea447a779facc74Jason Sams *
55cacee55b3217710cc01a3aa42ea447a779facc74Jason Sams *  STATE_IN_RE_CONFIG: Configuration has started, and the stream has been
56cacee55b3217710cc01a3aa42ea447a779facc74Jason Sams *    configured before. Need to track separately from IN_CONFIG to avoid
5756bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams *    re-registering buffers with HAL.
5856bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams *
59cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams *  STATE_CONFIGURED: Stream is configured, and has registered buffers with the
60cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams *    HAL. The stream's getBuffer/returnBuffer work. The priv pointer may still be
61c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams *    modified.
62c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams *
63c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * Transition table:
64c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams *
65f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams *    <none>               => STATE_CONSTRUCTED:
669ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams *        When constructed with valid arguments
676e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk *    <none>               => STATE_ERROR:
689ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams *        When constructed with invalid arguments
69b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams *    STATE_CONSTRUCTED    => STATE_IN_CONFIG:
70b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams *        When startConfiguration() is called
71b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams *    STATE_IN_CONFIG      => STATE_CONFIGURED:
72b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams *        When finishConfiguration() is called
73bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams *    STATE_IN_CONFIG      => STATE_ERROR:
74bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams *        When finishConfiguration() fails to allocate or register buffers.
75bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams *    STATE_CONFIGURED     => STATE_IN_RE_CONFIG:  *
76bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams *        When startConfiguration() is called again, after making sure stream is
77bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams *        idle with waitUntilIdle().
78b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams *    STATE_IN_RE_CONFIG   => STATE_CONFIGURED:
79b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams *        When finishConfiguration() is called.
80b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams *    STATE_IN_RE_CONFIG   => STATE_ERROR:
81b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams *        When finishConfiguration() fails to allocate or register buffers.
82b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams *    STATE_CONFIGURED     => STATE_CONSTRUCTED:
83b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams *        When disconnect() is called after making sure stream is idle with
84b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams *        waitUntilIdle().
85b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams */
86b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Samsclass Camera3Stream :
87b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        protected camera3_stream,
88b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        public virtual Camera3StreamInterface,
89b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams        public virtual RefBase {
90bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams  public:
91b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
92b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams    virtual ~Camera3Stream();
93b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams
94f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams    static Camera3Stream*       cast(camera3_stream *stream);
95c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    static const Camera3Stream* cast(const camera3_stream *stream);
96e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
97e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    /**
98c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams     * Get the stream's ID
99c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams     */
100c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    int              getId() const;
101383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk
102c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    /**
103c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams     * Get the stream's dimensions and format
104c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams     */
105e64c2f172516972abe581ca1b762302dd2ba1199Jason Sams    uint32_t         getWidth() const;
106c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    uint32_t         getHeight() const;
107c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    int              getFormat() const;
1083eb28f07ab726a2e73063b95729abc191103b432Jason Sams
109e9ed6cc76bbff93f681cf4a72d9cfc2bc2d00ae9Jason Sams    /**
110e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     * Start the stream configuration process. Returns a handle to the stream's
111e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     * information to be passed into the HAL device's configure_streams call.
112e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     *
113e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     * Until finishConfiguration() is called, no other methods on the stream may be
114e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     * called. The usage and max_buffers fields of camera3_stream may be modified
115e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     * between start/finishConfiguration, but may not be changed after that.
116e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     * The priv field of camera3_stream may be modified at any time after
117e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     * startConfiguration.
118e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     *
119e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     * Returns NULL in case of error starting configuration.
120c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams     */
121c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    camera3_stream*  startConfiguration();
1223eb28f07ab726a2e73063b95729abc191103b432Jason Sams
123383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    /**
1249ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams     * Check if the stream is mid-configuration (start has been called, but not
125c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams     * finish).  Used for lazy completion of configuration.
126433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams     */
127c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    bool             isConfiguring() const;
128c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
129383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    /**
130c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams     * Completes the stream configuration process. During this call, the stream
131e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     * may call the device's register_stream_buffers() method. The stream
132383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * information structure returned by startConfiguration() may no longer be
133383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * modified after this call, but can still be read until the destruction of
134383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * the stream.
135383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     *
136383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * Returns:
137383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     *   OK on a successful configuration
138e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     *   NO_INIT in case of a serious error from the HAL device
139e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     *   NO_MEMORY in case of an error registering buffers
1409ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams     *   INVALID_OPERATION in case connecting to the consumer failed
141c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams     */
142cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    status_t         finishConfiguration(camera3_device *hal3Device);
143c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams
144c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams    /**
145383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * Fill in the camera3_stream_buffer with the next valid buffer for this
146c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams     * stream, to hand over to the HAL.
147e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     *
148383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * This method may only be called once finishConfiguration has been called.
149383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * For bidirectional streams, this method applies to the output-side
150383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * buffers.
151383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     *
152383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     */
153383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    status_t         getBuffer(camera3_stream_buffer *buffer);
154383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk
155e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    /**
156e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     * Return a buffer to the stream after use by the HAL.
1579ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams     *
158c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams     * This method may only be called for buffers provided by getBuffer().
159cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams     * For bidirectional streams, this method applies to the output-side buffers
160c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams     */
161c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams    status_t         returnBuffer(const camera3_stream_buffer &buffer,
162383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk            nsecs_t timestamp);
163c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams
164e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    /**
165383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * Fill in the camera3_stream_buffer with the next valid buffer for this
166383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * stream, to hand over to the HAL.
167383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     *
168383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * This method may only be called once finishConfiguration has been called.
169383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * For bidirectional streams, this method applies to the input-side
170383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * buffers.
171383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     *
172e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     */
173e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    status_t         getInputBuffer(camera3_stream_buffer *buffer);
1749ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams
175c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams    /**
176cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams     * Return a buffer to the stream after use by the HAL.
177c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams     *
178c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams     * This method may only be called for buffers provided by getBuffer().
179383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * For bidirectional streams, this method applies to the input-side buffers
18095333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk     */
181e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    status_t         returnInputBuffer(const camera3_stream_buffer &buffer);
182383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk
183383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    /**
184383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * Whether any of the stream's buffers are currently in use by the HAL,
185383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * including buffers that have been returned but not yet had their
186383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * release fence signaled.
187383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     */
188383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    bool             hasOutstandingBuffers() const;
189e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
190e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    enum {
19195333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk        TIMEOUT_NEVER = -1
19295333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk    };
19395333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk    /**
19495333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk     * Wait until the HAL is done with all of this stream's buffers, including
195383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk     * signalling all release fences. Returns TIMED_OUT if the timeout is exceeded,
1963a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams     * OK on success. Pass in TIMEOUT_NEVER for timeout to indicate an indefinite wait.
197e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk     */
198e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    virtual status_t waitUntilIdle(nsecs_t timeout) = 0;
199e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
2009ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams    /**
2013a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams     * Disconnect stream from its non-HAL endpoint. After this,
2023a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams     * start/finishConfiguration must be called before the stream can be used
2033a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams     * again. This cannot be called if the stream has outstanding dequeued
2043a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams     * buffers.
2053a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams     */
206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    status_t         disconnect();
207c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
208c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    /**
209be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams     * Debug dump of the stream's state.
210433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams     */
211433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    virtual void     dump(int fd, const Vector<String16> &args) const = 0;
2129ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams
2139ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams    void             addBufferListener(
2149ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams            wp<Camera3StreamBufferListener> listener);
215e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    void             removeBufferListener(
2164c9a208262a1fc9ba062d21b8c6c787b8a822991Jason Sams            const sp<Camera3StreamBufferListener>& listener);
2179ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams
218433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams  protected:
2199ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams    const int mId;
220c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    const String8 mName;
221c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    // Zero for formats with fixed buffer size for given dimensions.
222c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    const size_t mMaxSize;
223fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
224fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    enum {
225fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        STATE_ERROR,
226fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        STATE_CONSTRUCTED,
227fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        STATE_IN_CONFIG,
228fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        STATE_IN_RECONFIG,
229fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        STATE_CONFIGURED
230fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    } mState;
231fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
232fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mutable Mutex mLock;
2334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
234c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    Camera3Stream(int id, camera3_stream_type type,
235c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams            uint32_t width, uint32_t height, size_t maxSize, int format);
236326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
237326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    /**
238326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams     * Interface to be implemented by derived classes
239326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams     */
240326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
241326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // getBuffer / returnBuffer implementations
242326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
243326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // Since camera3_stream_buffer includes a raw pointer to the stream,
244771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams    // cast to camera3_stream*, implementations must increment the
2458ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    // refcount of the stream manually in getBufferLocked, and decrement it in
246e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    // returnBufferLocked.
247e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    virtual status_t getBufferLocked(camera3_stream_buffer *buffer);
248e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    virtual status_t returnBufferLocked(const camera3_stream_buffer &buffer,
249e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk            nsecs_t timestamp);
250e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    virtual status_t getInputBufferLocked(camera3_stream_buffer *buffer);
251e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    virtual status_t returnInputBufferLocked(
252e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk            const camera3_stream_buffer &buffer);
253e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    virtual bool     hasOutstandingBuffersLocked() const = 0;
254e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    // Can return -ENOTCONN when we are already disconnected (not an error)
255e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    virtual status_t disconnectLocked() = 0;
256e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
257e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    // Configure the buffer queue interface to the other end of the stream,
258e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    // after the HAL has provided usage and max_buffers values. After this call,
259e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    // the stream must be ready to produce all buffers for registration with
260e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    // HAL.
261e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    virtual status_t configureQueueLocked() = 0;
262e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
263e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    // Get the total number of buffers in the queue
264e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    virtual size_t   getBufferCountLocked() = 0;
265e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
266e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk  private:
267e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    uint32_t oldUsage;
268e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    uint32_t oldMaxBuffers;
269e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
270e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    // Gets all buffers from endpoint and registers them with the HAL.
271e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    status_t registerBuffersLocked(camera3_device *hal3Device);
272e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
273e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    void fireBufferListenersLocked(const camera3_stream_buffer& buffer,
274e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk                                  bool acquired, bool output);
275e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    List<wp<Camera3StreamBufferListener> > mBufferListenerList;
276e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
277e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk}; // class Camera3Stream
278e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
279e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk}; // namespace camera3
280e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
281e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk}; // namespace android
282e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
283e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk#endif
284e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk