12d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai#ifndef ANDROID_DVR_BUFFER_QUEUE_H_
22d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai#define ANDROID_DVR_BUFFER_QUEUE_H_
32d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
42251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <sys/cdefs.h>
52251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
62d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai#include <dvr/dvr_buffer.h>
72d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
82251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka__BEGIN_DECLS
92d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
10960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Caitypedef struct ANativeWindow ANativeWindow;
11960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai
122d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Caitypedef struct DvrWriteBufferQueue DvrWriteBufferQueue;
132d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Caitypedef struct DvrReadBufferQueue DvrReadBufferQueue;
142d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
15d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai// Creates a write buffer queue to be used locally.
16d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai//
17d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai// Note that this API is mostly for testing purpose. For now there is no
18d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai// mechanism to send a DvrWriteBufferQueue cross process. Use
19d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai// dvrSurfaceCreateWriteBufferQueue if cross-process buffer transport is
20d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai// intended.
21d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai//
22d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai// @param width The width of the buffers that this queue will produce.
23d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai// @param height The height of buffers that this queue will produce.
24d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai// @param format The format of the buffers that this queue will produce. This
25d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai//     must be one of the AHARDWAREBUFFER_FORMAT_XXX enums.
26d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai// @param layer_count The number of layers of the buffers that this queue will
27d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai//     produce.
28d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai// @param usage The usage of the buffers that this queue will produce. This
29d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai//     must a combination of the AHARDWAREBUFFER_USAGE_XXX flags.
30d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai// @param capacity The number of buffer that this queue will allocate. Note that
31d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai//     all buffers will be allocated on create. Currently, the number of buffers
32d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai//     is the queue cannot be changed after creation though DVR API. However,
33d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai//     ANativeWindow can choose to reallocate, attach, or detach buffers from
34d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai//     a DvrWriteBufferQueue through Android platform logic.
35d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai// @param metadata_size The size of metadata in bytes.
36d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai// @param out_write_queue The pointer of a DvrWriteBufferQueue will be filled
37d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai//      here if the method call succeeds. The metadata size must match
38d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai//      the metadata size in dvrWriteBufferPost/dvrReadBufferAcquire.
39d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai// @return Zero on success, or negative error code.
40d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Caiint dvrWriteBufferQueueCreate(uint32_t width, uint32_t height, uint32_t format,
41d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai                              uint32_t layer_count, uint64_t usage,
42d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai                              size_t capacity, size_t metadata_size,
43d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai                              DvrWriteBufferQueue** out_write_queue);
44d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai
45656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// Destroy a write buffer queue.
46656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//
47656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param write_queue The DvrWriteBufferQueue of interest.
482d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Caivoid dvrWriteBufferQueueDestroy(DvrWriteBufferQueue* write_queue);
49656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
50656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// Get the total number of buffers in a write buffer queue.
51656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//
52656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param write_queue The DvrWriteBufferQueue of interest.
53656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @return The capacity on success; or negative error code.
542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakassize_t dvrWriteBufferQueueGetCapacity(DvrWriteBufferQueue* write_queue);
55656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
56656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// Get the system unique queue id of a write buffer queue.
57656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//
58656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param write_queue The DvrWriteBufferQueue of interest.
59656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @return Queue id on success; or negative error code.
602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrWriteBufferQueueGetId(DvrWriteBufferQueue* write_queue);
612d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
62656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// Gets an ANativeWindow backed by the DvrWriteBufferQueue
63656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//
64656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// Can be casted to a Java Surface using ANativeWindow_toSurface NDK API. Note
65656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// that the native window is lazily created at the first time |GetNativeWindow|
66656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// is called, and the created ANativeWindow will be cached so that multiple
67656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// calls to this method will return the same object. Also note that this method
68656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// does not acquire an additional reference to the ANativeWindow returned, don't
69656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// call ANativeWindow_release on it.
70656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//
71656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param write_queue The DvrWriteBufferQueue of interest.
72656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param out_window The pointer of an ANativeWindow will be filled here if
73656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//     the method call succeeds.
74656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @return Zero on success; or -EINVAL if this DvrWriteBufferQueue does not
75656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//     support being used as an android Surface.
765b5d4e11949ae5fbd370927e721480f91c079857Jiwen 'Steve' Caiint dvrWriteBufferQueueGetANativeWindow(DvrWriteBufferQueue* write_queue,
775b5d4e11949ae5fbd370927e721480f91c079857Jiwen 'Steve' Cai                                        ANativeWindow** out_window);
785b5d4e11949ae5fbd370927e721480f91c079857Jiwen 'Steve' Cai
79656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// Create a read buffer queue from an existing write buffer queue.
80656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//
81656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param write_queue The DvrWriteBufferQueue of interest.
82656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param out_read_queue The pointer of a DvrReadBufferQueue will be filled here
83656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//     if the method call succeeds.
84656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @return Zero on success, or negative error code.
852d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Caiint dvrWriteBufferQueueCreateReadQueue(DvrWriteBufferQueue* write_queue,
862d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai                                       DvrReadBufferQueue** out_read_queue);
87656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
88638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// Gains a buffer to write into.
89656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//
90638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// @param write_queue The DvrWriteBufferQueue to gain buffer from.
91656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param timeout Specifies the number of milliseconds that the method will
92656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//     block. Specifying a timeout of -1 causes it to block indefinitely,
93656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//     while specifying a timeout equal to zero cause it to return immediately,
94656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//     even if no buffers are available.
95656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param out_buffer A targeting DvrWriteBuffer object to hold the output of the
96638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai//     dequeue operation.
97638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// @param out_meta A DvrNativeBufferMetadata object populated by the
98638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai//     corresponding dvrReadBufferQueueReleaseBuffer API.
99656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param out_fence_fd A sync fence fd defined in NDK's sync.h API, which
100656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//     signals the release of underlying buffer. The producer should wait until
101656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//     this fence clears before writing data into it.
102656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @return Zero on success, or negative error code.
103638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Caiint dvrWriteBufferQueueGainBuffer(DvrWriteBufferQueue* write_queue, int timeout,
104638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai                                  DvrWriteBuffer** out_write_buffer,
105638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai                                  DvrNativeBufferMetadata* out_meta,
106638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai                                  int* out_fence_fd);
107638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai
108638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// Posts a buffer and signals its readiness to be read from.
109638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai//
110638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// @param write_queue The DvrWriteBufferQueue to post buffer into.
111638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// @param write_buffer The buffer to be posted.
112638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// @param meta The buffer metadata describing the buffer.
113638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// @param ready_fence_fd  A sync fence fd defined in NDK's sync.h API, which
114638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai//     signals the readdiness of underlying buffer. When a valid fence gets
115638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai//     passed in, the consumer will wait the fence to be ready before it starts
116638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai//     to ready from the buffer.
117638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// @return Zero on success, or negative error code.
118638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Caiint dvrWriteBufferQueuePostBuffer(DvrWriteBufferQueue* write_queue,
119638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai                                  DvrWriteBuffer* write_buffer,
120638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai                                  const DvrNativeBufferMetadata* meta,
121638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai                                  int ready_fence_fd);
1222d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
123656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// Overrides buffer dimension with new width and height.
124656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//
125656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// After the call successfully returns, each |dvrWriteBufferQueueDequeue| call
126656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// will return buffer with newly assigned |width| and |height|. When necessary,
127656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// old buffer will be removed from the buffer queue and replaced with new buffer
128656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// matching the new buffer size.
129656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//
130656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param write_queue The DvrWriteBufferQueue of interest.
131656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param width Desired width, cannot be Zero.
132656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param height Desired height, cannot be Zero.
133656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @return Zero on success, or negative error code.
134656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Caiint dvrWriteBufferQueueResizeBuffer(DvrWriteBufferQueue* write_queue,
135656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai                                    uint32_t width, uint32_t height);
136656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
137656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// Destroy a read buffer queue.
138656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//
139656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param read_queue The DvrReadBufferQueue of interest.
1402d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Caivoid dvrReadBufferQueueDestroy(DvrReadBufferQueue* read_queue);
141656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
142656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// Get the total number of buffers in a read buffer queue.
143656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//
144656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param read_queue The DvrReadBufferQueue of interest.
145656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @return The capacity on success; or negative error code.
1462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakassize_t dvrReadBufferQueueGetCapacity(DvrReadBufferQueue* read_queue);
147656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
148656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// Get the system unique queue id of a read buffer queue.
149656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//
150656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param read_queue The DvrReadBufferQueue of interest.
151656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @return Queue id on success; or negative error code.
1522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrReadBufferQueueGetId(DvrReadBufferQueue* read_queue);
153656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
15497274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai// Get the event fd that signals when queue updates occur.
15597274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai//
15697274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai// Use ReadBufferQueueHandleEvents to trigger registered event callbacks.
15797274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai//
15897274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai// @param read_queue The DvrReadBufferQueue of interest.
15997274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai// @return Fd on success; or negative error code.
16097274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Caiint dvrReadBufferQueueGetEventFd(DvrReadBufferQueue* read_queue);
16197274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai
162656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// Create a read buffer queue from an existing read buffer queue.
163656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//
164656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param read_queue The DvrReadBufferQueue of interest.
165656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param out_read_queue The pointer of a DvrReadBufferQueue will be filled here
166656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//     if the method call succeeds.
167656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @return Zero on success, or negative error code.
1682d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Caiint dvrReadBufferQueueCreateReadQueue(DvrReadBufferQueue* read_queue,
1692d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai                                      DvrReadBufferQueue** out_read_queue);
170656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
171638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// Dequeues a buffer to read from.
172656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//
173638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// @param read_queue The DvrReadBufferQueue to acquire buffer from.
174656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param timeout Specifies the number of milliseconds that the method will
175656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//     block. Specifying a timeout of -1 causes it to block indefinitely,
176656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//     while specifying a timeout equal to zero cause it to return immediately,
177656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//     even if no buffers are available.
178656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param out_buffer A targeting DvrReadBuffer object to hold the output of the
179656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//     dequeue operation. Must be created by |dvrReadBufferCreateEmpty|.
180638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// @param out_meta A DvrNativeBufferMetadata object populated by the
181638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai//     corresponding dvrWriteBufferQueuePostBuffer API.
182656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @param out_fence_fd A sync fence fd defined in NDK's sync.h API, which
183656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//     signals the release of underlying buffer. The consumer should wait until
184656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai//     this fence clears before reading data from it.
185656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// @return Zero on success, or negative error code.
186638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Caiint dvrReadBufferQueueAcquireBuffer(DvrReadBufferQueue* read_queue, int timeout,
187638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai                                    DvrReadBuffer** out_read_buffer,
188638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai                                    DvrNativeBufferMetadata* out_meta,
189638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai                                    int* out_fence_fd);
190638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai
191638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// Releases a buffer and signals its readiness to be written into.
192638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai//
193638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// @param read_queue The DvrReadBufferQueue to release buffer into.
194638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// @param read_buffer The buffer to be released.
195638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// @param meta The buffer metadata describing the buffer.
196638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// @param release_fence_fd A sync fence fd defined in NDK's sync.h API, which
197638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai//     signals the readdiness of underlying buffer. When a valid fence gets
198638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai//     passed in, the producer will wait the fence to be ready before it starts
199638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai//     to write into the buffer again.
200638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai// @return Zero on success, or negative error code.
201638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Caiint dvrReadBufferQueueReleaseBuffer(DvrReadBufferQueue* read_queue,
202638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai                                    DvrReadBuffer* read_buffer,
203638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai                                    const DvrNativeBufferMetadata* meta,
204638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai                                    int release_fence_fd);
2052d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
2060b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// Callback function which will be called when a buffer is avaiable.
2070b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//
2080b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// Note that there is no guarantee of thread safety and on which thread the
2090b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// callback will be fired.
2100b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//
2110b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// @param context User provided opaque pointer.
2120b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Caitypedef void (*DvrReadBufferQueueBufferAvailableCallback)(void* context);
2130b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
2140b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// Set buffer avaiable callback.
2150b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//
2160b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// @param read_queue The DvrReadBufferQueue of interest.
2170b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// @param callback The callback function. Set this to NULL if caller no longer
2180b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//     needs to listen to new buffer available events.
2190b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// @param context User provided opaque pointer, will be passed back during
2200b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//     callback. The caller is responsible for ensuring the validity of the
2210b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//     context through the life cycle of the DvrReadBufferQueue.
2220b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// @return Zero on success, or negative error code.
2230b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Caiint dvrReadBufferQueueSetBufferAvailableCallback(
2240b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai    DvrReadBufferQueue* read_queue,
2250b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai    DvrReadBufferQueueBufferAvailableCallback callback, void* context);
2260b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
2270b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// Callback function which will be called when a buffer is about to be removed.
2280b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//
2290b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// Note that there is no guarantee of thread safety and on which thread the
2300b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// callback will be fired.
2310b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//
2320b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// @param buffer The buffer being removed. Once the callbacks returns, this
2330b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//     buffer will be dereferenced from the buffer queue. If user has ever
2340b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//     cached other DvrReadBuffer/AHardwareBuffer/EglImageKHR objects derived
2350b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//     from this buffer, it's the user's responsibility to clean them up.
2360b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//     Note that the ownership of the read buffer is not passed to this
2370b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//     callback, so it should call dvrReadBufferDestroy on the buffer.
2380b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// @param context User provided opaque pointer.
2390b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Caitypedef void (*DvrReadBufferQueueBufferRemovedCallback)(DvrReadBuffer* buffer,
2400b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai                                                        void* context);
2410b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
2420b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// Set buffer removed callback.
2430b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//
2440b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// @param read_queue The DvrReadBufferQueue of interest.
2450b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// @param callback The callback function. Set this to NULL if caller no longer
2460b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//     needs to listen to buffer removed events.
2470b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// @param context User provided opaque pointer, will be passed back during
2480b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//     callback. The caller is responsible for ensuring the validity of the
2490b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//     context through the life cycle of the DvrReadBufferQueue.
2500b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// @return Zero on success, or negative error code.
2510b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Caiint dvrReadBufferQueueSetBufferRemovedCallback(
2520b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai    DvrReadBufferQueue* read_queue,
2530b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai    DvrReadBufferQueueBufferRemovedCallback callback, void* context);
2540b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
2550b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// Handle all pending events on the read queue.
2560b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai//
2570b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// @param read_queue The DvrReadBufferQueue of interest.
2580b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai// @return Zero on success, or negative error code.
2590b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Caiint dvrReadBufferQueueHandleEvents(DvrReadBufferQueue* read_queue);
2600b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
2612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka__END_DECLS
2622d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
2632d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai#endif  // ANDROID_DVR_BUFFER_QUEUE_H_
264