blob: 95c04f1f25c18f3ee3f84f4cd38fe083fcc862da [file] [log] [blame]
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -07001#ifndef ANDROID_DVR_BUFFER_QUEUE_H_
2#define ANDROID_DVR_BUFFER_QUEUE_H_
3
Corey Tabaka2251d822017-04-20 16:04:07 -07004#include <sys/cdefs.h>
5
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -07006#include <dvr/dvr_buffer.h>
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -07007
Corey Tabaka2251d822017-04-20 16:04:07 -07008__BEGIN_DECLS
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -07009
Jiwen 'Steve' Cai960bcff2017-04-04 15:02:04 -070010typedef struct ANativeWindow ANativeWindow;
11
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070012typedef struct DvrWriteBufferQueue DvrWriteBufferQueue;
13typedef struct DvrReadBufferQueue DvrReadBufferQueue;
14
Jiwen 'Steve' Cai656f4062017-05-22 13:02:33 -070015// Destroy a write buffer queue.
16//
17// @param write_queue The DvrWriteBufferQueue of interest.
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070018void dvrWriteBufferQueueDestroy(DvrWriteBufferQueue* write_queue);
Jiwen 'Steve' Cai656f4062017-05-22 13:02:33 -070019
20// Get the total number of buffers in a write buffer queue.
21//
22// @param write_queue The DvrWriteBufferQueue of interest.
23// @return The capacity on success; or negative error code.
Corey Tabaka2251d822017-04-20 16:04:07 -070024ssize_t dvrWriteBufferQueueGetCapacity(DvrWriteBufferQueue* write_queue);
Jiwen 'Steve' Cai656f4062017-05-22 13:02:33 -070025
26// Get the system unique queue id of a write buffer queue.
27//
28// @param write_queue The DvrWriteBufferQueue of interest.
29// @return Queue id on success; or negative error code.
Corey Tabaka2251d822017-04-20 16:04:07 -070030int dvrWriteBufferQueueGetId(DvrWriteBufferQueue* write_queue);
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070031
Jiwen 'Steve' Cai656f4062017-05-22 13:02:33 -070032// Gets an ANativeWindow backed by the DvrWriteBufferQueue
33//
34// Can be casted to a Java Surface using ANativeWindow_toSurface NDK API. Note
35// that the native window is lazily created at the first time |GetNativeWindow|
36// is called, and the created ANativeWindow will be cached so that multiple
37// calls to this method will return the same object. Also note that this method
38// does not acquire an additional reference to the ANativeWindow returned, don't
39// call ANativeWindow_release on it.
40//
41// @param write_queue The DvrWriteBufferQueue of interest.
42// @param out_window The pointer of an ANativeWindow will be filled here if
43// the method call succeeds.
44// @return Zero on success; or -EINVAL if this DvrWriteBufferQueue does not
45// support being used as an android Surface.
Jiwen 'Steve' Cai960bcff2017-04-04 15:02:04 -070046int dvrWriteBufferQueueGetExternalSurface(DvrWriteBufferQueue* write_queue,
47 ANativeWindow** out_window);
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070048
Jiwen 'Steve' Cai656f4062017-05-22 13:02:33 -070049// Create a read buffer queue from an existing write buffer queue.
50//
51// @param write_queue The DvrWriteBufferQueue of interest.
52// @param out_read_queue The pointer of a DvrReadBufferQueue will be filled here
53// if the method call succeeds.
54// @return Zero on success, or negative error code.
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070055int dvrWriteBufferQueueCreateReadQueue(DvrWriteBufferQueue* write_queue,
56 DvrReadBufferQueue** out_read_queue);
Jiwen 'Steve' Cai656f4062017-05-22 13:02:33 -070057
58// Dequeue a buffer to write into.
59//
60// @param write_queue The DvrWriteBufferQueue of interest.
61// @param timeout Specifies the number of milliseconds that the method will
62// block. Specifying a timeout of -1 causes it to block indefinitely,
63// while specifying a timeout equal to zero cause it to return immediately,
64// even if no buffers are available.
65// @param out_buffer A targeting DvrWriteBuffer object to hold the output of the
66// dequeue operation. Must be created by |dvrWriteBufferCreateEmpty|.
67// @param out_fence_fd A sync fence fd defined in NDK's sync.h API, which
68// signals the release of underlying buffer. The producer should wait until
69// this fence clears before writing data into it.
70// @return Zero on success, or negative error code.
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070071int dvrWriteBufferQueueDequeue(DvrWriteBufferQueue* write_queue, int timeout,
Corey Tabaka2251d822017-04-20 16:04:07 -070072 DvrWriteBuffer* out_buffer, int* out_fence_fd);
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070073
Jiwen 'Steve' Cai656f4062017-05-22 13:02:33 -070074// Overrides buffer dimension with new width and height.
75//
76// After the call successfully returns, each |dvrWriteBufferQueueDequeue| call
77// will return buffer with newly assigned |width| and |height|. When necessary,
78// old buffer will be removed from the buffer queue and replaced with new buffer
79// matching the new buffer size.
80//
81// @param write_queue The DvrWriteBufferQueue of interest.
82// @param width Desired width, cannot be Zero.
83// @param height Desired height, cannot be Zero.
84// @return Zero on success, or negative error code.
85int dvrWriteBufferQueueResizeBuffer(DvrWriteBufferQueue* write_queue,
86 uint32_t width, uint32_t height);
87
88// Destroy a read buffer queue.
89//
90// @param read_queue The DvrReadBufferQueue of interest.
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070091void dvrReadBufferQueueDestroy(DvrReadBufferQueue* read_queue);
Jiwen 'Steve' Cai656f4062017-05-22 13:02:33 -070092
93// Get the total number of buffers in a read buffer queue.
94//
95// @param read_queue The DvrReadBufferQueue of interest.
96// @return The capacity on success; or negative error code.
Corey Tabaka2251d822017-04-20 16:04:07 -070097ssize_t dvrReadBufferQueueGetCapacity(DvrReadBufferQueue* read_queue);
Jiwen 'Steve' Cai656f4062017-05-22 13:02:33 -070098
99// Get the system unique queue id of a read buffer queue.
100//
101// @param read_queue The DvrReadBufferQueue of interest.
102// @return Queue id on success; or negative error code.
Corey Tabaka2251d822017-04-20 16:04:07 -0700103int dvrReadBufferQueueGetId(DvrReadBufferQueue* read_queue);
Jiwen 'Steve' Cai656f4062017-05-22 13:02:33 -0700104
105// Create a read buffer queue from an existing read buffer queue.
106//
107// @param read_queue The DvrReadBufferQueue of interest.
108// @param out_read_queue The pointer of a DvrReadBufferQueue will be filled here
109// if the method call succeeds.
110// @return Zero on success, or negative error code.
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -0700111int dvrReadBufferQueueCreateReadQueue(DvrReadBufferQueue* read_queue,
112 DvrReadBufferQueue** out_read_queue);
Jiwen 'Steve' Cai656f4062017-05-22 13:02:33 -0700113
114// Dequeue a buffer to read from.
115//
116// @param read_queue The DvrReadBufferQueue of interest.
117// @param timeout Specifies the number of milliseconds that the method will
118// block. Specifying a timeout of -1 causes it to block indefinitely,
119// while specifying a timeout equal to zero cause it to return immediately,
120// even if no buffers are available.
121// @param out_buffer A targeting DvrReadBuffer object to hold the output of the
122// dequeue operation. Must be created by |dvrReadBufferCreateEmpty|.
123// @param out_fence_fd A sync fence fd defined in NDK's sync.h API, which
124// signals the release of underlying buffer. The consumer should wait until
125// this fence clears before reading data from it.
126// @param out_meta The memory area where a metadata object will be filled.
Jiwen 'Steve' Cai42c6f3a2017-06-30 17:04:28 -0700127// Can be nullptr iff |meta_size_bytes| is zero (i.e., there is no
128// metadata).
Jiwen 'Steve' Cai656f4062017-05-22 13:02:33 -0700129// @param meta_size_bytes Size of the metadata object caller expects. If it
130// doesn't match the size of actually metadata transported by the buffer
131// queue, the method returns -EINVAL.
132// @return Zero on success, or negative error code.
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -0700133int dvrReadBufferQueueDequeue(DvrReadBufferQueue* read_queue, int timeout,
Corey Tabaka2251d822017-04-20 16:04:07 -0700134 DvrReadBuffer* out_buffer, int* out_fence_fd,
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -0700135 void* out_meta, size_t meta_size_bytes);
136
Jiwen 'Steve' Cai0b801552017-05-24 11:50:11 -0700137// Callback function which will be called when a buffer is avaiable.
138//
139// Note that there is no guarantee of thread safety and on which thread the
140// callback will be fired.
141//
142// @param context User provided opaque pointer.
143typedef void (*DvrReadBufferQueueBufferAvailableCallback)(void* context);
144
145// Set buffer avaiable callback.
146//
147// @param read_queue The DvrReadBufferQueue of interest.
148// @param callback The callback function. Set this to NULL if caller no longer
149// needs to listen to new buffer available events.
150// @param context User provided opaque pointer, will be passed back during
151// callback. The caller is responsible for ensuring the validity of the
152// context through the life cycle of the DvrReadBufferQueue.
153// @return Zero on success, or negative error code.
154int dvrReadBufferQueueSetBufferAvailableCallback(
155 DvrReadBufferQueue* read_queue,
156 DvrReadBufferQueueBufferAvailableCallback callback, void* context);
157
158// Callback function which will be called when a buffer is about to be removed.
159//
160// Note that there is no guarantee of thread safety and on which thread the
161// callback will be fired.
162//
163// @param buffer The buffer being removed. Once the callbacks returns, this
164// buffer will be dereferenced from the buffer queue. If user has ever
165// cached other DvrReadBuffer/AHardwareBuffer/EglImageKHR objects derived
166// from this buffer, it's the user's responsibility to clean them up.
167// Note that the ownership of the read buffer is not passed to this
168// callback, so it should call dvrReadBufferDestroy on the buffer.
169// @param context User provided opaque pointer.
170typedef void (*DvrReadBufferQueueBufferRemovedCallback)(DvrReadBuffer* buffer,
171 void* context);
172
173// Set buffer removed callback.
174//
175// @param read_queue The DvrReadBufferQueue of interest.
176// @param callback The callback function. Set this to NULL if caller no longer
177// needs to listen to buffer removed events.
178// @param context User provided opaque pointer, will be passed back during
179// callback. The caller is responsible for ensuring the validity of the
180// context through the life cycle of the DvrReadBufferQueue.
181// @return Zero on success, or negative error code.
182int dvrReadBufferQueueSetBufferRemovedCallback(
183 DvrReadBufferQueue* read_queue,
184 DvrReadBufferQueueBufferRemovedCallback callback, void* context);
185
186// Handle all pending events on the read queue.
187//
188// @param read_queue The DvrReadBufferQueue of interest.
189// @return Zero on success, or negative error code.
190int dvrReadBufferQueueHandleEvents(DvrReadBufferQueue* read_queue);
191
Corey Tabaka2251d822017-04-20 16:04:07 -0700192__END_DECLS
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -0700193
194#endif // ANDROID_DVR_BUFFER_QUEUE_H_