1656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai#ifndef ANDROID_DVR_BUFFER_QUEUE_INTERNAL_H_ 2656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai#define ANDROID_DVR_BUFFER_QUEUE_INTERNAL_H_ 3656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 4656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai#include <gui/Surface.h> 5656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai#include <private/dvr/buffer_hub_queue_client.h> 6656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai#include <sys/cdefs.h> 7656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 8638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai#include <array> 9656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai#include <memory> 10656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 11638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai#include "dvr_internal.h" 12638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai 13656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Caistruct ANativeWindow; 14656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 15638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Caitypedef struct DvrNativeBufferMetadata DvrNativeBufferMetadata; 165096c652aa19a501ce28177076de89e58e15b4b3Marie Whitetypedef struct DvrReadBuffer DvrReadBuffer; 175096c652aa19a501ce28177076de89e58e15b4b3Marie Whitetypedef struct DvrReadBufferQueue DvrReadBufferQueue; 185096c652aa19a501ce28177076de89e58e15b4b3Marie Whitetypedef struct DvrWriteBuffer DvrWriteBuffer; 195096c652aa19a501ce28177076de89e58e15b4b3Marie Whitetypedef void (*DvrReadBufferQueueBufferAvailableCallback)(void* context); 205096c652aa19a501ce28177076de89e58e15b4b3Marie Whitetypedef void (*DvrReadBufferQueueBufferRemovedCallback)(DvrReadBuffer* buffer, 215096c652aa19a501ce28177076de89e58e15b4b3Marie White void* context); 225096c652aa19a501ce28177076de89e58e15b4b3Marie White 23656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Caistruct DvrWriteBufferQueue { 24638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai using BufferHubQueue = android::dvr::BufferHubQueue; 25656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai using ProducerQueue = android::dvr::ProducerQueue; 26656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 27656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai // Create a concrete object for DvrWriteBufferQueue. 28656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai // 29656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai // @param producer_queue The BufferHub's ProducerQueue that is used to back 30656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai // this DvrWriteBufferQueue, must not be NULL. 31656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai explicit DvrWriteBufferQueue( 32656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai const std::shared_ptr<ProducerQueue>& producer_queue); 33656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 34656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai int id() const { return producer_queue_->id(); } 35656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai uint32_t width() const { return width_; }; 36656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai uint32_t height() const { return height_; }; 37656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai uint32_t format() const { return format_; }; 38656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai size_t capacity() const { return producer_queue_->capacity(); } 39656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai const std::shared_ptr<ProducerQueue>& producer_queue() const { 40656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai return producer_queue_; 41656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai } 42656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 43656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai int GetNativeWindow(ANativeWindow** out_window); 44656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai int CreateReadQueue(DvrReadBufferQueue** out_read_queue); 4552ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka int Dequeue(int timeout, DvrWriteBuffer* write_buffer, int* out_fence_fd); 46638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai int GainBuffer(int timeout, DvrWriteBuffer** out_write_buffer, 47638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai DvrNativeBufferMetadata* out_meta, int* out_fence_fd); 48638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai int PostBuffer(DvrWriteBuffer* write_buffer, 49638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai const DvrNativeBufferMetadata* meta, int ready_fence_fd); 50656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai int ResizeBuffer(uint32_t width, uint32_t height); 51656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 52656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai private: 53656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai std::shared_ptr<ProducerQueue> producer_queue_; 54638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai std::array<std::unique_ptr<DvrWriteBuffer>, BufferHubQueue::kMaxQueueCapacity> 55638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai write_buffers_; 56656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 5752ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka int64_t next_post_index_ = 0; 58656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai uint32_t width_; 59656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai uint32_t height_; 60656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai uint32_t format_; 61638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai 62656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai android::sp<android::Surface> native_window_; 63656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai}; 64656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 65656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Caistruct DvrReadBufferQueue { 66638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai using BufferHubQueue = android::dvr::BufferHubQueue; 67656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai using ConsumerQueue = android::dvr::ConsumerQueue; 68656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 69656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai explicit DvrReadBufferQueue( 70656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai const std::shared_ptr<ConsumerQueue>& consumer_queue); 71656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 72656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai int id() const { return consumer_queue_->id(); } 7397274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai int event_fd() const { return consumer_queue_->queue_fd(); } 74656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai size_t capacity() const { return consumer_queue_->capacity(); } 75656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 76656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai int CreateReadQueue(DvrReadBufferQueue** out_read_queue); 77656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai int Dequeue(int timeout, DvrReadBuffer* read_buffer, int* out_fence_fd, 7852ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka void* out_meta, size_t user_metadata_size); 79638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai int AcquireBuffer(int timeout, DvrReadBuffer** out_read_buffer, 80638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai DvrNativeBufferMetadata* out_meta, int* out_fence_fd); 81638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai int ReleaseBuffer(DvrReadBuffer* read_buffer, 82638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai const DvrNativeBufferMetadata* meta, int release_fence_fd); 830b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai void SetBufferAvailableCallback( 840b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai DvrReadBufferQueueBufferAvailableCallback callback, void* context); 850b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai void SetBufferRemovedCallback( 860b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai DvrReadBufferQueueBufferRemovedCallback callback, void* context); 870b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai int HandleEvents(); 88656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 89656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai private: 90656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai std::shared_ptr<ConsumerQueue> consumer_queue_; 91638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai std::array<std::unique_ptr<DvrReadBuffer>, BufferHubQueue::kMaxQueueCapacity> 92638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai read_buffers_; 93656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai}; 94656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai 95656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai#endif // ANDROID_DVR_BUFFER_QUEUE_INTERNAL_H_ 96