1 /*
2  * Copyright (C) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_SERVERS_CAMERA3_STREAM_INTERFACE_H
18 #define ANDROID_SERVERS_CAMERA3_STREAM_INTERFACE_H
19 
20 #include <utils/RefBase.h>
21 
22 #include <camera/CameraMetadata.h>
23 #include "Camera3StreamBufferListener.h"
24 #include "Camera3StreamBufferFreedListener.h"
25 
26 struct camera3_stream;
27 struct camera3_stream_buffer;
28 
29 namespace android {
30 
31 namespace camera3 {
32 
33 enum {
34     /**
35      * This stream set ID indicates that the set ID is invalid, and this stream doesn't intend to
36      * share buffers with any other stream. It is illegal to register this kind of stream to
37      * Camera3BufferManager.
38      */
39     CAMERA3_STREAM_SET_ID_INVALID = -1,
40 
41     /**
42      * Invalid output stream ID.
43      */
44     CAMERA3_STREAM_ID_INVALID = -1,
45 };
46 
47 class StatusTracker;
48 
49 // OutputStreamInfo describes the property of a camera stream.
50 class OutputStreamInfo {
51     public:
52         int width;
53         int height;
54         int format;
55         android_dataspace dataSpace;
56         uint64_t consumerUsage;
57         bool finalized = false;
58         bool supportsOffline = false;
OutputStreamInfo()59         OutputStreamInfo() :
60             width(-1), height(-1), format(-1), dataSpace(HAL_DATASPACE_UNKNOWN),
61             consumerUsage(0) {}
OutputStreamInfo(int _width,int _height,int _format,android_dataspace _dataSpace,uint64_t _consumerUsage)62         OutputStreamInfo(int _width, int _height, int _format, android_dataspace _dataSpace,
63                 uint64_t _consumerUsage) :
64             width(_width), height(_height), format(_format),
65             dataSpace(_dataSpace), consumerUsage(_consumerUsage) {}
66 };
67 
68 /**
69  * An interface for managing a single stream of input and/or output data from
70  * the camera device.
71  */
72 class Camera3StreamInterface : public virtual RefBase {
73   public:
74 
75     enum {
76         ALLOCATE_PIPELINE_MAX = 0, // Allocate max buffers used by a given surface
77     };
78 
79     /**
80      * Get the stream's ID
81      */
82     virtual int      getId() const = 0;
83 
84     /**
85      * Get the output stream set id.
86      */
87     virtual int      getStreamSetId() const = 0;
88 
89     /**
90      * Get the stream's dimensions and format
91      */
92     virtual uint32_t getWidth() const = 0;
93     virtual uint32_t getHeight() const = 0;
94     virtual int      getFormat() const = 0;
95     virtual android_dataspace getDataSpace() const = 0;
96     virtual void setFormatOverride(bool formatOverriden) = 0;
97     virtual bool isFormatOverridden() const = 0;
98     virtual int getOriginalFormat() const = 0;
99     virtual void setDataSpaceOverride(bool dataSpaceOverriden) = 0;
100     virtual bool isDataSpaceOverridden() const = 0;
101     virtual android_dataspace getOriginalDataSpace() const = 0;
102 
103     /**
104      * Offline processing
105      */
106     virtual void setOfflineProcessingSupport(bool support) = 0;
107     virtual bool getOfflineProcessingSupport() const = 0;
108 
109     /**
110      * Get a HAL3 handle for the stream, without starting stream configuration.
111      */
112     virtual camera3_stream* asHalStream() = 0;
113 
114     /**
115      * Start the stream configuration process. Returns a handle to the stream's
116      * information to be passed into the HAL device's configure_streams call.
117      *
118      * Until finishConfiguration() is called, no other methods on the stream may
119      * be called. The usage and max_buffers fields of camera3_stream may be
120      * modified between start/finishConfiguration, but may not be changed after
121      * that. The priv field of camera3_stream may be modified at any time after
122      * startConfiguration.
123      *
124      * Returns NULL in case of error starting configuration.
125      */
126     virtual camera3_stream* startConfiguration() = 0;
127 
128     /**
129      * Check if the stream is mid-configuration (start has been called, but not
130      * finish).  Used for lazy completion of configuration.
131      */
132     virtual bool    isConfiguring() const = 0;
133 
134     /**
135      * Completes the stream configuration process. During this call, the stream
136      * may call the device's register_stream_buffers() method. The stream
137      * information structure returned by startConfiguration() may no longer be
138      * modified after this call, but can still be read until the destruction of
139      * the stream.
140      *
141      * streamReconfigured: set to true when a stream is being reconfigured.
142      *
143      * Returns:
144      *   OK on a successful configuration
145      *   NO_INIT in case of a serious error from the HAL device
146      *   NO_MEMORY in case of an error registering buffers
147      *   INVALID_OPERATION in case connecting to the consumer failed
148      */
149     virtual status_t finishConfiguration(/*out*/bool* streamReconfigured = nullptr) = 0;
150 
151     /**
152      * Cancels the stream configuration process. This returns the stream to the
153      * initial state, allowing it to be configured again later.
154      * This is done if the HAL rejects the proposed combined stream configuration
155      */
156     virtual status_t cancelConfiguration() = 0;
157 
158     /**
159      * Determine whether the stream has already become in-use (has received
160      * a valid filled buffer), which determines if a stream can still have
161      * prepareNextBuffer called on it.
162      */
163     virtual bool     isUnpreparable() = 0;
164 
165     /**
166      * Start stream preparation. May only be called in the CONFIGURED state,
167      * when no valid buffers have yet been returned to this stream. Prepares
168      * up to maxCount buffers, or the maximum number of buffers needed by the
169      * pipeline if maxCount is ALLOCATE_PIPELINE_MAX.
170      *
171      * If no prepartion is necessary, returns OK and does not transition to
172      * PREPARING state. Otherwise, returns NOT_ENOUGH_DATA and transitions
173      * to PREPARING.
174      *
175      * blockRequest specifies whether prepare will block upcoming capture
176      * request. This flag should only be set to false if the caller guarantees
177      * the whole buffer preparation process is done before capture request
178      * comes in.
179      *
180      * Returns:
181      *    OK if no more buffers need to be preallocated
182      *    NOT_ENOUGH_DATA if calls to prepareNextBuffer are needed to finish
183      *        buffer pre-allocation, and transitions to the PREPARING state.
184      *    NO_INIT in case of a serious error from the HAL device
185      *    INVALID_OPERATION if called when not in CONFIGURED state, or a
186      *        valid buffer has already been returned to this stream.
187      */
188     virtual status_t startPrepare(int maxCount, bool blockRequest) = 0;
189 
190     /**
191      * Check if the request on a stream is blocked by prepare.
192      */
193     virtual bool     isBlockedByPrepare() const = 0;
194 
195     /**
196      * Continue stream buffer preparation by allocating the next
197      * buffer for this stream.  May only be called in the PREPARED state.
198      *
199      * Returns OK and transitions to the CONFIGURED state if all buffers
200      * are allocated after the call concludes. Otherwise returns NOT_ENOUGH_DATA.
201      *
202      * Returns:
203      *    OK if no more buffers need to be preallocated, and transitions
204      *        to the CONFIGURED state.
205      *    NOT_ENOUGH_DATA if more calls to prepareNextBuffer are needed to finish
206      *        buffer pre-allocation.
207      *    NO_INIT in case of a serious error from the HAL device
208      *    INVALID_OPERATION if called when not in CONFIGURED state, or a
209      *        valid buffer has already been returned to this stream.
210      */
211     virtual status_t prepareNextBuffer() = 0;
212 
213     /**
214      * Cancel stream preparation early. In case allocation needs to be
215      * stopped, this method transitions the stream back to the CONFIGURED state.
216      * Buffers that have been allocated with prepareNextBuffer remain that way,
217      * but a later use of prepareNextBuffer will require just as many
218      * calls as if the earlier prepare attempt had not existed.
219      *
220      * Returns:
221      *    OK if cancellation succeeded, and transitions to the CONFIGURED state
222      *    INVALID_OPERATION if not in the PREPARING state
223      *    NO_INIT in case of a serious error from the HAL device
224      */
225     virtual status_t cancelPrepare() = 0;
226 
227     /**
228      * Tear down memory for this stream. This frees all unused gralloc buffers
229      * allocated for this stream, but leaves it ready for operation afterward.
230      *
231      * May only be called in the CONFIGURED state, and keeps the stream in
232      * the CONFIGURED state.
233      *
234      * Returns:
235      *    OK if teardown succeeded.
236      *    INVALID_OPERATION if not in the CONFIGURED state
237      *    NO_INIT in case of a serious error from the HAL device
238      */
239     virtual status_t tearDown() = 0;
240 
241     /**
242      * Fill in the camera3_stream_buffer with the next valid buffer for this
243      * stream, to hand over to the HAL.
244      *
245      * Multiple surfaces could share the same HAL stream, but a request may
246      * be only for a subset of surfaces. In this case, the
247      * Camera3StreamInterface object needs the surface ID information to acquire
248      * buffers for those surfaces. For the case of single surface for a HAL
249      * stream, surface_ids parameter has no effect.
250      *
251      * This method may only be called once finishConfiguration has been called.
252      * For bidirectional streams, this method applies to the output-side
253      * buffers.
254      *
255      */
256     virtual status_t getBuffer(camera3_stream_buffer *buffer,
257             nsecs_t waitBufferTimeout,
258             const std::vector<size_t>& surface_ids = std::vector<size_t>()) = 0;
259 
260     /**
261      * Return a buffer to the stream after use by the HAL.
262      *
263      * Multiple surfaces could share the same HAL stream, but a request may
264      * be only for a subset of surfaces. In this case, the
265      * Camera3StreamInterface object needs the surface ID information to attach
266      * buffers for those surfaces. For the case of single surface for a HAL
267      * stream, surface_ids parameter has no effect.
268      *
269      * This method may only be called for buffers provided by getBuffer().
270      * For bidirectional streams, this method applies to the output-side buffers
271      */
272     virtual status_t returnBuffer(const camera3_stream_buffer &buffer,
273             nsecs_t timestamp, bool timestampIncreasing = true,
274             const std::vector<size_t>& surface_ids = std::vector<size_t>(),
275             uint64_t frameNumber = 0) = 0;
276 
277     /**
278      * Fill in the camera3_stream_buffer with the next valid buffer for this
279      * stream, to hand over to the HAL.
280      *
281      * This method may only be called once finishConfiguration has been called.
282      * For bidirectional streams, this method applies to the input-side
283      * buffers.
284      *
285      * Normally this call will block until the handed out buffer count is less than the stream
286      * max buffer count; if respectHalLimit is set to false, this is ignored.
287      */
288     virtual status_t getInputBuffer(camera3_stream_buffer *buffer, bool respectHalLimit = true) = 0;
289 
290     /**
291      * Return a buffer to the stream after use by the HAL.
292      *
293      * This method may only be called for buffers provided by getBuffer().
294      * For bidirectional streams, this method applies to the input-side buffers
295      */
296     virtual status_t returnInputBuffer(const camera3_stream_buffer &buffer) = 0;
297 
298     /**
299      * Get the buffer producer of the input buffer queue.
300      *
301      * This method only applies to input streams.
302      */
303     virtual status_t getInputBufferProducer(sp<IGraphicBufferProducer> *producer) = 0;
304 
305     /**
306      * Whether any of the stream's buffers are currently in use by the HAL,
307      * including buffers that have been returned but not yet had their
308      * release fence signaled.
309      */
310     virtual bool     hasOutstandingBuffers() const = 0;
311 
312     /**
313      * Get number of buffers currently handed out to HAL
314      */
315     virtual size_t   getOutstandingBuffersCount() const = 0;
316 
317     enum {
318         TIMEOUT_NEVER = -1
319     };
320 
321     /**
322      * Set the state tracker to use for signaling idle transitions.
323      */
324     virtual status_t setStatusTracker(sp<StatusTracker> statusTracker) = 0;
325 
326     /**
327      * Disconnect stream from its non-HAL endpoint. After this,
328      * start/finishConfiguration must be called before the stream can be used
329      * again. This cannot be called if the stream has outstanding dequeued
330      * buffers.
331      */
332     virtual status_t disconnect() = 0;
333 
334     /**
335      * Return if the buffer queue of the stream is abandoned.
336      */
337     virtual bool isAbandoned() const = 0;
338 
339     /**
340      * Debug dump of the stream's state.
341      */
342     virtual void     dump(int fd, const Vector<String16> &args) const = 0;
343 
344     virtual void     addBufferListener(
345             wp<Camera3StreamBufferListener> listener) = 0;
346     virtual void     removeBufferListener(
347             const sp<Camera3StreamBufferListener>& listener) = 0;
348 
349     /**
350      * Setting listner will remove previous listener (if exists)
351      * Only allow set listener during stream configuration because stream is guaranteed to be IDLE
352      * at this state, so setBufferFreedListener won't collide with onBufferFreed callbacks.
353      * Client is responsible to keep the listener object alive throughout the lifecycle of this
354      * Camera3Stream.
355      */
356     virtual void setBufferFreedListener(wp<Camera3StreamBufferFreedListener> listener) = 0;
357 
358     /**
359      * Notify buffer stream listeners about incoming request with particular frame number.
360      */
361     virtual void fireBufferRequestForFrameNumber(uint64_t frameNumber,
362             const CameraMetadata& settings) = 0;
363 };
364 
365 } // namespace camera3
366 
367 } // namespace android
368 
369 #endif
370