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