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