1#ifndef ANDROID_DVR_BUFFER_QUEUE_INTERNAL_H_
2#define ANDROID_DVR_BUFFER_QUEUE_INTERNAL_H_
3
4#include <gui/Surface.h>
5#include <private/dvr/buffer_hub_queue_client.h>
6#include <sys/cdefs.h>
7
8#include <array>
9#include <memory>
10
11#include "dvr_internal.h"
12
13struct ANativeWindow;
14
15typedef struct DvrNativeBufferMetadata DvrNativeBufferMetadata;
16typedef struct DvrReadBuffer DvrReadBuffer;
17typedef struct DvrReadBufferQueue DvrReadBufferQueue;
18typedef struct DvrWriteBuffer DvrWriteBuffer;
19typedef void (*DvrReadBufferQueueBufferAvailableCallback)(void* context);
20typedef void (*DvrReadBufferQueueBufferRemovedCallback)(DvrReadBuffer* buffer,
21                                                        void* context);
22
23struct DvrWriteBufferQueue {
24  using BufferHubQueue = android::dvr::BufferHubQueue;
25  using ProducerQueue = android::dvr::ProducerQueue;
26
27  // Create a concrete object for DvrWriteBufferQueue.
28  //
29  // @param producer_queue The BufferHub's ProducerQueue that is used to back
30  //     this DvrWriteBufferQueue, must not be NULL.
31  explicit DvrWriteBufferQueue(
32      const std::shared_ptr<ProducerQueue>& producer_queue);
33
34  int id() const { return producer_queue_->id(); }
35  uint32_t width() const { return width_; };
36  uint32_t height() const { return height_; };
37  uint32_t format() const { return format_; };
38  size_t capacity() const { return producer_queue_->capacity(); }
39  const std::shared_ptr<ProducerQueue>& producer_queue() const {
40    return producer_queue_;
41  }
42
43  int GetNativeWindow(ANativeWindow** out_window);
44  int CreateReadQueue(DvrReadBufferQueue** out_read_queue);
45  int Dequeue(int timeout, DvrWriteBuffer* write_buffer, int* out_fence_fd);
46  int GainBuffer(int timeout, DvrWriteBuffer** out_write_buffer,
47                 DvrNativeBufferMetadata* out_meta, int* out_fence_fd);
48  int PostBuffer(DvrWriteBuffer* write_buffer,
49                 const DvrNativeBufferMetadata* meta, int ready_fence_fd);
50  int ResizeBuffer(uint32_t width, uint32_t height);
51
52 private:
53  std::shared_ptr<ProducerQueue> producer_queue_;
54  std::array<std::unique_ptr<DvrWriteBuffer>, BufferHubQueue::kMaxQueueCapacity>
55      write_buffers_;
56
57  int64_t next_post_index_ = 0;
58  uint32_t width_;
59  uint32_t height_;
60  uint32_t format_;
61
62  android::sp<android::Surface> native_window_;
63};
64
65struct DvrReadBufferQueue {
66  using BufferHubQueue = android::dvr::BufferHubQueue;
67  using ConsumerQueue = android::dvr::ConsumerQueue;
68
69  explicit DvrReadBufferQueue(
70      const std::shared_ptr<ConsumerQueue>& consumer_queue);
71
72  int id() const { return consumer_queue_->id(); }
73  int event_fd() const { return consumer_queue_->queue_fd(); }
74  size_t capacity() const { return consumer_queue_->capacity(); }
75
76  int CreateReadQueue(DvrReadBufferQueue** out_read_queue);
77  int Dequeue(int timeout, DvrReadBuffer* read_buffer, int* out_fence_fd,
78              void* out_meta, size_t user_metadata_size);
79  int AcquireBuffer(int timeout, DvrReadBuffer** out_read_buffer,
80                    DvrNativeBufferMetadata* out_meta, int* out_fence_fd);
81  int ReleaseBuffer(DvrReadBuffer* read_buffer,
82                    const DvrNativeBufferMetadata* meta, int release_fence_fd);
83  void SetBufferAvailableCallback(
84      DvrReadBufferQueueBufferAvailableCallback callback, void* context);
85  void SetBufferRemovedCallback(
86      DvrReadBufferQueueBufferRemovedCallback callback, void* context);
87  int HandleEvents();
88
89 private:
90  std::shared_ptr<ConsumerQueue> consumer_queue_;
91  std::array<std::unique_ptr<DvrReadBuffer>, BufferHubQueue::kMaxQueueCapacity>
92      read_buffers_;
93};
94
95#endif  // ANDROID_DVR_BUFFER_QUEUE_INTERNAL_H_
96